Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Здесь были спецы по хинтам :)  [new]
Grami
Member

Откуда: Москва
Сообщений: 451
Есть табличка some_table (some_id number(20), some_date).
На табличке составной индекс (some_date, some_id)

Как рассказать ораклухе, что бы он вот такой запрос:

 select * 
   from some_table
 where some_date between trunc(sysdate)-4 and trunc(sysdate)-3 
    and some_id in (select some_id from abc)

выполнял как вот такой:

 select * 
   from some_table
 where some_date between trunc(sysdate)-4 and trunc(sysdate)-3 
   and some_id in ( 
         7421,40421,44891,51081,65112,66032,66042,65372,65772,70102,73012,
         73272,58702,629,632,847,659,1300,549,658,852,78012,868913,985713,
         32713,749913,1205713,986713,333313,1624313,1523713,2090713,1850713,
         3255943,3256953)

В скобках перечислены все значения из таблицы abc.
И сейчас время выполнения первого запроса намного больше чем скорость выполнения второго :/
Хотелось что бы примерно совпадали, т.к. таблица some_table ну очень большая :)
11 май 06, 16:23    [2653421]     Ответить | Цитировать Сообщить модератору
 Re: Здесь были спецы по хинтам :)  [new]
SeaGate
Member

Откуда: Новосибирск
Сообщений: 1635
Может поможет:
 select --+ ordered
          a.*
   from abc b,some_table a
 where a.some_date between trunc(sysdate)-4 and trunc(sysdate)-3
    and a.some_id=b.some_id
11 май 06, 16:30    [2653470]     Ответить | Цитировать Сообщить модератору
 Re: Здесь были спецы по хинтам :)  [new]
Takurava
Member

Откуда:
Сообщений: 1776
А планы показать слабо?
11 май 06, 16:31    [2653476]     Ответить | Цитировать Сообщить модератору
 Re: Здесь были спецы по хинтам :)  [new]
raw
Member

Откуда:
Сообщений: 133
Или так:
select * from (
select * 
   from some_table where some_id in (select some_id from abc) and rownum > 0
)
 where some_date between trunc(sysdate)-4 and trunc(sysdate)-3 
11 май 06, 16:33    [2653487]     Ответить | Цитировать Сообщить модератору
 Re: Здесь были спецы по хинтам :)  [new]
Grami
Member

Откуда: Москва
Сообщений: 451
SeaGate
Может поможет:
 select --+ ordered
          a.*
   from abc b,some_table a
 where a.some_date between trunc(sysdate)-4 and trunc(sysdate)-3
    and a.some_id=b.some_id


Не помогло :)

raw
Или так:
select * from (
select * 
   from some_table where some_id in (select some_id from abc) and rownum > 0
)
 where some_date between trunc(sysdate)-4 and trunc(sysdate)-3 


Индекс составной и первой идёт дата!
11 май 06, 16:41    [2653563]     Ответить | Цитировать Сообщить модератору
 Re: Здесь были спецы по хинтам :)  [new]
raw
Member

Откуда:
Сообщений: 133
Takurava
А планы показать слабо?
11 май 06, 16:49    [2653633]     Ответить | Цитировать Сообщить модератору
 Re: Здесь были спецы по хинтам :)  [new]
miksoft
Member

Откуда:
Сообщений: 38555
а так:
select * 
   from some_table
 where some_date between trunc(sysdate)-4 and trunc(sysdate)-3 
    and some_id in (select some_id from abc where rownum>0)
?
11 май 06, 16:49    [2653635]     Ответить | Цитировать Сообщить модератору
 Re: Здесь были спецы по хинтам :)  [new]
Grami
Member

Откуда: Москва
Сообщений: 451
miksoft
а так:
select * 
   from some_table
 where some_date between trunc(sysdate)-4 and trunc(sysdate)-3 
    and some_id in (select some_id from abc where rownum>0)
?


Вау :)
Работает быстрее чем без rownum>0 раза в четыре.
Пасиба.

Ща выложу планы.
11 май 06, 17:01    [2653720]     Ответить | Цитировать Сообщить модератору
 Re: Здесь были спецы по хинтам :)  [new]
Grami
Member

Откуда: Москва
Сообщений: 451
Запрос:
select * 
  from mpk_wh.txn2 t
 where txn_date between trunc(sysdate)-4 and trunc(sysdate)-3 
   and trm_id in (select trm_id from mg.abc a)
