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

首頁 > 開發 > 綜合 > 正文

索引鍵的唯一性(2/4):唯一與非唯一聚集索引

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

在上一篇文章里,我們討論了堆表上唯一/非唯一非聚集索引。在SQL Server里沒有聚集索引定義的叫堆表。當你在堆表上定義了一個聚集索引,你的表數據就會重組按聚集鍵的順序進行物理存儲,因為這個表叫做聚集表。這篇文章里,我想談下唯一和非唯一聚集索引之間的區別,這2類聚集索引對存儲的影響。

看這個文章之前,希望你對聚集索引有個基本的認識,并且知道堆表和聚集表之間的區別,還有當在表上定義了一個聚集索引,表里數據頁是如何組織的(B樹結構)。

我們從唯一聚集索引談起。在SQL Server里你有很多方法去定義唯一聚集索引。第1個最簡單的方法就是列上定義一個主鍵(PRIMARY KEY)約束。SQL Server通過在表上創建那列的唯一聚集索引來施行主鍵(PRIMARY KEY)約束。另外一個方法是通過CREATE CLUSTERED INDEX語句來常見唯一聚集索引——但當你不指定UNIQUE屬性時,SQL Server默認是會為你創建非唯一的聚集索引!下列這段代碼會創建Customers表,這個表結構和上篇文章一樣,但這次我們在CustomerID列創建主鍵(PRIMARY KEY)約束。因此SQL Server會在表上創建唯一聚集索引,在葉子層里,數據頁是按CustomerID列值排序的。

 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 PRIMARY KEY IDENTITY(1, 1), 6    CustomerName CHAR(100) NOT NULL, 7    CustomerAddress CHAR(100) NOT NULL, 8    Comments CHAR(189) NOT NULL 9 )10 GO11 12 -- Insert 80.000 records13 DECLARE @i INT = 114 WHILE (@i <= 80000)15 BEGIN16    INSERT INTO Customers VALUES17    (18       'CustomerName' + CAST(@i AS CHAR),19       'CustomerAddress' + CAST(@i AS CHAR),20       'Comments' + CAST(@i AS CHAR)21    )22 23    SET @i += 124 END25 GO

我們可以通過DBCC IND命令找出索引根頁后(PageType為2,IndexLevel為2,即B樹有3層:根和葉子層,PagePID為15359),就可以使用DBCC PAGE查看根頁的內容。這里我的索引根頁是15359。

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

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

從上圖里,我們可以看到每個索引記錄包含聚集鍵,在這個例子是CustomerID列的值。

如果你從字節存儲級別分析聚集索引記錄的話,你會發現SQL Server這里使用下列字節信息:

  • 1 byte:狀態位
  • n bytes:聚集鍵——這個例子里是4 bytes
  • 4 bytes:頁ID(PageID)
  • 2 bytes:文件ID(FileID)

可以看出,聚集鍵的長度直接影響索引記錄的長度。這就是說,你的聚集鍵長度越小,索引頁上就可以存放更多的索引記錄,因此你的聚集索引將更緊湊,查找更快,維護更容易。當你在你的聚集索引繼續往下看時,你會發現所有中間層的索引結構和剛才的描述完全一樣。這2層是沒有任何區別的,除了索引葉子層,因為這層包含你實際邏輯排序的數據頁。

現在我們來看看SQL Server里非唯一聚集索引,看看它們和唯一聚集索引的區別。為了演示這類索引,我重建了Customers表,并通過CREATE CLUSTERED INDEX語句在表上創建了非唯一聚集索引。

 1 DROP TABLE dbo.Customers 2 -- Create a table with 393 length + 7 bytes overhead = 400 bytes 3 -- Therefore 20 records can be stored on one page (8.096 / 400) = 20,24 4 CREATE TABLE Customers 5 (  6    CustomerID INT NOT NULL, 7    CustomerName CHAR(100) NOT NULL, 8    CustomerAddress CHAR(100) NOT NULL, 9    Comments CHAR(181) NOT NULL10 )11 GO12 13 -- Create a non unique clustered index14 CREATE CLUSTERED INDEX idx_Customers_CustomerID15 ON Customers(CustomerID)16 GO

