Я раньше думал, что Оракл умный. И сам умеет оптимизировать выполнение запросов. А тут наткнулся на ситуацию, когда простейший
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) */
Что я делаю неправильно?
за 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;