#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, безусловно, отличается по производительности от кластеризованного и некластеризованного индекса.