Я раньше думал, что Оракл умный. И сам умеет оптимизировать выполнение запросов. А тут наткнулся на ситуацию, когда простейший
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
no subject
Потому что можно влететь ещё больше, чем на фуллскане.
no subject
no subject
no subject
no subject
no subject
Cost based принимает решение вида что "нафиг использовать индекс если мы например сейчас выберем 80% всей таблицы - быстрее full scan". Для этого естественно нужна статистика. Посколько ситуации в которых cost based рулит мне всегда казались очень странными я его всегда вырубал.
Если у тебя есть мнение про то как должны бы вполняться запросы переключи его в rule based (на вскидку не помню как это делается)
no subject
>Посколько ситуации в которых cost based рулит мне всегда казались очень странными я его всегда вырубал.
Это очень упрощенный подход к жизни, в общем оракл обещает rbo выкинуть и хинты тоже отменить, и это правильно.
no subject
Но подход выкинуть rbo и хинты тоже упрощенный - все равно будут ситуации где человеку лучше знать как провести оптимизацию. Но как я уже говорил мой oracle остановился на версии 8i (который кстати я незнал-незнал и забыл) - возможно у них есть какая-то другая альтернатива для этого, про которую я просто не знаю.
no subject
no subject
no subject
select *
from t1,t2
where t1.f0=t2.f0 and t1.f1=0 and t2.f1<0
что сделает mysql ?
no subject
Сам пример хороший аргумент против концепции "ничего кроме rule based не "нужно
no subject
mysql всегда сначала идет в первую (во from) таблицу или как?
no subject
Я на самом деле понял, что если сделать индексы:
t1: f1, f0
t2: f1, f0
то этот запрос можно выполнить очень быстро проходом по 2 индексам сразу.
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 сек.
no subject
select *
from (select * from a where func1(a.f0)>0 and numrows>=0), b
но причина лишь в том что проектировщик слишком полагался на функции, а их стоимость современные субд оценить не могут.
no subject
тьфу 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
за 5 лет работы ора дба ни разу не использовал INDEX_JOIN
видимо ваш разраб. не сделал индекса (поле,дата_добавления)
Re: за 5 лет работы ора дба ни разу не использовал INDEX_JOIN
без хинта, оракл пошел в таблицу и делал полный скан и его стоимость была меньше, чем в сумме проход обоих индексов, но индексы лежали в кеше, и выполнилось быстрее.
короче покажи
set autotrace on
вариант с хинтом;
вариант без хинта;
и все станет абсолютно ясно.
Re: за 5 лет работы ора дба ни разу не использовал INDEX_JOIN
но что мешало автоматически использовать имеющийся индекс по дате добавления, я не понимаю.
Re: за 5 лет работы ора дба ни разу не использовал INDEX_JOIN
select count(*) from user_histograms where tablename = 'ТВОЯТАБЛИЦАИМЯ'
а оракл кстате какой? 10-ка автоматически начала собирать статистику примерно какую надо.
Re: за 5 лет работы ора дба ни разу не использовал INDEX_JOIN
а dba - индус в худшем смысле этого слова, от него чего-то внятного можно добиться, только рассказав 90% решения :(
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;