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

首頁 > 開發 > 綜合 > 正文

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

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

在上篇文章里,我討論了唯一和非唯一聚集索引的區別。我們已經知道,SQL Server內部使用4 bytes的uniquifier來保證非唯一聚集索引行唯一。今天我們來看下唯一聚集索引上,唯一和非唯一非聚集索引的區別。當我們在表上定義PRIMARY KEY約束時,SQL Server會為我們創建唯一聚集索引;另外我們可以通過CREATE UNIQUE CLUSTERED INDEX語句在表上創建唯一聚集索引。下面的代碼會創建customers表,然后在它上面創建唯一聚集索引,最后在表上創建唯一和非唯一非聚集索引。

 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 GO11   12 -- Create a unique clustered index on the previous created table 13 CREATE UNIQUE CLUSTERED INDEX idx_Customers ON Customers(CustomerID) 14 GO  15 -- Insert 80.000 records 16 DECLARE @i INT = 1 17 WHILE (@i <= 80000) 18 BEGIN 19     INSERT INTO Customers VALUES 20     ( 21         @i, 22         'CustomerName' + CAST(@i AS CHAR), 23         'CustomerAddress' + CAST(@i AS CHAR), 24         'Comments' + CAST(@i AS CHAR) 25     )     26     SET @i += 1 27 END 28 GO29 30 -- Create a unique non clustered index on the clustered table 31 CREATE UNIQUE NONCLUSTERED INDEX idx_UniqueNCI_CustomerID 32 ON Customers(CustomerName) 33 GO  34 35 -- Create a non-unique non clustered index on the clustered table 36 CREATE NONCLUSTERED INDEX idx_NonUniqueNCI_CustomerID 37 ON Customers(CustomerName) 38 GO

在2個非聚集索引創建后,我們可以使用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,非唯一非聚集索引的記錄長度是111 bytes。因此這2個索引的內部存儲格式肯定不同。我們從唯一非聚集索引開始分析。

我們可以通過DBCC IND命令找出索引根頁,聚集索引的INDEX ID為1,非聚集索引的INDEX ID從2開始,依次遞增,這里應該是2和3。

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

從這里我們可以看出,唯一非聚集索引的根頁是20834,非唯一非聚集索引的根頁是21890。

我們看下唯一非聚集索引的根頁內容:

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

從圖中我們可以看到,每條索引記錄包含非聚集鍵(這里是唯一的)——即CustomerName列。

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

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

這里的107 bytes包含下列信息:

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

在唯一非聚集索引里,所有非葉子層的每條索引記錄都包含這107 bytes信息。因此,你的非聚集索引鍵大小會影響到每個索引頁可以存儲多少條索引記錄。這樣的話,這個例子的CHAR(100),并不是一個很好的索引鍵。

我們繼續往下看,索引葉子層的存儲情況:

1 DBCC PAGE(ALLOCATIONDB, 1, 20834, 3)--根層2 GO3 4 DBCC PAGE(ALLOCATIONDB, 1, 20833, 3)--中間層5 GO6 7 DBCC PAGE(ALLOCATIONDB, 1, 21098, 3)--葉子層8 GO

從圖中我們可以看到,SQL Server在葉子層這里保存聚集鍵(即CustomerID列的值)。這個值是SQL Server用來指向聚集索引里對應記錄的指針。手上有了這個值,SQL Server就可以在聚集索引找到對應記錄——通過聚集索引查找(Clustered Index Seek)運算符。這和在堆表上定義的非聚集索引有重大區別。因為在堆表里,SQL Server使用葉子層的HEAP RID直接指向數據頁里存儲的對應記錄。因此,SQL Server不用訪問額外索引,就可以直接正確讀取到數據頁。

這也意味著SQL Server在堆表上通過非聚集索引找記錄,比在聚集表上通過非聚集索引找記錄快很多,因為SQL Server不需要執行額外的聚集索引查找(Clustered Index Seek)運算符。因此在堆表上可以讀取更少的頁正確找到記錄。當不要高估這個細節,想想在堆表通過使用非聚集索引,性能上可以有多少好處。事實上,SQL Server總是盡量把索引頁放在緩存區管理器里,因此對于SQL Server來說,使用額外的聚集索引查找(Clustered Index Seek)從聚集索引里找回記錄,成本更低。

現在我們來分析下非唯一非聚集索引。先來看看根頁:

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

從上圖可以看出,非唯一非聚集索引根頁里,SQL Server這里保存里非聚集索引鍵和聚集索引鍵,這個和剛才的唯一聚集索引根頁是不一樣的。

SQL Server這里需要使用唯一聚集鍵來使非唯一非聚集索引鍵唯一。這在非唯一非聚集索引的每一層都會保存,從索引根頁到葉子層。這就是說你需要更多的存儲空間來保存索引,因為SQL Server在每條索引記錄里不僅保存唯一聚集鍵,也保存非唯一非聚集索引鍵。因此當你選擇不好的聚集鍵(像 CHAR(100)等)時,情況會變得更糟。

1 DBCC PAGE(ALLOCATIONDB, 1, 21890, 3)--根層2 GO3 4 DBCC PAGE(ALLOCATIONDB, 1, 21889, 3)--中間層5 GO6 7 DBCC PAGE(ALLOCATIONDB, 1, 22087, 3)--葉子層8 GO

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

1 DBCC TRACEON(3604)2 DBCC PAGE(ALLOCATIONDB, 1, 21890, 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)

當你把這些字節長度匯總后,你就得到了剛才提到的111 bytes。因此在你創建非唯一非聚集索引時,就要考慮到這些額外存儲,因為它會影響到你的非聚集索引的每一層。