План:

Operation	Object Name	Rows	Bytes	Cost	Object Node	In/Out	PStart	PStop

SELECT STATEMENT Optimizer Mode=FIRST_ROWS		1  	 	9  	 	      	             	 
  PX COORDINATOR		  	 	 	 	      	             	 
    PX SEND QC (RANDOM)	SYS.:TQ10002	1  	103  	9  	:Q1002	 P->S 	 QC (RANDOM) 	 
      FILTER		  	 	 	:Q1002	 PCWC 	             	 
        MERGE JOIN		1  	103  	9  	:Q1002	 PCWP 	             	 
          SORT JOIN		18  	234  	7  	:Q1002	 PCWP 	             	 
            BUFFER SORT		  	 	 	:Q1002	 PCWC 	             	 
              PX RECEIVE		35  	455  	5  	:Q1002	 PCWP 	             	 
                PX SEND HASH	SYS.:TQ10000	35  	455  	5  	 	 S->P 	 HASH        	 
                  SORT UNIQUE		35  	455  	5  	 	      	             	 
                    TABLE ACCESS FULL	MG.ABC	35  	455  	5  	 	      	             	 
          SORT JOIN		1  	100  	2  	:Q1002	 PCWP 	             	 
            PX RECEIVE		1  	100  	1  	:Q1002	 PCWP 	             	 
              PX SEND HASH	SYS.:TQ10001	1  	100  	1  	:Q1001	 P->P 	 HASH        	 
                PX PARTITION RANGE ITERATOR		1  	100  	1  	:Q1001	 PCWC 	            KEY	KEY
                  TABLE ACCESS BY LOCAL INDEX ROWID	MPK_WH.TXN2	1  	100  	1  	:Q1001	 PCWP 	            KEY	KEY
                    INDEX RANGE SCAN	MPK_WH.TXN2_DATE	1  	 	1  	:Q1001	 PCWP 	            KEY	KEY

Запрос:

select * 
  from mpk_wh.txn2 t
 where txn_date between trunc(sysdate)-4 and trunc(sysdate)-3 
   and trm_id in (select trm_id from mg.abc a where rownum>0)

План:

Operation	Object Name	Rows	Bytes	Cost	Object Node	In/Out	PStart	PStop

SELECT STATEMENT Optimizer Mode=FIRST_ROWS		1  	 	2  	 	      	             	 
  PX COORDINATOR		  	 	 	 	      	             	 
    PX SEND QC (RANDOM)	SYS.:TQ10000	1  	100  	1  	:Q1000	 P->S 	 QC (RANDOM) 	 
      FILTER		  	 	 	:Q1000	 PCWC 	             	 
        PX PARTITION RANGE ITERATOR		1  	100  	1  	:Q1000	 PCWC 	            KEY	KEY
          TABLE ACCESS BY LOCAL INDEX ROWID	MPK_WH.TXN2	1  	100  	1  	:Q1000	 PCWP 	            KEY	KEY
            INDEX RANGE SCAN	MPK_WH.TXN2_DATE	1  	 	1  	:Q1000	 PCWP 	            KEY	KEY
              FILTER		  	 	 	:Q1000	 PCWP 	             	 
                COUNT		  	 	 	:Q1000	 PCWP 	             	 
                  FILTER		  	 	 	:Q1000	 PCWP 	             	 
                    TABLE ACCESS FULL	MG.ABC	35  	455  	2  	:Q1000	 PCWP 	             	 

А хинтами этого никак нельзя добиться?
Просто конечный запрос несколько более сложный и там таблица abc используется джоином а не вложенным запросом, а хотелось бы именног такого эффекта (перестроить сам запрос сложнее :) )

select ... from some_table t, abc a  .... where t.some_id = a.some_id and some_date between ....
11 май 06, 17:12    [2653824]     Ответить | Цитировать Сообщить модератору
 Re: Здесь были спецы по хинтам :)  [new]
raw
Member

Откуда:
Сообщений: 133
с join может помочь ordered и/или no_merge:
select /*+ ordered */ ... 
from abc a, some_table t,   .... 
where t.some_id = a.some_id and some_date between ....
inline view:
select ... 
from some_table t, (select /*+ no_merge */ * from abc) a  .... 
where t.some_id = a.some_id and some_date between ....
11 май 06, 17:34    [2653976]     Ответить | Цитировать Сообщить модератору
 Re: Здесь были спецы по хинтам :)  [new]
