亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

索引鍵的唯一性(4/4):非唯一聚集索引上的唯一和非唯一非聚集索引

2024-07-21 02:46:42
字體:
來源:轉載
供稿:網友
索引鍵的唯一性(4/4):非唯一聚集索引上的唯一和非唯一非聚集索引

在上一篇文章里,我談了唯一聚集索引上的唯一和非唯一非聚集索引的區別。在這篇文章里,我想談下唯一聚集索引上的唯一和唯一聚集索引的區別。我們都知道,SQL Server內部把唯一聚集索引當作唯一聚集索引處理的。如果你定義了一個唯一聚集索引,SQL Server會增加叫做uniquifier到你的索引記錄,它導致你聚集索引的導航結構(B樹的非葉子層)里,每條索引行都要用到4 bytes的開銷。

下列代碼再次創建我們的Customers表,這次在它上面定義唯一聚集索引,最后定義2個聚集索引,1個是唯一的,另1個是非唯一的。

 1 -- Create a table with 393 length + 7 bytes overhead = 400 bytes  2 -- Therefore 20 records can be stored on one page (8.096 / 400) = 20,24  3 CREATE TABLE Customers  4 (  5     CustomerID INT NOT NULL,  6     CustomerName CHAR(100) NOT NULL,  7     CustomerAddress CHAR(100) NOT NULL,  8     Comments CHAR(189) NOT NULL  9 ) 10 GO 11  12 -- Create a non unique clustered index on the PRevious created table 13 CREATE CLUSTERED INDEX idx_Customers ON Customers(CustomerID) 14 GO15 16 -- Insert 80.000 records 17 DECLARE @i INT = 1 18 WHILE (@i <= 20000) 19 BEGIN 20     DECLARE    @j INT = 1     21     INSERT INTO Customers VALUES 22     ( 23         @i, 24         'CustomerName' + CAST(@i AS CHAR) + CAST(@j AS CHAR), 25         'CustomerAddress' + CAST(@i AS CHAR), 26         'Comments' + CAST(@i AS CHAR) 27     ) 28      29     SET @j += 1; 30      31     INSERT INTO Customers VALUES 32     ( 33         @i, 34         'CustomerName' + CAST(@i AS CHAR) + CAST(@j AS CHAR), 35         'CustomerAddress' + CAST(@i AS CHAR), 36         'Comments' + CAST(@i AS CHAR) 37     ) 38      39     SET @j += 1; 40      41     INSERT INTO Customers VALUES 42     ( 43         @i, 44         'CustomerName' + CAST(@i AS CHAR) + CAST(@j AS CHAR), 45         'CustomerAddress' + CAST(@i AS CHAR), 46         'Comments' + CAST(@i AS CHAR) 47     ) 48      49     SET @j += 1; 50      51     INSERT INTO Customers VALUES 52     ( 53         @i, 54         'CustomerName' + CAST(@i AS CHAR) + CAST(@j AS CHAR), 55         'CustomerAddress' + CAST(@i AS CHAR), 56         'Comments' + CAST(@i AS CHAR) 57     ) 58      59     SET @i += 1 60 END 61 GO62 63 -- Create a unique non clustered index on the clustered table 64 CREATE UNIQUE NONCLUSTERED INDEX idx_UniqueNCI_CustomerID 65 ON Customers(CustomerName) 66 GO 67  68 -- Create a non-unique non clustered index on the clustered table 69 CREATE NONCLUSTERED INDEX idx_NonUniqueNCI_CustomerID 70 ON Customers(CustomerName) 71 GO

我們通過DMV sys.dm_db_index_physical_stats查看索引的相關信息。

 1 -- Retrieve physical information about the unique non-clustered index  2 SELECT * FROM sys.dm_db_index_physical_stats  3 (  4     DB_ID('ALLOCATIONDB'),  5     OBJECT_ID('Customers'),  6     2,  7     NULL,  8     'DETAILED' 9 ) 10 GO11 12 -- Retrieve physical information about the non-unique non-clustered index 13 SELECT * FROM sys.dm_db_index_physical_stats 14 ( 15     DB_ID('ALLOCATIONDB'), 16     OBJECT_ID('Customers'), 17     3, 18     NULL, 19     'DETAILED'20 ) 21 GO

從圖中我們可以看到,在導航層的唯一聚集索引每個索引行占用107 bytes,而唯一聚集索引每個索引行平均占用117 bytes(最小111 bytes,最大119 bytes)。我們用DBCC PAGE分析下各自的根頁。

