Nehmen Sie den folgenden Repro:
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;
Hier füge ich einen Clustered-Index zu einer Reihe von Spalten hinzu, die nicht eindeutig sind, und einen typischen einspaltigen Nicht-Clustered-Index:
CREATE CLUSTERED INDEX t_cx
ON dbo.t (col1, col2, col3);
CREATE INDEX t_c1 ON dbo.t(col4);
Diese Abfrage zwingt SQL Server, nach dem Clustered-Index zu suchen. Bitte verzeihen Sie die Verwendung des Indexhinweises. Dies war der schnellste Weg, um den Repro zu erhalten:
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';
Der tatsächliche Abfrageplan zeigt eine nicht vorhandene Spalte in der Ausgabeliste für den nicht gruppierten Index-Scan:
Angeblich stellt dies den Uniqifier dar, der im nicht eindeutigen Clustered-Index verwendet wird. Ist das der Fall? Ist eine so benannte Spalte immer der Clustered Index Uniqifier?