2016-02-18 7 views
4

Новое для создания индексов в SQL Server. Предположим, у меня есть 3 столбца A, B, C, ни один из которых не является моим основным ключом. Я создаю много запросов с предложениями WHERE, которые содержат любые и все их комбинации. Таким образом, некоторые WHERE статьи могут включать в себя только А, другие А и В, другие В и С, некоторые все три и т.д.Правильное использование нескольких индексов в SQL (SQL Server 2014)

  1. Должен ли я создать индекс для каждой из этих комбинаций?

  2. Если они включают в себя эти колонки как «Включенные столбцы» (как в https://msdn.microsoft.com/en-us/library/ms190806.aspx)

ответ

4

Вы могли бы создать соединение индекс на (A, B, C), но только если ваши запросы всегда используют н лево- большинство столбцов этого показателя, то есть:

  • вы всегда запрос с использованием всех трех столбцов в вашем WHERE пункте
  • или вы используете A и B
  • или использовать только A

Индекс соединения на (A, B, C) будет НЕ работа по запросам:

  • использованием B и C
  • только B
  • только C

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

Но помните: в то время как индекс могущества ускорить ваши запросы, то это будет всегда причина накладных расходов по обслуживанию на INSERT, UPDATE и DELETE (поскольку индекс должен быть синхронизированы с фактическими данными в таблице).

Так меньше показателей лучше - не над-индекса! Это часто хуже, чем отсутствие индексов ...

+0

С благодарностью - так должны ли они быть из тех индексов типа «включенные столбцы»? Кроме того, в вашем примере будет работать запрос на 'A' ​​и' C'? – dashnick

+1

@ dashnick: запрос должен использовать ** n самых левых столбцов ** в определении индекса - самый левый ('A'), 2 самых левых (' A', 'B') или 3 слева ('A',' B', 'C'). Ничто из этого не покрывает A + C - так ** нет **, для A + C этот индекс ** бесполезен **. –

+1

Включенные столбцы великолепны, если вам нужно предоставить еще несколько столбцов из вашего запроса, но включенные столбцы ** не могут использоваться ** в запросе, например. они не могут использоваться в разделе WHERE' –

2

2) Входящие столбцы предназначены только для хранения и возврата данных, они не влияют на скорость фильтра. Тем не менее, вы можете использовать их, чтобы избежать доступа к самой таблице (один меньше индекса поиска). Если вы, например, выбираете столбец F, где A, B отфильтровываются, вы можете создать индекс ((A, B) include (F)), и он будет таким же быстрым, как если бы (A, B) был ПЕРВИЧНЫМ КЛЮЧОМ в таблице. Однако данные F будут удвоены в БД.

1) Все зависит от того, что именно вы делаете, сколько строк в таблице и т. Д. В общем случае, если вы всегда выбираете несколько строк, индексы вам не помогут - они будут игнорироваться, если вы выберете, например, 1000 строк.Причина, заключающаяся в том, что SQL Server после поиска в индексе нуждается в поиске каждой из строк в другом (PRIMARY KEY) индексе отдельно и просто поиск всей таблицы сверху вниз быстрее.

В случае, если SELECT возвращает одну или несколько строк, ответ marc_s применим.

+0

спасибо! На самом деле я бы возвращал много строк, поэтому, я думаю, индексы в конце концов не помогут! – dashnick

+1

@dashnick В этом случае может применяться только индекс с включенными всеми выбранными вами столбцами или изменить индекс CLUSTERED: например. если у вас есть таблица OrderProducts, где есть OrderId и OrderProductId, и вы чаще всего выбираете все товары заказа для одного заказа - вы можете использовать (OrderId, OrderProductId) как PRIMARY KEY. Но учтите, что вам нужно будет поместить OrderId в предложение WHERE даже при выборе только одного продукта заказа OrderProductId (например, WHERE OrderId = oid AND OrderProductId = opid вместо WHERE OrderProductId = opid) для кластерного индекса, чтобы его не игнорировали. –

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