2017-04-23 33 views
1

我正在做一些分析並試圖瞭解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

+0

我對此的理解是非常不完整的,但我的猜測是Hep RID可能被添加到非唯一索引中,使其(或者說,其中的鍵)在內部是唯一的? – stakx

+1

也就是說,在唯一索引的情況下,SQL Server知道'CustomerId'本身就足以找到具有完整數據的特定錶行。在非唯一索引的情況下,原始表中可能有多行具有相同的'CustomerId',因此SQL Server通過添加內部(和唯一)RID來使索引中的「外鍵」唯一。通過將索引鍵轉換爲複合鍵。 – stakx

回答

1

請仔細閱讀這些文章(包括克勞斯Aschenbrenner書面):

摘錄:

「這裏的結論是,在非唯一聚集索引的唯一非聚集索引僅讓4字節的開銷在葉聚集索引的級別,因爲這裏SQL Server直接指向正確的記錄。有參與了獨特的非聚集索引的非葉水平沒有額外的開銷。」

,因爲它直接指向正確的記錄,沒有堆RID。

由於獨特的關鍵是本身是行的唯一標識符,在唯一配置項或唯一NCI中沒有RID,當該行中沒有唯一密鑰時會發生RID,因此SQL Server會添加行標識符(RID)來定位行並爬上B-tree

所以RID與CI或NCI無關RID與行的唯一性有關

+0

@ KumarHarsh-這兩個博客都是由同一個人編寫的。這裏的問題只是與根級索引頁面有關而不是葉級別頁面。它對根頁面的診斷我有疑問。 – 100pipers

+0

@ 100pipers,查看我的最後一段。 – KumarHarsh

+0

@ kumarharsh-那麼,我們說,由於非唯一的非聚集索引可以有100項與同一ID說一句,爲了區分這些1S,SQL服務器附加一個擺脫?謝謝。 – 100pipers

相關問題