Итак, у вас есть индексный ключ с двумя или более столбцами. Для таких индексов важен порядок столбцов.
Например: если ключ индекса - (ColA,ColB,ColC)
(CREATE INDEX MyIndexName ON MySchema.Mytable(ColA,ColB,ColC) ...
), тогда SQL Server (по умолчанию) может ' t пропустить первый столбец (ColA
) для поиска во втором столбце (ColB
). Для составных индексов SQL Server может искать по столбцу, если есть предикат равенства (обычно этот шаблон <Column> = <Constant>
, но также прочитайте последний абзац моего ответа) по предыдущим столбцам:
[1] SARGable ‹=> поиск по индексу следующие предикаты (всего несколько примеров)
WHERE ColA=@p1
WHERE ColA<=@p1
WHERE ColA>@p1
WHERE ColA=@p1 AND ColB=@p2
WHERE ColA=@p1 AND ColB=@p2 AND ColC=@p3
WHERE ColA=@p1 AND ColB=@p2 AND ColC<=@p3
WHERE ColA=@p1 AND ColB=@p2 AND ColC>@p3
.. For a complete picture please read SQLMag article from the last paragraph
[2] Следующие предикаты (всего несколько примеров) не поддаются поиску или не поддаются полностью поисковому запросу.
WHERE ColB=@p2
, потому что в предыдущем столбце отсутствует предикат равенства: ColA В этом случае может быть полезен индекс с этим ключом (ColB)
.
WHERE ColA>=@p1 AND ColB=@p2
, потому что в первом столбце нет предиката равенства: ColA. В этом случае может быть полезен индекс с этим ключом (ColB,ColA)
.
WHERE ColA=@p1 AND ColB<=@p2 AND ColC=@p3
, потому что предикат во втором столбце (ColB
) не равен. В этом случае может быть полезен индекс с одним из этих ключей (ColA,ColC,ColB)
или (ColC,ColA,ColB)
.
Подробнее по этой теме (SARGable): ссылка;
Это означает, что если у вас есть индекс с этим ключом (ColA,ColB,ColC)
, тогда эти индексы (ColB)
, (ColB,ColA)
, (ColA,ColC,ColB)
или (ColC,ColA,ColB)
также могут быть полезны.
person
Bogdan Sahlean
schedule
25.07.2013