miksoft
Member

Откуда:
Сообщений: 38555
Grami
Просто конечный запрос несколько более сложный и там таблица abc используется джоином а не вложенным запросом, а хотелось бы именног такого эффекта (перестроить сам запрос сложнее :) )

select ... from some_table t, (select some_id from abc where rownum>0) a  .... where t.some_id = a.some_id and some_date between ....
или
with abc as (select some_id from abc where rownum>0) select ... from some_table t, abc a, abc b  .... where t.some_id = a.some_id and some_date between ....
второй вариант не пробовал, но, думаю, получится
11 май 06, 17:41    [2654023]     Ответить | Цитировать Сообщить модератору
 Re: Здесь были спецы по хинтам :)  [new]
A. S.
Member

Откуда: Донецк
Сообщений: 320
а если просто сказать /*+ index(t индекс)*/ ?
11 май 06, 18:08    [2654196]     Ответить | Цитировать Сообщить модератору
 Re: Здесь были спецы по хинтам :)  [new]
Grami
Member

Откуда: Москва
Сообщений: 451
miksoft
Grami
Просто конечный запрос несколько более сложный и там таблица abc используется джоином а не вложенным запросом, а хотелось бы именног такого эффекта (перестроить сам запрос сложнее :) )

select ... from some_table t, (select some_id from abc where rownum>0) a  .... where t.some_id = a.some_id and some_date between ....
или
with abc as (select some_id from abc where rownum>0) select ... from some_table t, abc a, abc b  .... where t.some_id = a.some_id and some_date between ....
второй вариант не пробовал, но, думаю, получится


Ок.
Будем запрос переделывать.
11 май 06, 18:09    [2654202]     Ответить | Цитировать Сообщить модератору
 Re: Здесь были спецы по хинтам :)  [new]
Grami
Member

Откуда: Москва
Сообщений: 451
A. S.
а если просто сказать /*+ index(t индекс)*/ ?


Пробовал, конечно. Не тот результат - юзает только первую часть индекса - дату, а some_id - не юзает.
11 май 06, 18:10    [2654213]     Ответить | Цитировать Сообщить модератору
 Re: Здесь были спецы по хинтам :)  [new]
Ненавижу регистрацию
Member

Откуда:
Сообщений: 260
Grami
Есть табличка some_table (some_id number(20), some_date).
На табличке составной индекс (some_date, some_id)

Как рассказать ораклухе, что бы он вот такой запрос:

 select * 
   from some_table
 where some_date between trunc(sysdate)-4 and trunc(sysdate)-3 
    and some_id in (select some_id from abc)

выполнял как вот такой:

 select * 
   from some_table
 where some_date between trunc(sysdate)-4 and trunc(sysdate)-3 
   and some_id in ( 
         7421,40421,44891,51081,65112,66032,66042,65372,65772,70102,73012,
         73272,58702,629,632,847,659,1300,549,658,852,78012,868913,985713,
         32713,749913,1205713,986713,333313,1624313,1523713,2090713,1850713,
         3255943,3256953)

В скобках перечислены все значения из таблицы abc.
И сейчас время выполнения первого запроса намного больше чем скорость выполнения второго :/
Хотелось что бы примерно совпадали, т.к. таблица some_table ну очень большая :)

Можно:
 select * 
   from some_table
 where some_date between trunc(sysdate)-4 and trunc(sysdate)-3 
    and exists (select * from abc where abc.some_id = some_table.some_id)
11 май 06, 20:05    [2654646]     Ответить | Цитировать Сообщить модератору
 Re: Здесь были спецы по хинтам :)  [new]
Октябренок
Guest
Ненавижу регистрацию
Можно:
 select * 
   from some_table
 where some_date between trunc(sysdate)-4 and trunc(sysdate)-3 
    and exists (select * from abc where abc.some_id = some_table.some_id)
И вас тоже умоляю, не нужно без нужды звездочек...
11 май 06, 20:20    [2654674]     Ответить | Цитировать Сообщить модератору
 Re: Здесь были спецы по хинтам :)  [new]
Proteus
Member

Откуда:
Сообщений: 1348
Октябренок

И вас тоже умоляю, не нужно без нужды звездочек...