1 TRUNCATE TABLE dbo.sp_table_pages2 INSERT INTO dbo.sp_table_pages3 EXEC('DBCC IND(ALLOCATIONDB, Customers, -1)') 4 5 SELECT * FROM dbo.sp_table_pages ORDER BY IndexLevel DESC

首先是唯一聚集索引,它的根頁是21058。

1 DBCC PAGE(ALLOCATIONDB, 1, 21058, 3) 2 GO3 4 DBCC PAGE(ALLOCATIONDB, 1,21057,3)5 GO

從圖中我們可以看出,唯一聚集索引在索引根層(還有中間層)只保存了唯一聚集鍵,因為聚集鍵本身就已經唯一了。

我們換參數1再來看看根頁信息:

1 DBCC TRACEON(3604)2 DBCC PAGE(ALLOCATIONDB, 1, 21058, 1) 3 GO

這107 bytes包含下列信息:

  • 1 byte: 狀態位
  • n bytes:唯一聚集索引鍵——這里是CustomerName列,100 bytes
  • 4 bytes:頁ID(PageID)
  • 2 bytes:文件ID(FileID)

我們再來看看唯一聚集索引的葉子頁。

1 DBCC PAGE(ALLOCATIONDB, 1,21322,3)2 GO

我們可以看出SQL Server通過唯一聚集鍵和uniquifier來指向聚集表的對應記錄。

這里我們可以得出結論:在唯一聚集索引上的唯一聚集索引只在葉子層使用4 bytes的uniquifier,因為這里SQL Server使用聚集鍵和uniquifier直接指向對應的記錄。這個4 bytes的uniquifier在唯一聚集索引的非葉子層(根層和中間層)不存在。

我們再來看看唯一聚集索引的根頁,它的根頁是22986。

1 DBCC PAGE(ALLOCATIONDB, 1, 22986, 3) 2 GO

這里的根頁輸出信息非常有意思!索引記錄的鍵必須設計為唯一。SQL Server如何讓唯一聚集索引鍵唯一呢?非常簡單——加下聚集鍵(CustomerID (key))(4 bytes)。但是聚集鍵這里默認還是不唯一的,因此SQL Server又加了uniquifier(4 bytes),因次當你uniquifier不為0的時候,每個索引行都有8 bytes的開銷。當uniquifier為0時,你只要4 bytes的開銷,因為這個情況下uniquifier并不物理保存在索引記錄里,0是SQL Server自動假定的值。

我們再看看參數為1的信息:

1 DBCC TRACEON(3604)2 DBCC PAGE(ALLOCATIONDB, 1, 22986, 1) 3 GO

這111 bytes 包含下列信息:

  • 1 byte:狀態位
  • n bytes:唯一聚集索引鍵——這里是CustomerName列,100 bytes
  • n bytes:唯一聚集索引鍵——這里是CustomerID列,4 bytes
  • 4 bytes:頁ID(PageID)
  • 2 bytes:文件ID(FileID)
  • 4 bytes:uniquifier用到的字節
  • 4 bytes:uniquifier本身值,如果uniquifier非0的話

剛才我們通過sys.dm_db_index_physical_stats知道唯一聚集索引的索引記錄是111 bytes,最長是117 bytes。

我們來看看唯一聚集索引的葉子頁:

1 DBCC PAGE(ALLOCATIONDB, 1,23308,3)2 GO

