Thực hiện các repro sau:
USE tempdb;
IF OBJECT_ID(N'dbo.t', N'U') IS NOT NULL
DROP TABLE dbo.t
GO
CREATE TABLE dbo.t
(
id int NOT NULL
PRIMARY KEY
NONCLUSTERED
IDENTITY(1,1)
, col1 datetime NOT NULL
, col2 varchar(800) NOT NULL
, col3 tinyint NULL
, col4 sysname NULL
);
INSERT INTO dbo.t (
col1
, col2
, col3
, col4
)
SELECT TOP(100000)
CONVERT(datetime,
DATEADD(DAY, CONVERT(int, CRYPT_GEN_RANDOM(1)), '2000-01-01 00:00:00'))
, replicate('A', 800)
, sc2.bitpos
, CONVERT(sysname, CHAR(65 + CRYPT_GEN_RANDOM(1) % 26)
+ CHAR(65 + CRYPT_GEN_RANDOM(1) % 26)
+ CHAR(65 + CRYPT_GEN_RANDOM(1) % 26))
FROM sys.syscolumns sc
CROSS JOIN sys.syscolumns sc2;
Ở đây tôi đang thêm một chỉ mục được nhóm vào một tập hợp các cột không phải là duy nhất và chỉ mục không phân cụm một cột điển hình:
CREATE CLUSTERED INDEX t_cx
ON dbo.t (col1, col2, col3);
CREATE INDEX t_c1 ON dbo.t(col4);
Truy vấn này buộc SQL Server thực hiện tra cứu vào chỉ mục được nhóm. Xin vui lòng tha thứ cho việc sử dụng gợi ý chỉ mục, đó là cách nhanh nhất để có được lời trách móc:
SELECT id
, col1
, col2
, col3
FROM dbo.t aad WITH (INDEX = t_c1)
WHERE col4 = N'JSB'
AND col1 > N'2019-05-30 00:00:00';
Các kế hoạch truy vấn thực tế chương trình một cột không tồn tại trong danh sách Output cho chỉ số nonclustered quét:
Rõ ràng, điều này đại diện cho uniqifier được sử dụng trong chỉ mục cụm không duy nhất. Có phải vậy không? Là một cột có tên như vậy luôn luôn là uniqifier chỉ mục cụm?