Как улучшить производительность отдельных запросов в таблице записей 10M +? - PullRequest
1 голос
/ 03 июля 2019

У меня есть таблица с более чем 10 миллионами строк, и я использую простые запросы с переменными связывания (в моем случае я не могу искать по идентификатору первичного ключа).

Таблица выглядит так:

Col1   Col2   Col3   Col4   Col5   Col6

и запросы похожи на

select distinct col1  
from table ;

select distinct col2 
where col1 = :bind ;

select distinct col3 
where col1 = :bind1 and col2 = :bind2 ;
.
.

select distinct col6 
where col1 = :bind1 and col2 = :bind2 and col3 = :bind3
  and col4 = :bind4 and col5 = :bind5 

Результаты всех этих запросов невелики - менее 100 записей в MAX - но производительность слишком низкая.

Как это улучшить?

Ответы [ 2 ]

2 голосов
/ 03 июля 2019

Вы можете добавить индекс на (col1, col2, col3, col4, col5).Это можно использовать для всех запросов:

create index idx_t_5 on t(col1, col2, col3, col4, col5);

Если это невозможно, и столбцы имеют одинаковый тип, то вы можете использовать боковое соединение в Oracle 12c +, чтобы объединить это в один запрос:

select distinct which, col
from t cross apply
     (select 'col1' as which, t.col1 as col from dual union all
      select 'col2', t.col2 from dual where t.col2 = :bind2 union all
      . . .
     ) t
where col1 = :bind1;

Это отсканирует таблицу только один раз, что приведет к повышению производительности.

0 голосов
/ 14 июля 2019

В общем, построить индекс следующим образом:

  1. Включите все столбцы WHERE, которые проверены на постоянную с =. (Все ваши примеры соответствуют этому критерию.) Столбцы могут быть в любом порядке.
  2. (Это оптимально.) Включите элементы SELECT в конце INDEX любого заказа. Это делает индекс «покрывающим» (если он не является более сложным, чем описано).
  3. Обратите внимание, что дополнительные столбцы на конце являются небольшим бременем, но не вредят.

«Составной» INDEX(col1, col2, col3, col4, col5, col6) соответствует обоим этим «правилам». Если у вас есть SELECT, это немного отличается, покажите его нам; возможно, мы сможем помочь вам создать еще один индекс для него.

...