日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

索引键的唯一性(2/4):唯一与非唯一聚集索引

發(fā)布時間:2025/5/22 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 索引键的唯一性(2/4):唯一与非唯一聚集索引 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
索引鍵的唯一性(2/4):唯一與非唯一聚集索引 原文:索引鍵的唯一性(2/4):唯一與非唯一聚集索引

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

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

我們從唯一聚集索引談起。在SQL Server里你有很多方法去定義唯一聚集索引。第1個最簡單的方法就是列上定義一個主鍵(PRIMARY KEY)約束。SQL Server通過在表上創(chuàng)建那列的唯一聚集索引來施行主鍵(PRIMARY KEY)約束。另外一個方法是通過CREATE CLUSTERED INDEX語句來常見唯一聚集索引——但當你不指定UNIQUE屬性時,SQL Server默認是會為你創(chuàng)建非唯一的聚集索引!下列這段代碼會創(chuàng)建Customers表,這個表結構和上篇文章一樣,但這次我們在CustomerID列創(chuàng)建主鍵(PRIMARY KEY)約束。因此SQL Server會在表上創(chuàng)建唯一聚集索引,在葉子層里,數(shù)據(jù)頁是按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 GO 11 12 -- Insert 80.000 records 13 DECLARE @i INT = 1 14 WHILE (@i <= 80000) 15 BEGIN 16 INSERT INTO Customers VALUES 17 ( 18 'CustomerName' + CAST(@i AS CHAR), 19 'CustomerAddress' + CAST(@i AS CHAR), 20 'Comments' + CAST(@i AS CHAR) 21 ) 22 23 SET @i += 1 24 END 25 GO

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

1 TRUNCATE TABLE dbo.sp_table_pages 2 INSERT INTO dbo.sp_table_pages 3 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列的值。

如果你從字節(jié)存儲級別分析聚集索引記錄的話,你會發(fā)現(xiàn)SQL Server這里使用下列字節(jié)信息:

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

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

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

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 NULL 10 ) 11 GO 12 13 -- Create a non unique clustered index 14 CREATE CLUSTERED INDEX idx_Customers_CustomerID 15 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 VALUES 13 ( 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 VALUES 20 ( 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 VALUES 28 ( 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 += 1 36 END 37 GO

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

1 TRUNCATE TABLE dbo.sp_table_pages 2 INSERT INTO dbo.sp_table_pages 3 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

我們發(fā)現(xiàn),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的地方是在數(shù)據(jù)頁,就是保存實際數(shù)據(jù)的地方。下圖是我們聚集聚集索引里的中間層,你會看到UNIQUIFIER在這里是保存的。

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

最后我們看看數(shù)據(jù)頁14633:

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

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

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

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

posted on 2015-06-10 16:18 NET未來之路 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/lonelyxmas/p/4566390.html

總結

以上是生活随笔為你收集整理的索引键的唯一性(2/4):唯一与非唯一聚集索引的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美一区二区高清 | 欧美日韩免费观看视频 | 图片区小说区视频区 | 正在播放木下凛凛xv99 | 日韩中文在线字幕 | 黄页嫩草 | 99国产精品久久久久 | 丝袜美腿亚洲一区二区图片 | 人妖被c到高潮欧美gay | 激情久久一区 | 国产91精品一区二区麻豆亚洲 | 亚洲综合在 | 欧美日韩国产精品综合 | wwwxxx日本人| h在线免费 | 欧美精品不卡 | 国产欧美一区二区三区在线看蜜臀 | 色呦呦一区 | 色婷婷中文 | 日本一本久草 | 色婷婷一区二区 | 免费观看成年人网站 | 欧美女人交配视频 | 青青草婷婷 | 天天弄天天操 | 免费的黄色一级片 | 操亚洲美女 | 亚洲成人免费在线观看 | 成人亚洲欧美 | 奇米影视四色777 | 午夜网页 | 午夜91 | 黄色网在线播放 | 中文字幕免费在线看线人动作大片 | 99色播 | av射进来| 国产 日韩 欧美 精品 | 亚洲欧洲精品成人久久奇米网 | 久久艹久久| 五月天久久久 | 精品欧美一区二区三区在线观看 | 性感美女高潮 | 操操日| 色网站视频| 免费成人美女在线观看 | 玖玖精品| 麻豆网| 日韩 国产 在线 | 18精品爽国产白嫩精品 | 男生坤坤放进女生坤坤里 | 免费在线观看黄视频 | 性猛交xxxx乱大交3 | 亚州av片 | 日韩在线播放av | 日韩一区二区三区免费 | 欧美性插动态图 | 午夜在线观看视频18 | 美女被啪羞羞粉色视频 | 夜夜夜夜爽 | 欧美丰满bbw | 天天狠狠| 真实乱视频国产免费观看 | 青娱乐青青草 | 内裤摩擦1v1h | 少妇裸体性生交 | 亚洲三级成人 | 亚洲av无码不卡一区二区三区 | 欧美亚洲国产精品 | 禁久久精品乱码 | 国产日韩网站 | 精品乱码一区内射人妻无码 | 国产女人高潮视频 | 黄视频网站免费看 | 91成年视频 | 欧美精品久久久久久久免费 | 亚洲天堂无吗 | 美攻壮受大胸奶汁(高h) | 久久手机看片 | 上海毛片 | 秋霞自拍 | 成人小视频免费在线观看 | 无码av天堂一区二区三区 | 久久国产香蕉 | 91国产精品一区 | 亚洲成人一区二区在线观看 | av怡红院 | 韩国伦理片免费看 | 久久久国产高清 | 成人激情自拍 | 久久精品网 | 天天爽夜夜爽一区二区三区 | 亚洲欧美乱综合图片区小说区 | 日韩电影网址 | 成人av综合网 | 色婷婷婷婷色 | 狠狠插影院 | 免费看成人毛片 | 国产成人无码aa精品一区 | 中文字幕一区二区三区在线不卡 |