我正在做一些分析並試圖瞭解SQL Server 2008上的唯一和非唯一非聚集索引?在技術博客之後,我做了以下工作。爲什麼在獨特的非聚集索引根頁面中沒有堆存在,而是存在於非唯一非聚簇索引的根頁面中?
USE TEST
CREATE TABLE "CustomersHeap" (
"CustomerId" INT NOT NULL,
"CustomerName" CHAR(100) NOT NULL,
"CustomerAddress" CHAR(100) NOT NULL,
"Comments" CHAR(189) NOT NULL
)
;
USE TEST
DECLARE @i INT = 1 WHILE (@i <= 80000) BEGIN
INSERT INTO dbo.CustomersHeap VALUES
(
@i,
'CustomerName' + CAST(@i AS CHAR),
'CustomerAddress' + CAST(@i AS CHAR),
'Comments' + CAST(@i AS CHAR)
) SET @i += 1
END
-- Create a unique non clustered index
CREATE UNIQUE NONCLUSTERED INDEX IDX_UniqueNCI_CustomerID
ON Test.dbo.CustomersHeap(CustomerId)
-- Create a non-unique non clustered index
CREATE NONCLUSTERED INDEX IDX_NonUniqueNCI_CustomerID
ON Test.dbo.CustomersHeap(CustomerId)
--Get indexes
select * from sys.indexes where object_id=OBJECT_ID('Test.dbo.CustomersHeap')
--After figuring out index and child pages using DBCC IND
DBCC TRACEON(3604)
--UniqueNonClusteredIndex root page
DBCC PAGE(Test, 1, 4160, 3)
--NonUniqueNonClusteredIndex root page
DBCC PAGE(Test, 1, 4416, 3)
第一頁的輸出語句中不包含一個名爲「堆RID」,其中的第二頁聲明的輸出確實列。我無法理解爲什麼?特別是當所有行都有ChildPageId的信息並且它們應該正確地包含「HEAP RID」時。
此附加列增加了非唯一非聚集索引的根頁面的大小。
第一頁聲明 輸出列的fileid,的PageId,行,等級,ChildFileId,ChildPageId,客戶ID,KeyHashValue
的第二頁的聲明 輸出列的fileid,的PageId,行,等級,ChildFileId,ChildPageId,客戶ID ,HEAP RID,KeyHashValue
我對此的理解是非常不完整的,但我的猜測是Hep RID可能被添加到非唯一索引中,使其(或者說,其中的鍵)在內部是唯一的? – stakx
也就是說,在唯一索引的情況下,SQL Server知道'CustomerId'本身就足以找到具有完整數據的特定錶行。在非唯一索引的情況下,原始表中可能有多行具有相同的'CustomerId',因此SQL Server通過添加內部(和唯一)RID來使索引中的「外鍵」唯一。通過將索引鍵轉換爲複合鍵。 – stakx