最后,我插入80000條記錄,這些記錄的CustomerID列(聚集鍵)不再唯一:

 1 -- Insert 80.000 records 2 DECLARE @i INT = 1 3 WHILE (@i <= 20000) 4 BEGIN 5    INSERT INTO Customers VALUES 6    ( 7       @i, 8       'CustomerName' + CAST(@i AS CHAR), 9       'CustomerAddress' + CAST(@i AS CHAR),10       'Comments' + CAST(@i AS CHAR)11    )12    INSERT INTO Customers VALUES13    (14       @i,15       'CustomerName' + CAST(@i AS CHAR),16       'CustomerAddress' + CAST(@i AS CHAR),17       'Comments' + CAST(@i AS CHAR)18    )19    INSERT INTO Customers VALUES20    (21       @i,22       'CustomerName' + CAST(@i AS CHAR),23       'CustomerAddress' + CAST(@i AS CHAR),24       'Comments' + CAST(@i AS CHAR)25    )26  27    INSERT INTO Customers VALUES28    (29       @i,30       'CustomerName' + CAST(@i AS CHAR),31       'CustomerAddress' + CAST(@i AS CHAR),32       'Comments' + CAST(@i AS CHAR)33    )34 35 SET @i += 136 END37 GO

我們找下這個非唯一聚集索引的根頁:

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

我們再來看看根頁的內容:

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

我們發現,SQL Server這里增加了UNIQUIFIER (key)的額外列。這列是SQL Server用來保證非唯一聚集鍵唯一。UNIQUIFIER (key)是4 bytes始于0的長整型值。當你有2條CustomerID值都是1380時,第1條的UNIQUIFIER為0,第2條的UNIQUIFIER值為1。但SQL Server只在索引的導航結構(高于葉子層的所有層)里保存UNIQUIFIER,即葉子層的UNIQUIFIER不為0。SQL Server只在非唯一聚集索引的導航結構里包含0值的UNIQUIFIER,這就是說導航結構里是不物理保存UNIQUIFIER的。在非唯一聚集索引里,唯一保存UNIQUIFIER的地方是在數據頁,就是保存實際數據的地方。下圖是我們聚集聚集索引里的中間層,你會看到UNIQUIFIER在這里是保存的。

1 DBCC PAGE(ALLOCATIONDB, 1, 15359, 3)2 GO3 4 DBCC PAGE(ALLOCATIONDB, 1, 14635, 3)5 GO

最后我們看看數據頁14633:

1 DBCC TRACEON(3604)2 DBCC PAGE(ALLOCATIONDB, 1, 14633, 3) with tableresults3 GO

我們來找4條CustomerID值為1的記錄,看看UNIQUIFIER的值是多少(應該是0,1,2,3)。

因此唯一和非唯一聚集索引的區別是在數據頁,因為當使用非唯一聚集索引時,SQL Server使用4 bytes長的UNIQUIFIER來保證它們唯一,要記住,在你定義非唯一聚集索引時,這個額外開銷始終存在。

