Преимущественно ли составной индекс из 4 столбцов для запроса из 3 столбцов? - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть таблица с колонками A, B, C, D, E, ..., N. с PK(A). У меня также есть составной, уникальный, некластеризованный индекс, определенный для столбцов D, C, B, A, в этом порядке.

Если я использую запрос вроде:

where D = 'a' and C = 'b' and B = 'c'

без пункта A, могу ли я по-прежнему пользоваться преимуществами индекса?

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

Да, он все равно будет правильно использовать индекс и сделает ваш запрос более эффективным.

Думайте об этом, как о вложенном оглавлении в учебнике:

  • Просматривайте, пока не увидите название главы (например, «Структуры данных»)
    • Просматривайте, пока не увидите название соответствующего раздела («Двоичные деревья»)
      • Просматривайте, пока не увидитесоответствующая тема (например, «Кучи»).

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

Теперь ... если вы хотите найти двоичные деревья и не знаете, что они являются структурой данных, то это оглавление не будет очень полезным длявы (например, если вы пропустили "D").

0 голосов
/ 10 сентября 2018

Да, SQL-сервер может выполнить операцию поиска по индексу (D, C, B, A) для следующих запросов:

WHERE D = 'd'
WHERE D = 'd' AND C = 'c'
WHERE D = 'd' AND C = 'c' AND B = 'b'
WHERE D = 'd' AND C = 'c' AND B = 'b' AND A = 'a'

И он может выполнить операцию сканирования указанного индекса для этих:

WHERE C = 'c' AND B = 'b'
WHERE A = 'a'
-- etc

Но нужно учитывать еще одну вещь: порядок столбцов внутри индексов имеет значение. Два индекса (D, C, B, A) и (B, C, D, A) могут работать по-разному. Рассмотрим следующий пример:

WHERE Active = 1 AND Type = 2 AND Date = '2019-09-10'

Если предположить, что данные содержат два различных значения для Active, 10 для Type и 1000 для Date, индекс для (Date, Type, Active, Other) будет более эффективным, чем (Active, Type, Date, Other).

Вы также можете рассмотреть возможность создания разных вариаций указанного индекса для разных запросов.

PS: если столбец A не используется внутри предложения WHERE, тогда вы можете просто INCLUDE it.

0 голосов
/ 10 сентября 2018

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

Кроме того:

  1. SQL будет иметь лучшую статистику (SQLавтоматически создаст статистику для набора столбцов, составляющих индекс), сколько строк может удовлетворить ваш запрос
  2. Тот факт, что это УНИКАЛЬНО, также скажет SQL о данных, что может привести клучший план (например, если вы выполните DISTINCT или UNION, он будет знать, что эти столбцы уже различны).
  3. SQL придется читать меньше данных, поскольку вместо того, чтобы читать все столбцы "N" (дажехотя вам нужно только 3), он может прочитать индекс, который будет иметь 4, поэтому только один будет «лишним».

Обратите внимание, что, поскольку конкретный рассматриваемый запрос - это WHERE на D, Cи B, в этом случае порядок индекса не будет иметь значения.Если предложение WHERE относится только к C и B, вы получите гораздо меньше преимуществ, поскольку SQL больше не сможет выполнять поиск по D, а приведенные выше пункты (1) и (2) не будут применяться.(3) все же, все же.

...