Поиск по кластеризованному индексу и поиск по некластеризованному индексу

#sql #sql-server #sql-server-2012 #query-optimization

#sql #sql-сервер #sql-server-2012 #оптимизация запросов

Вопрос:

Я использую базу данных SQL Server 2012 и хочу получить знания об оптимизации запросов.. делая это, я столкнулся с одним сомнением и был бы признателен, если бы кто-нибудь, пожалуйста, помог мне с этим.

Sales.OrderDetails имеет два индекса: один кластеризованный на Orderid и один некластеризованный на Order id.

Первый вопрос: действительно ли нам нужен некластеризованный индекс, когда у нас есть кластеризованный индекс на orderid ?

Чтобы решить эту проблему, я запустил этот запрос:

 select orderid 
from Sales.OrderDetails 
where orderid = 10248
  

два раза; один раз, когда был включен некластеризованный индекс, а другой — когда он был отключен. Для более ранней версии он выполнял поиск по некластеризованному индексу, а для более поздней версии SQL Server выполнял поиск по кластеризованному индексу. Фактически нет разницы между стоимостью запроса.

Итак, возвращаясь к моему вопросу: действительно ли нам нужно создавать некластеризованные индексы для ключей, для которых уже существует один некластеризованный индекс, и повысит ли это производительность?

Изображение 1: введите описание изображения здесь

Изображение 2: введите описание изображения здесь

Комментарии:

1. Если у вас включен кластеризованный индекс OrderId , другой некластеризованный индекс в том же столбце совершенно бесполезен — просто удалите его

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

3. @marc_s: да, это то, о чем я думал .. но чтобы подтвердить, есть ли у меня кластеризованный индекс в одном столбце, мне не нужен некластеризованный индекс в этом столбце, верно?

4. В OrderId некоторых обстоятельствах может быть полезно иметь более узкий индекс. например, запрос SELECT OrderId FROM YourTable может использовать значительно меньше операций чтения, сканирующих NCI, чем CI.

5. @marc_s да, вероятно, редкая рабочая нагрузка, при которой было бы целесообразно иметь оба индекса.

Ответ №1:

Первый вопрос: Когда у нас есть кластерный индекс в поле, не нужно индексировать некластерный индекс в этом поле.

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