下面文章我們會詳細分析下唯一聚集索引上,唯一和非唯一非聚集索引的區別。請繼續關注!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
韩国精品美女www爽爽爽视频| 亚洲xxx自由成熟| 成人在线播放av| 久久久久久com| 91精品国产自产91精品| 日韩欧美精品网站| 亚洲wwwav| 欧美性受xxxx白人性爽| 亚洲精品v欧美精品v日韩精品| 色av中文字幕一区| 日韩av电影在线免费播放| 国产精品视频区1| 欧美成人免费在线观看| 萌白酱国产一区二区| 欧美日韩国产丝袜另类| 久久精品亚洲94久久精品| 久久影视电视剧免费网站| 久久综合国产精品台湾中文娱乐网| 日韩中文字幕免费视频| 中文字幕欧美日韩在线| 国产精品久久久久久久7电影| 欧美激情一区二区三区在线视频观看| 亚洲精品久久久久久久久久久| 日本精品性网站在线观看| 午夜精品久久久久久久99热| 久久精品成人欧美大片古装| 国产一区二区三区四区福利| 国产精国产精品| 久久久久久久电影一区| 国产精品中文久久久久久久| 日韩中文字幕视频在线观看| 亚洲伊人久久大香线蕉av| 久久久久久久久久久91| 亚洲欧美日韩一区在线| 日韩精品极品毛片系列视频| 国内精品小视频| x99av成人免费| 久久久国产一区二区| 国产精品久久久久久五月尺| 人人爽久久涩噜噜噜网站| 88国产精品欧美一区二区三区| 欧美成人免费全部观看天天性色| 怡红院精品视频| 81精品国产乱码久久久久久| 欧美电影在线观看| 97热在线精品视频在线观看| 亚洲成av人影院在线观看| 中文字幕视频在线免费欧美日韩综合在线看| 日本午夜在线亚洲.国产| 精品亚洲夜色av98在线观看| 欧美特级www| 久精品免费视频| 欧美小视频在线| 2018中文字幕一区二区三区| 国产精品h片在线播放| 红桃视频成人在线观看| 亚洲国产精品va在线看黑人动漫| 亚洲片在线资源| 国产精品av网站| 国产精品户外野外| 亚洲天堂av高清| 欧美性猛交xxxx久久久| 精品福利视频导航| 久久五月情影视| 中文字幕欧美国内| 日韩国产高清污视频在线观看| 精品中文字幕在线2019| 久色乳综合思思在线视频| 久久久久久av| 久久成年人视频| 亚洲深夜福利网站| 美日韩精品免费视频| 亚洲精品欧美极品| 黄网动漫久久久| 亚洲欧美国产日韩中文字幕| 亚洲美女在线看| 全色精品综合影院| 亚洲黄色有码视频| 黑人巨大精品欧美一区二区三区| 欧美黄色免费网站| 午夜精品久久久99热福利| 国产精品久久久久久久久久ktv| 爽爽爽爽爽爽爽成人免费观看| 国产精品第2页| 国产精品久久久久久久久久尿| 国产精品免费一区| 精品亚洲一区二区三区四区五区| 主播福利视频一区| 中日韩美女免费视频网站在线观看| 国产日韩在线视频| 亚洲精品国产成人| 亚州国产精品久久久| 亚洲最大成人免费视频| 欧美韩日一区二区| 中文字幕亚洲欧美在线| 亚洲久久久久久久久久久| 亚洲国产欧美日韩精品| 精品成人乱色一区二区| 国产在线不卡精品| 91情侣偷在线精品国产| 日韩av手机在线| 亚洲精品电影网站| 欧美极品少妇xxxxⅹ免费视频| 亚洲欧美国产精品va在线观看| 国产精品入口免费视| 亚洲综合最新在线| 激情成人中文字幕| 国产精品亚洲欧美导航| 中文字幕日韩在线观看| 亚洲欧美三级伦理| 最新69国产成人精品视频免费| 国产成人鲁鲁免费视频a| 亚洲国产日韩欧美综合久久| 免费不卡欧美自拍视频| 久久国产精品电影| 91久久久久久久久| 97香蕉久久夜色精品国产| 成人黄色大片在线免费观看| 97国产精品免费视频| 88国产精品欧美一区二区三区| 日韩久久精品成人| 日韩美女av在线免费观看| 911国产网站尤物在线观看| 亚洲第一av网站| 国产一区二区三区在线| 成人福利网站在线观看| 亚洲午夜精品久久久久久性色| 羞羞色国产精品| 97超级碰碰碰久久久| 国产精品欧美一区二区| 97国产精品视频人人做人人爱| 中文字幕国产日韩| 久久天堂电影网| 亚洲一区www| 国产成人涩涩涩视频在线观看| 91久久久在线| www.国产精品一二区| 在线播放日韩欧美| 91中文在线视频| 日韩有码在线视频| 日韩精品免费综合视频在线播放| 中文字幕av一区| 亚洲视屏在线播放| 色爱av美腿丝袜综合粉嫩av| 精品爽片免费看久久| 国产日韩欧美91| 欧美理论电影在线播放| 亚洲国产精品久久久久| 久久国产天堂福利天堂| 人人做人人澡人人爽欧美| 国产伊人精品在线| 欧美大片欧美激情性色a∨久久| 欧美成人精品不卡视频在线观看| 中文字幕一区二区精品| 91系列在线观看| 色偷偷av亚洲男人的天堂| 91精品成人久久| 亚洲欧美日韩国产中文专区| 久久久久久久久久久91| 秋霞午夜一区二区| 欧美人与性动交| 国产91网红主播在线观看| 亚洲欧美在线第一页| 亚洲国产一区二区三区在线观看|