Необхідно включати кластерні стовпці індексів у некластеризовані індекси?


15

Враховуючи, що некластеризований індекс базується на кластерному індексі, чи потрібно було б некластеризованому індексу перелічити будь-який стовпець, що міститься в кластерному індексі?

Іншими словами, якщо таблиця Продукти містить кластерний індекс на ProductID, при створенні некластеризованого індексу, куди було б доцільно включити стовпець ProductID, необхідно все-таки додати його як стовпець?

Якщо ні, чи є сценарії, коли було б добре додати ім'я стовпця до некластеризованого індексу?

Відповіді:


20

У SQL Server кластерні стовпці кластерних індексів завжди додаються до некластеризованого індексу, щоб діяти як локатор рядків (див. Докладніше про некластеризовані ключі індексу ).

Для NCI, оголошеного унікальним, вони додаються як доданий стовпець, інакше вони додаються до кінця ключа.

Ви можете додати стовпці явно, якщо розташування за замовчуванням не є оптимальним для ваших запитів. Наприклад, якщо ви хочете керувати ASC/ DESCнапрямом або ви хочете контролювати положення ключових стовпців в індексі.

CREATE TABLE T
(
A INT,
B INT,
C INT ,
PRIMARY KEY CLUSTERED (B DESC, C DESC)
)

/*Implicitly adds B DESC, C DESC to end of key*/
CREATE NONCLUSTERED INDEX ix1 ON T(A ASC) 

/*No sort operation*/
SELECT  *
FROM T
ORDER BY A ASC,B DESC, C DESC

/*
But the avove index won't be able to seek into A,C  
and will need a residual predicate after seeking into A.

For the following query
*/

SELECT  *
FROM T
WHERE A=1 AND C > 4
ORDER BY C ASC, B DESC

/*This index explicitly controlling the key column position 
  and direction would be better*/
CREATE NONCLUSTERED INDEX ix2 ON T(A ASC, C ASC, B DESC) 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.