Как правильно создать индекс - PullRequest
2 голосов
/ 06 марта 2009

У меня есть следующая очень большая таблица в SQL Server 2005:

create table Blah 
(
  FirstName varchar(30),
  Rank int,
  Position int,
  ...
)

Я выполню следующий запрос:

declare @PassedInFirstName varchar(30)
set @PassedInFirstName = 'SomeName'

select TOP 1 Position
from Blah
where FirstName = @PassedInFirstName
order by Rank DESC

Я настраиваю следующий индекс:

CREATE INDEX IX_Blah ON Blah (FirstName, Rank)

Учитывая, что я упорядочиваю его по рангу DESC, я должен изменить индекс на упорядоченный ранг по убыванию:

CREATE INDEX IX_Blah ON Blah (FirstName ASC, Rank DESC)

Или это не имеет значения?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 06 марта 2009

Если должно быть полезно, если ГДЕ возвращает много строк.

Я видел результаты, в которых логический IO был уменьшен на 50% благодаря использованию DESC в INDEX для соответствия ORDER BY

Также измените запрос на покрытие:

SQL 2005 +:

CREATE INDEX IX_Blah ON Blah (FirstName, Rank DESC) INCLUDE (Position)

SQL 2000, SQL 7:

CREATE INDEX IX_Blah ON Blah (FirstName, Rank DESC, Position)
2 голосов
/ 06 марта 2009

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

Является ли Position вашим первичным ключом? Индекс состоит из индексированного столбца, первичного ключа и необязательно включенных столбцов. Если Позиция не является вашим первичным ключом, то в данный момент вы ищите свой первичный ключ в своем индексе, а затем просматриваете результат с помощью первичного индекса, чтобы найти значение Позиции. Попробуйте добавить значение Position в качестве включенного столбца, и вы сможете выполнить свой запрос только на основе одного индекса, другие индексы не будут использоваться.

CREATE INDEX IX_Blah ON Blah (FirstName, Rank DESC) INCLUDE (Position)

Не забудьте проверить свои планы запросов, они могут сообщить вам, если у вас отсутствуют какие-либо индексы (предполагается, что Sql Server 2008), какие индексы используются и т. Д.

0 голосов
/ 06 марта 2009

Я испортил аутентификацию в моем предыдущем посте, это мой зарегистрированный пользователь.

Индекс основан на выбранных вами столбцах и первичном ключе. В основном вы храните хэш-карту, в которой ключ (FirstName, Rank) разрешается в ваш Id (при условии, что ваш первичный ключ - Id). Этот идентификатор затем используется для чтения значения позиции.

Мое предложение состояло бы в том, чтобы включить значение позиции в индекс в виде включенного столбца. Это позволит вам читать данные из индекса, избегая второго поиска.

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