в исходном примере звезда
Если их зажигают значит это комуто нужно (с) ктото
11 май 06, 20:38    [2654713]     Ответить | Цитировать Сообщить модератору
 Re: Здесь были спецы по хинтам :)  [new]
Ненавижу регистрацию
Member

Откуда:
Сообщений: 260
Октябренок
Ненавижу регистрацию
Можно:
 select * 
   from some_table
 where some_date between trunc(sysdate)-4 and trunc(sysdate)-3 
    and exists (select * from abc where abc.some_id = some_table.some_id)
И вас тоже умоляю, не нужно без нужды звездочек...

Отбросьте предрассудки;)
11 май 06, 21:23    [2654794]     Ответить | Цитировать Сообщить модератору
 Re: Здесь были спецы по хинтам :)  [new]
guest77
Guest
Октябренок
Ненавижу регистрацию
Можно:
 select * 
   from some_table
 where some_date between trunc(sysdate)-4 and trunc(sysdate)-3 
    and exists (select * from abc where abc.some_id = some_table.some_id)
И вас тоже умоляю, не нужно без нужды звездочек...

А что у вас господа за проблемы со звездочками? Уже второя тема где есть такие просьбы за последние время. Звездочка как звездочка :)
12 май 06, 08:26    [2655537]     Ответить | Цитировать Сообщить модератору
 Re: Здесь были спецы по хинтам :)  [new]
Slawa_A
Member

Откуда:
Сообщений: 18
Grami
Есть табличка some_table (some_id number(20), some_date).
На табличке составной индекс (some_date, some_id)

Как рассказать ораклухе, что бы он вот такой запрос:

 select * 
   from some_table
 where some_date between trunc(sysdate)-4 and trunc(sysdate)-3 
    and some_id in (select some_id from abc)

выполнял как вот такой:

 select * 
   from some_table
 where some_date between trunc(sysdate)-4 and trunc(sysdate)-3 
   and some_id in ( 
         7421,40421,44891,51081,65112,66032,66042,65372,65772,70102,73012,
         73272,58702,629,632,847,659,1300,549,658,852,78012,868913,985713,
         32713,749913,1205713,986713,333313,1624313,1523713,2090713,1850713,
         3255943,3256953)

В скобках перечислены все значения из таблицы abc.
И сейчас время выполнения первого запроса намного больше чем скорость выполнения второго :/
Хотелось что бы примерно совпадали, т.к. таблица some_table ну очень большая :)


Рекомедую попробывать /*+ PUSH_SUBQ*/ , онпреобразует запрос так, как вы хотите. Еще рекомедую немного изменить конструкцию:
 select /*+ PUSH_SUBQ*/ * 
   from some_table,
          (select some_id from abc) a
 where some_date between trunc(sysdate)-4 and trunc(sysdate)-3 
    and some_id = a.some_id 
12 май 06, 09:19    [2655662]     Ответить | Цитировать Сообщить модератору
 Re: Здесь были спецы по хинтам :)  [new]
Grami
Member

Откуда: Москва
Сообщений: 451
Ненавижу регистрацию
Grami
Есть табличка some_table (some_id number(20), some_date).
На табличке составной индекс (some_date, some_id)

Как рассказать ораклухе, что бы он вот такой запрос:

 select * 
   from some_table
 where some_date between trunc(sysdate)-4 and trunc(sysdate)-3 
    and some_id in (select some_id from abc)

выполнял как вот такой:

 select * 
   from some_table
 where some_date between trunc(sysdate)-4 and trunc(sysdate)-3 
   and some_id in ( 
         7421,40421,44891,51081,65112,66032,66042,65372,65772,70102,73012,
         73272,58702,629,632,847,659,1300,549,658,852,78012,868913,985713,
         32713,749913,1205713,986713,333313,1624313,1523713,2090713,1850713,
         3255943,3256953)

В скобках перечислены все значения из таблицы abc.
И сейчас время выполнения первого запроса намного больше чем скорость выполнения второго :/
Хотелось что бы примерно совпадали, т.к. таблица some_table ну очень большая :)

Можно:
 select * 
   from some_table
 where some_date between trunc(sysdate)-4 and trunc(sysdate)-3 
    and exists (select * from abc where abc.some_id = some_table.some_id)


