Я раньше думал, что Оракл умный. И сам умеет оптимизировать выполнение запросов. А тут наткнулся на ситуацию, когда простейший
SELECT count(*) FROM однатаблица WHERE поле = 'foo' AND дата_добавления >= SYSDATE-30/1440
выполнялся по 15 минут, пока в запрос явным образом не добавили /*+ INDEX_JOIN(BAZ) */
Что я делаю неправильно?
SELECT count(*) FROM однатаблица WHERE поле = 'foo' AND дата_добавления >= SYSDATE-30/1440
выполнялся по 15 минут, пока в запрос явным образом не добавили /*+ INDEX_JOIN(BAZ) */
Что я делаю неправильно?
no subject
no subject
no subject
я помню плохо, но что-то типа analyze table update statistics.
no subject
no subject
no subject
no subject
Потому что можно влететь ещё больше, чем на фуллскане.
за 5 лет работы ора дба ни разу не использовал INDEX_JOIN
видимо ваш разраб. не сделал индекса (поле,дата_добавления)
Re: за 5 лет работы ора дба ни разу не использовал INDEX_JOIN
без хинта, оракл пошел в таблицу и делал полный скан и его стоимость была меньше, чем в сумме проход обоих индексов, но индексы лежали в кеше, и выполнилось быстрее.
короче покажи
set autotrace on
вариант с хинтом;
вариант без хинта;
и все станет абсолютно ясно.
Re: за 5 лет работы ора дба ни разу не использовал INDEX_JOIN
но что мешало автоматически использовать имеющийся индекс по дате добавления, я не понимаю.
no subject
Cost based принимает решение вида что "нафиг использовать индекс если мы например сейчас выберем 80% всей таблицы - быстрее full scan". Для этого естественно нужна статистика. Посколько ситуации в которых cost based рулит мне всегда казались очень странными я его всегда вырубал.
Если у тебя есть мнение про то как должны бы вполняться запросы переключи его в rule based (на вскидку не помню как это делается)
no subject
no subject
no subject
no subject
Re: за 5 лет работы ора дба ни разу не использовал INDEX_JOIN
select count(*) from user_histograms where tablename = 'ТВОЯТАБЛИЦАИМЯ'
а оракл кстате какой? 10-ка автоматически начала собирать статистику примерно какую надо.
no subject
Re: за 5 лет работы ора дба ни разу не использовал INDEX_JOIN
а dba - индус в худшем смысле этого слова, от него чего-то внятного можно добиться, только рассказав 90% решения :(
no subject
>Посколько ситуации в которых cost based рулит мне всегда казались очень странными я его всегда вырубал.
Это очень упрощенный подход к жизни, в общем оракл обещает rbo выкинуть и хинты тоже отменить, и это правильно.
Re: за 5 лет работы ора дба ни разу не использовал INDEX_JOIN
программер тоже может выполнить типа такого и посмотреть как изменится план.
begin
dbms_stats.gather_table_stats(ownname=>'OPKASSA', tabname=>'DAT_KASSA', estimate_percent=>10, method_opt=>'FOR ALL INDEXED COLUMNS SIZE 250');
end;
no subject
Но подход выкинуть rbo и хинты тоже упрощенный - все равно будут ситуации где человеку лучше знать как провести оптимизацию. Но как я уже говорил мой oracle остановился на версии 8i (который кстати я незнал-незнал и забыл) - возможно у них есть какая-то другая альтернатива для этого, про которую я просто не знаю.
no subject
no subject
select *
from (select * from a where func1(a.f0)>0 and numrows>=0), b
но причина лишь в том что проектировщик слишком полагался на функции, а их стоимость современные субд оценить не могут.
no subject
no subject
select *
from t1,t2
where t1.f0=t2.f0 and t1.f1=0 and t2.f1<0
что сделает mysql ?
no subject
no subject
no subject
Ну и еще оракл позволяет намного более изощеренные варианты и оптимизатор там намного намного сложнее.
вот например
http://www.sql.ru/forum/actualsearch.aspx?search=%CD%E5+%EF%EE%ED%FF%F2%ED%EE%2C+%E2%FB%E1%E8%F0%E0%E5%F2+%EF%EB%E0%ED+%F1+%E1%EE%EB%FC%F8%E5%E9+%F1%F2%EE%E8%EC%EE%F1%F2%FC%FE&sin=0&a=%C6%F3%F0%E0%E2%EB%E5%E2+%C4%E5%ED%E8%F1&ma=0&bid=3&dt=-1&s=1&so=1
оракл лажает на запросах, которые в принципе невозможны в информиксе.
с другой стороны
http://www.sql.ru/forum/actualthread.aspx?bid=3&tid=362323#3689350
оптимизатор оракла строит план очень долго, а информикс за 0.1 сек.
тьфу rownum
писал в этот момент в информиксе запрос к systables и переклинило.
для запроса с rownum оптимизатор не может сделать merge
т.е. переписать к виду:
select *
from a , b
where func1(a.f0)>0
Re: тьфу rownum
Re: тьфу rownum
Т.е. функция тяжеловесна и ее надо выполнить последним предикатом
имеем запрос
select * from a where a.f1=100 and func1(a.f0)>0
какой предикат проверяется сначала, а фиг знает, а все функции по мнению оракла равен 0
есть хинт ordered_predicates но он неудобен, если предикатов >2
я переписываю запрос так numrows>=0
select *
from (select * from a where ... and numrows>=0)
where func1(a.f0)>0
Re: тьфу rownum
no subject
Сам пример хороший аргумент против концепции "ничего кроме rule based не "нужно
no subject
mysql всегда сначала идет в первую (во from) таблицу или как?
no subject
Я на самом деле понял, что если сделать индексы:
t1: f1, f0
t2: f1, f0
то этот запрос можно выполнить очень быстро проходом по 2 индексам сразу.