Как избежать использования группы по SQL ORACLE - PullRequest
0 голосов
/ 06 октября 2019

Если я включу предложение group by в оператор SQL, мой индекс не будет работать. Вот код:

Ответы [ 2 ]

2 голосов
/ 06 октября 2019

Предложение GROUP BY не запрещает доступ к индексу. Индексы не используются, потому что в таблице нет фильтрации. Без какого-либо предложения WHERE вся таблица должна быть прочитана, поэтому нет смысла использовать индекс. (Индексы быстрее извлекают небольшой процент строк из таблицы, но полное сканирование таблиц быстрее извлекает большой процент строк.)

Индекс покрытия может помочь. Если вы строите индекс, который содержит все столбцы, используемые в операторе, Oracle может читать из этого индекса, как будто это тощая версия таблицы.

Например:

create index purchage_idx on purchase(purchaseno, servicetype, paymenttype, gst);
1 голос
/ 06 октября 2019

Если вы действительно хотите принудительно использовать индекс, в этом случае вы можете использовать индекс на основе функций. Например, если мы перейдем к dbfiddle.uk , настроим таблицу и запустим EXPLAIN PLAN для вашего первого запроса, мы получим:

OPERATION         OPTIONS   OBJECT_NAME  OBJECT_TYPE  OPTIMIZER
SELECT STATEMENT                                      ALL ROWS
FILTER            
HASH              GROUP BY  
TABLE ACCESS      FULL      PURCHASE     TABLE

Теперь мы добавляем функцию на основе функцииindex:

CREATE INDEX IX_PURCHASE_1 ON PURCHASE(SUBSTR(RECEIPTNO,1,3))

, затем запустите другой EXPLAIN PLAN, и вот что мы получаем:

OPERATION         OPTIONS          OBJECT_NAME    OBJECT_TYPE  OPTIMIZER
SELECT STATEMENT                                               ALL ROWS
FILTER            
SORT              GROUP BY NOSORT
INDEX             FULL SCAN        IX_PURCHASE_1  INDEX        ANALYZED

Таким образом, вы можете стимулировать использование индекса здесь, создав соответствующий индекс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...