Улучшение производительности с индексом для row_number по запросу раздела - PullRequest
2 голосов
/ 05 марта 2012

У меня есть запрос в форме:

select a, b, c, d, e, f, g, h,
    row_number () over (partition by a, b order by c, d, e, f) as order
from table;

И это ужасно.

Мы попытались создать 2 индекса: первый для раздела по столбцам (a и b), а второй для порядка по столбцам (c, d, e, f).

Используя план объяснения, мы обнаружили, что индексы не используются. Хотя они полезны для других запросов с предложением group by.

Есть идеи о том, как реорганизовать запрос или заново создать индексы, чтобы они помогли повысить производительность этого запроса?

Заранее спасибо

1 Ответ

1 голос
/ 06 марта 2012

Цитата из моего предыдущего ответа:

Две наиболее распространенные причины запроса, не использующего индексы:

  1. Полное сканирование таблицы выполняется быстрее.
  2. Плохая статистика.

В вашем случае вы выбираете все из таблицы, поэтому я предполагаю, что 1. это основная причина, и в этом случае вы заскочили.

Вы можете попробовать индекс a, b, c, d, e, f, и я не говорю, что сбор статистики не поможет. Если нет, я бы порекомендовал это сделать:

begin

   dbms_stats.gather_table_stats (
   ownname => user, 
   tabname => 'MY_TABLE',
   estimate_percent => 25,
   method_opt => 'FOR ALL INDEXED COLUMNS',
   cascade => TRUE );

end;

Существует также небольшая вероятность того, что ваш стол сильно фрагментирован. Если это так alter table my_table move, а затем собрать статистику.

...