В плане сначала происходит range scan по индексу а потом hash join с таблицей abc :/
Т.е. some_id не учавствует в range scan.
Это подтверждается временем выполнения - я его не дождался (хотя запрос с константами выполняется максимум 5 секунд).


Slawa_A
Grami
Есть табличка some_table (some_id number(20), some_date).
На табличке составной индекс (some_date, some_id)

Как рассказать ораклухе, что бы он вот такой запрос:

 select * 
   from some_table
 where some_date between trunc(sysdate)-4 and trunc(sysdate)-3 
    and some_id in (select some_id from abc)

выполнял как вот такой:

 select * 
   from some_table
 where some_date between trunc(sysdate)-4 and trunc(sysdate)-3 
   and some_id in ( 
         7421,40421,44891,51081,65112,66032,66042,65372,65772,70102,73012,
         73272,58702,629,632,847,659,1300,549,658,852,78012,868913,985713,
         32713,749913,1205713,986713,333313,1624313,1523713,2090713,1850713,
         3255943,3256953)

В скобках перечислены все значения из таблицы abc.
И сейчас время выполнения первого запроса намного больше чем скорость выполнения второго :/
Хотелось что бы примерно совпадали, т.к. таблица some_table ну очень большая :)


Рекомедую попробывать /*+ PUSH_SUBQ*/ , онпреобразует запрос так, как вы хотите. Еще рекомедую немного изменить конструкцию:
 select /*+ PUSH_SUBQ*/ * 
   from some_table,
          (select some_id from abc) a
 where some_date between trunc(sysdate)-4 and trunc(sysdate)-3 
    and some_id = a.some_id 


Тоже самое и здесь.
Ближе всего к желаемому плану это вариант с rownum > 0.
Здесь происходит range scan по индексу и результат скана сразу фильтруется по результату селекта из abc.
НО!!! Запрос не выполняется так же быстро как и запрос с константами!
Время селекта из abc мало (там 30 - 50 записей).
У кого-нибудь есть ещё варианты? Или спросить у Тома? :)
12 май 06, 10:26    [2655945]     Ответить | Цитировать Сообщить модератору
 Re: Здесь были спецы по хинтам :)  [new]
Владимор Конев
Member

Откуда:
Сообщений: 3451
Slawa_A
Рекомедую попробывать /*+ PUSH_SUBQ*/ , онпреобразует запрос так, как вы хотите. Еще рекомедую немного изменить конструкцию:
 select /*+ PUSH_SUBQ*/ * 
   from some_table,
          (select some_id from abc) a
 where some_date between trunc(sysdate)-4 and trunc(sysdate)-3 
    and some_id = a.some_id 
Чувствую, ты не совсем правильно понимаешь назначение этого хинта :)
Он нужен немного для других целей. А именно - для проталкивания подзапроса во внутрь представления.
12 май 06, 10:33    [2655987]     Ответить | Цитировать Сообщить модератору
 Re: Здесь были спецы по хинтам :)  [new]
Grami
Member

Откуда: Москва
Сообщений: 451
Владимор Конев
Slawa_A
Рекомедую попробывать /*+ PUSH_SUBQ*/ , онпреобразует запрос так, как вы хотите. Еще рекомедую немного изменить конструкцию:
 select /*+ PUSH_SUBQ*/ * 
   from some_table,
          (select some_id from abc) a
 where some_date between trunc(sysdate)-4 and trunc(sysdate)-3 
    and some_id = a.some_id 
Чувствую, ты не совсем правильно понимаешь назначение этого хинта :)
Он нужен немного для других целей. А именно - для проталкивания подзапроса во внутрь представления.


А rownum нужен, что бы узнать номер строки запроса. Однако ж с rownum>0 план строится другой и запрос выполняется немного быстрее. В каждой системе свои приколы.

Ни у кого никаких идей? А?
12 май 06, 10:44    [2656046]     Ответить | Цитировать Сообщить модератору
 Re: Здесь были спецы по хинтам :)  [new]
givanov
Member

Откуда:
Сообщений: 757
Есть у меня впечатление, что Вам нужен спец по сбору статистики.
12 май 06, 11:02    [2656134]     Ответить | Цитировать Сообщить модератору
 Re: Здесь были спецы по хинтам :)  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18399
givanov
Есть у меня впечатление, что Вам нужен спец по сбору статистики.

Ага. И шаман впридачу :)
12 май 06, 11:03    [2656144]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Oracle Ответить