Oracle Composite Index Performancemace - PullRequest
       41

Oracle Composite Index Performancemace

2 голосов
/ 20 марта 2019

Моя примерная структура запроса Oracle:

SELECT <LIST_OF_COLUMNS> FROM <TABLE_NAME>
WHERE COLUMN_01 = <SOMETHING> AND COLUMN_02 = <SOMETHING> AND COLUMN_03 = <SOMETHING>

Таблица содержит более 1 миллиона записей.Я проиндексировал COLUMN_01, COLUMN_02 и COLUMN_03 отдельно.Приведенный выше запрос работает нормально и дает ожидаемые результаты.

Если я сделаю COLUMN_01, COLUMN_02 и COLUMN_03 (все столбцы в предложении WHERE) в качестве составного индекса без изменения существующих индексов, это улучшит производительность?Если да, есть ли порядок для столбцов составного индекса?

Если я использую OR вместо AND, как этот запрос, улучшит ли это производительность?

SELECT <LIST_OF_COLUMNS> FROM <TABLE_NAME>
WHERE COLUMN_01 = <SOMETHING> OR COLUMN_02 = <SOMETHING> OR COLUMN_03 = <SOMETHING>

Ответы [ 3 ]

1 голос
/ 20 марта 2019
  1. Если вы создаете составной индекс на основе трех столбцов И Вы никогда не запрашиваете таблицу, используя только один столбец в WHERE предложение, вам не нужны индексы одного столбца. В противном случае это зависит от того, какие столбцы участвуют в запросе. И этот случай должен быть хорошо проанализирован и протестирован.

  2. Порядок столбцов в составном индексе имеет значение . Столбцы должны быть упорядочены по уникальности, где наименее различимый столбец идет первым. Это помогает сократить количество строк, соответствующих предикату запроса, и, таким образом, повысить производительность.
    Следует также отметить, что Oracle может использовать составной индекс с запросами, которые не содержат все столбцы индекса в своих предикатах.

Например :

create index idx1 on table_name (col1, col2, col3);

/*In this query Oracle can use index idx1 as a standard one-column index, 
  because col1 is the first column in the index*/
select * from table_name where col1 = 'some_value';

/*Here Oracle can still use the composite index, 
  but in this case it will use INDEX SKIP SCAN (assuming col1 equals ANY value),
  which reduces query performance comparing to an ordinary index*/
select * from table_name where col2 = 'some_value1' and col3 = 'some_value2';
  1. OR или AND здесь не имеют большого значения. Что важнее - это количество строк, соответствующих данному предикату .
1 голос
/ 20 марта 2019

Если я сделаю COLUMN_01, COLUMN_02 и COLUMN_03 (все столбцы в предложении WHERE) в качестве составного индекса без изменения существующих индексов, это улучшит производительность?

Для этого запроса: вероятно. Для INSERT / UPDATE / DELETE: производительность ухудшится.

Так что вам нужно измерить и посмотреть, оправдывает ли улучшение в одних запросах ухудшение в других.

Если так, есть ли порядок для столбцов составного индекса?

Не для этого запроса. Если вы префикс-сжимаете индекс, вы можете выбрать порядок, который сжимает лучше всего, в противном случае это не должно иметь большого значения.

Однако могут существовать другие запросы, которые используют только некоторые из проиндексированных столбцов, и в этом случае вы должны убедиться, что фактически используемые столбцы находятся на переднем крае индекса.

Если я использую ИЛИ вместо И, как этот запрос, это улучшит производительность?

Нет. Отдельные индексы (которые у вас уже есть) - это то, что нужно в этом случае.

1 голос
/ 20 марта 2019

Если я сделаю COLUMN_01, COLUMN_02 и COLUMN_03 (все столбцы в предложении WHERE) в качестве составного индекса без изменения существующих индексов, это улучшит производительность?

Возможно.Один индекс, который удовлетворяет всем критериям WHERE, служит полным путем доступа и, следовательно, является более эффективным, чем путь доступа с одним столбцом индекса.Оптимизатор выбирает один индекс, поэтому он будет индексировать чтение всех строк, соответствующих, скажем, критерию COLUMN_02, и отфильтровать эти строки, используя критерии других столбцов.

Цена, которую вы платите за это улучшение производительности, - это накладные расходыподдержание дополнительного индекса.Поэтому вам следует подумать, нужны ли вам все три индекса по одному столбцу (для других запросов).

есть ли порядок для столбцов составного индекса?

Да.Разместите их в порядке возрастания различных значений.Столбец ведущего индекса должен быть наименее различающим столбцом.Наличие уникального ключа в качестве ведущего столбца, вероятно, является катастрофой, хотя существуют крайние случаи, поэтому обязательно проведите эталонный тест.

Если я использую ИЛИ вместо И, как в этом запросе, это улучшит производительность?

Вы будете возвращать больше строк, что само по себе является дополнительной работой.В такой ситуации также сложно использовать индексы, поэтому, скорее всего, вы столкнулись с полным сканированием таблицы.Но почему бы не попробовать и посмотреть, что происходит?

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