這和唯一聚集索引上定義的唯一聚集索引是一樣的。葉子層通過聚集鍵(CustomerID)和uniquifier指向聚集表的對應記錄。從這個例子我們可以看出,當你在唯一聚集索引上定義唯一聚集索引時,會有巨大的開銷(每個索引行 8 bytes),因為SQL Server內部要保證聚集鍵唯一,這就需要大量的存儲開銷。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产精品99| 色婷婷综合久久久久| 91久久国产精品91久久性色| 日韩有码在线视频| 国产亚洲人成网站在线观看| 2018国产精品视频| 青青精品视频播放| 91精品国产自产在线观看永久| 国产精品白嫩美女在线观看| 欧美肥老妇视频| 国产精品久久av| 欧美在线视频播放| 精品国产91久久久久久老师| 亚洲www在线| 色999日韩欧美国产| 91av在线免费观看视频| 欧美午夜宅男影院在线观看| 日本a级片电影一区二区| 亚洲欧洲免费视频| 国产在线久久久| 国产亚洲人成网站在线观看| 欧美激情xxxxx| 欧美日韩国产精品一区二区三区四区| 九九热最新视频//这里只有精品| 国产精品免费网站| 久久这里有精品| 亚洲午夜小视频| 欧美成人午夜影院| 国产成人精品av在线| 国产精品网红福利| 国产精品丝袜久久久久久不卡| 色无极亚洲影院| 97精品国产91久久久久久| 中文精品99久久国产香蕉| 亚洲一区二区三区视频| 91成品人片a无限观看| 性欧美暴力猛交69hd| 日韩综合视频在线观看| 欧美在线视频免费| 国产v综合v亚洲欧美久久| 国产精品户外野外| 国产www精品| 77777少妇光屁股久久一区| 亚洲最大福利视频网| 九九精品在线观看| 91沈先生在线观看| 欧美另类极品videosbestfree| 欧美专区中文字幕| 亚洲片av在线| 久久精品一区中文字幕| 欧美精品18videos性欧美| 欧美午夜www高清视频| 国产精品在线看| 日本最新高清不卡中文字幕| 久久亚洲电影天堂| 久久视频在线看| 2019中文字幕在线观看| 精品综合久久久久久97| 奇米4444一区二区三区| 在线性视频日韩欧美| 国产99久久久欧美黑人| 亚洲奶大毛多的老太婆| 国产一区二区黑人欧美xxxx| 亚洲成成品网站| 中文字幕最新精品| 日本久久久久久久久久久| www.久久撸.com| 亚洲成av人影院在线观看| 亚洲图片在区色| www.xxxx精品| 亚洲欧美国产制服动漫| 欧美一级大片视频| 色综合久久天天综线观看| 狠狠综合久久av一区二区小说| 亚洲第一二三四五区| 日韩免费精品视频| 国产精品一区二区在线| 日韩影视在线观看| 九九精品在线观看| 亚洲国产小视频| 国内精品美女av在线播放| 91精品久久久久久久久久入口| 91精品在线观看视频| 欧美怡春院一区二区三区| 97国产精品视频| 国产精品极品美女粉嫩高清在线| 国产亚洲精品91在线| 欧美高跟鞋交xxxxhd| 国产这里只有精品| 欧美激情一区二区三区高清视频| 亚洲国产另类 国产精品国产免费| 亚洲一品av免费观看| 色香阁99久久精品久久久| 久久精品夜夜夜夜夜久久| 欧美性猛交xxxxx免费看| 久久久国产在线视频| 国产精品旅馆在线| 91在线网站视频| 色偷偷888欧美精品久久久| 96精品视频在线| 日韩欧美黄色动漫| 日本久久久久亚洲中字幕| 色婷婷亚洲mv天堂mv在影片| 九九热最新视频//这里只有精品| 成人免费福利在线| 51久久精品夜色国产麻豆| 日本精品久久久| 青青草原成人在线视频| 日韩av综合网站| 高清一区二区三区四区五区| 日本道色综合久久影院| 最新国产精品拍自在线播放| 色播久久人人爽人人爽人人片视av| 国产精品久久久久久久久免费| 国内精品美女av在线播放| 国产精品情侣自拍| 91精品国产91久久| 中文字幕亚洲无线码在线一区| 亚洲欧美日韩区| 在线播放国产一区中文字幕剧情欧美| 91精品久久久久久久久久久久久久| 欧美激情一区二区久久久| 国产视频精品va久久久久久| 精品视频久久久久久| 成人国产精品av| 欧美在线免费观看| 成人精品aaaa网站| 日韩电影免费观看在线观看| 欧美第一黄网免费网站| 国产成人精品亚洲精品| 亚洲电影免费观看高清完整版在线观看| 欧美在线欧美在线| 欧美性少妇18aaaa视频| 国产网站欧美日韩免费精品在线观看| 91日本在线视频| 国产精品av网站| 日韩av一区二区在线观看| 精品国产福利视频| 久久精品亚洲94久久精品| 亚洲xxxx视频| 国产欧美最新羞羞视频在线观看| 伊人激情综合网| 日韩在线一区二区三区免费视频| 国产精品av在线播放| 最近2019年中文视频免费在线观看| 亚洲欧美一区二区三区久久| 九九热这里只有在线精品视| 91精品在线影院| 日韩av综合网| 久久91亚洲精品中文字幕奶水| 97视频在线观看亚洲| 亚洲精品之草原avav久久| 91精品国产自产在线观看永久| 亚洲成人免费在线视频| 亚洲一区二区在线播放| 福利一区福利二区微拍刺激| 2019亚洲日韩新视频| 欧美亚洲成人xxx| 欧美韩日一区二区| 亚洲少妇中文在线| yw.139尤物在线精品视频| 日韩在线观看你懂的| 国产亚洲日本欧美韩国| 久久久91精品国产|