在這個系列的下篇文章里,我們最后來看下在非唯一聚集索引上,唯一和非唯一非聚集索引的區別,請繼續關注!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本精品va在线观看| 国产精品网站入口| 91极品视频在线| 亚洲va国产va天堂va久久| 久久久精品一区二区| 国产日韩在线亚洲字幕中文| 亚洲欧美三级在线| 亚洲国产精品久久久久秋霞蜜臀| 综合网中文字幕| 欧美最猛性xxxxx亚洲精品| 国产99在线|中文| 国语自产在线不卡| 亚洲福利视频专区| 国产精品成人国产乱一区| 麻豆乱码国产一区二区三区| 精品二区三区线观看| 国产精品网址在线| 日韩电影中文字幕| 亚洲精品美女在线观看| 欧美日韩亚洲一区二区| 国产精品永久在线| 亚洲一区二区久久| 九九热精品视频在线播放| 日本精品久久久久影院| 777国产偷窥盗摄精品视频| 亚洲最大福利网站| 欧美一区第一页| 色婷婷**av毛片一区| 国产女同一区二区| 欧美成人精品一区| 欧美日韩国产中文字幕| 国产69精品久久久久99| 国产日韩一区在线| 日韩美女中文字幕| 欧美福利小视频| 亚洲日本中文字幕免费在线不卡| 九九久久精品一区| 日韩中文字幕在线播放| 97精品国产97久久久久久春色| 国产亚洲精品美女久久久| 亚洲黄页视频免费观看| 精品中文字幕视频| 精品综合久久久久久97| 国模精品视频一区二区| 国产日产亚洲精品| 亚洲伊人第一页| 欧美性猛交xxxx乱大交极品| 91国产中文字幕| 日韩欧美综合在线视频| 日韩av在线直播| 日韩欧美成人区| 青青草精品毛片| 91视频国产精品| 久久久久久噜噜噜久久久精品| 国内精品久久久久久影视8| 欧美在线免费视频| 国产亚洲精品久久久优势| 亚洲视频专区在线| 国产精品男人的天堂| 精品无人区太爽高潮在线播放| 国产成人精品在线视频| 欧美电影在线观看网站| 欧美一级成年大片在线观看| 青青草原一区二区| 色综合伊人色综合网站| 大荫蒂欧美视频另类xxxx| 永久555www成人免费| 久久久久久久色| 搡老女人一区二区三区视频tv| 亚洲黄在线观看| 亚洲3p在线观看| 国产69精品久久久久9999| 国产日韩中文字幕| 亚洲第一天堂无码专区| 亚洲第一页自拍| 国产精品午夜一区二区欲梦| 日韩乱码在线视频| 日韩在线视频线视频免费网站| 成人黄色av免费在线观看| 国产欧美精品xxxx另类| 亚洲欧美激情另类校园| 国产精品电影久久久久电影网| 国产精品国模在线| 成人福利网站在线观看11| 91精品久久久久久久久不口人| 中文字幕精品www乱入免费视频| 欧美怡春院一区二区三区| 原创国产精品91| 中文字幕在线视频日韩| 亚洲综合第一页| 欧洲成人性视频| 高清欧美性猛交xxxx黑人猛交| 国产精品精品久久久| 91九色综合久久| 狠狠躁天天躁日日躁欧美| 日本精品久久中文字幕佐佐木| 亚洲一区中文字幕在线观看| 91视频88av| 日本精品一区二区三区在线播放视频| 亚洲午夜国产成人av电影男同| 亚洲精品久久视频| 久久中文字幕在线| 国产欧美亚洲视频| 国产精品久久久久久久久久东京| 国产福利精品av综合导导航| 日韩av影视在线| 亚洲国产精品久久久| 91av在线看| 欧美性猛交xxxx黑人| 日韩中文字幕视频在线观看| 色偷偷av一区二区三区乱| 国产精品白嫩初高中害羞小美女| 中文字幕成人精品久久不卡| 亚洲午夜国产成人av电影男同| 久久亚洲精品成人| 成人精品在线视频| 国产精品成人在线| 国模gogo一区二区大胆私拍| 亚洲第一福利视频| 91免费欧美精品| 精品欧美国产一区二区三区| 精品久久久国产| 欧美精品一本久久男人的天堂| 欧美高清在线观看| 91亚洲va在线va天堂va国| 一区二区三区动漫| 青青草精品毛片| 欧美激情一级精品国产| 国产日产亚洲精品| 日本免费久久高清视频| 精品久久香蕉国产线看观看亚洲| 日韩精品在线免费观看| 国产色综合天天综合网| 亚洲女人被黑人巨大进入al| 一区三区二区视频| 亚洲精品视频在线播放| 精品无人区太爽高潮在线播放| 中文字幕少妇一区二区三区| 中文字幕亚洲综合久久筱田步美| xvideos成人免费中文版| 久久久久久久久国产精品| 亚洲免费高清视频| 26uuu另类亚洲欧美日本一| 91情侣偷在线精品国产| 97视频国产在线| 亚洲精品av在线| 尤物99国产成人精品视频| 一区二区在线视频| 亚洲激情久久久| 日韩视频在线一区| 亚洲成色999久久网站| 亚洲欧洲自拍偷拍| 美女av一区二区三区| 国产精品一区二区女厕厕| 亚洲香蕉成视频在线观看| 色黄久久久久久| 78色国产精品| 26uuu日韩精品一区二区| 欧美激情xxxxx| 久久久久国色av免费观看性色| 国产成人高清激情视频在线观看| 亚洲成人黄色网| 一区二区三区无码高清视频| 日韩中文字幕国产精品|