Diperlukan untuk memasukkan kolom indeks berkerumun di indeks non-berkerumun?

15

Mempertimbangkan bahwa indeks non-cluster didasarkan pada indeks clustered, akankah perlu bagi indeks non-clustered untuk mendaftar salah satu kolom yang terkandung dalam indeks clustered?

Dengan kata lain jika tabel Products berisi indeks berkerumun di ProductID, saat membuat indeks non-berkerumun di mana akan disarankan untuk memasukkan kolom ProductID, apakah perlu untuk menambahkannya sebagai kolom?

Jika tidak, adakah skenario di mana akan lebih baik untuk menambahkan nama kolom ke indeks non-clustered?

Nico
sumber

Jawaban:

19

Dalam SQL Server kolom indeks kunci berkerumun selalu ditambahkan ke indeks tidak berkerumun untuk bertindak sebagai pencari baris (Ref: Lebih Banyak Tentang Tombol Indeks Tidak Tertutup ).

Untuk NCI yang dinyatakan unik, mereka akan ditambahkan sebagai kolom yang disertakan jika tidak ditambahkan ke akhir kunci.

Anda mungkin ingin menambahkan kolom secara eksplisit jika penempatan default tidak optimal untuk kueri Anda. Misalnya jika Anda ingin mengontrol ASC/ DESCarah atau Anda ingin mengontrol posisi kolom kunci dalam indeks.

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) 
Martin Smith
sumber