2010-02-05 3 views
4

Я использую SQL 2000, и я запускаю простой оператор select в таблице, содержащей около 30 миллионов строк. Выберите запрос выглядит следующим образом:Оптимизировать выбор запроса

select col1, col2, col3 from Table1 where [email protected] and [email protected] and [email protected] 

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

Как я могу оптимизировать этот запрос?

Если я добавляю индексы для каждого столбца в предложении where, это имеет значение?

Если у меня есть 10 столбцов в разделе where, должны ли все из этих 10 столбцов иметь индекс в них?

Edit: Это, вероятно, одна из наиболее распространенных интервью вопрос :)

ответ

5

Да, это будет иметь огромное значение.

Вместо добавления одного индекса для каждого поля вы должны добавить один индекс, который содержит три поля. (Как это обычно используется на практике, зависит от того, насколько уникальны поля и какие другие запросы вы собираетесь использовать в таблице.)

Обратите внимание, что добавление индекса также имеет небольшое отрицательное влияние при вставке или удалении записывает в таблицу или обновляет индексированные поля записи.

+0

Index работает как волшебство !! Спасибо .... но просто любопытно, есть ли другие способы, которые мы можем использовать, чтобы сделать такой запрос быстрее? – Bhaskar

+0

@Bhaskar: Да, вы можете пойти дальше. Проанализируйте план выполнения, чтобы узнать, что он занимает больше всего времени. Самый эффективный индекс зависит от того, какие данные содержит таблица и насколько она изменяется. Если у вас много вложений/обновлений/удалений в таблице, вы должны проверить фрагментацию индекса и указать коэффициент заполнения, если индекс имеет тенденцию к фрагментации. – Guffa

2

Если добавить индексы для каждого столбца в где положение, было бы это сделать любой разницу?

Да, добавление индекса приведет к огромной разнице в производительности. Это связано с значительным использованием дискового пространства по индексам и очень незначительным воздействием на команды INSERT и UPDATE.

Если у меня есть 10 столбцов в предложении где, должны все из этих 10 колонн имеют индекс в них?

Это не всегда так. Если мы возьмем SQL-запрос, представленный вами в качестве примера, и вы создадите индекс только для col4, возможно, что select * from Table1 where [email protected] возвращает только несколько записей. В этом случае вы вряд ли выиграете от индекса на col5 и col6, потому что движок базы данных должен будет сканировать только те немногие записи, которые были возвращены там, где [email protected].

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

2

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

4

Как я могу оптимизировать этот запрос?

Вы можете сделать индекс покрытия:

CREATE INDEX ix_table1_456__123 ON table1 (col4, col5, col6) INCLUDE (col1, col2, col3) 

и запрос не будет даже делать табличный.

Если я добавляю индексы для каждого столбца в предложении where, это имеет значение?

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

Однако, если каждый из ваших столбцов имеет высокую мощность (то есть UNIQUE или рядом с ним), то создание отдельных индексов может даже улучшить запрос по сравнению с составным индексом.

Это особенно верно, если некоторые из колонок имеют большой размер (например, VARCHAR(400)), а другая, небольшая колонка имеет высокую мощность.

Если у меня есть 10 столбцов в where where, должны ли все из этих 10 столбцов иметь индекс в них?

Если у вас есть 10 колонки, там, как я уже говорил выше, компромисс между увеличением размера ключа (что снижает производительность) и повышенной селективностью.

Если, скажем, первые 3 столбцы уникальны или почти уникальны, то добавление дополнительных столбцов не будет увеличивать селективность, но увеличит размер ключа.

Индекс станет больше по размеру, что потребует дополнительного времени для поиска в нем.

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

Вы можете прочитать эту статью в своем блоге:

+0

Индекс работает как магия !! Спасибо .... но просто любопытно, есть ли другие способы, которые мы можем использовать, чтобы сделать такой запрос быстрее? – Bhaskar

Смежные вопросы