SQL Server如何在变长列上存储索引
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了SQL Server如何在变长列上存储索引,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3051字,纯文字阅读大概需要5分钟。
内容图文
![SQL Server如何在变长列上存储索引](/upload/InfoBanner/zyjiaocheng/450/1eb9bbe94e0a4ca3a068aab97b791af7.jpg)
1 -- Create a new table 2 CREATE TABLE Customers 3 ( 4 CustomerName VARCHAR(255) NOT NULL PRIMARY KEY, 5 Filler CHAR(138) NOT NULL 6 ) 7 GO 8 9 -- Insert 80.000 records 10 DECLARE @i INT = 1 11 WHILE (@i <= 80000) 12 BEGIN 13 INSERT INTO Customers VALUES 14 ( 15 ‘CustomerName‘ + CAST(@i AS VARCHAR), 16 ‘Filler‘ + CAST(@i AS VARCHAR) 17 ) 18 19 SET @i += 1 20 END 21 GO
从代码里我们可以看到,我在VARCHAR(255)列上建立了主键约束,SQL Server会强制这列为唯一聚集索引。接下来我们通过DMV sys.dm_db_index_physical_stats来获取聚集索引的相关物理信息:
1 -- Retrieve physical information about the clustered index 2 SELECT * FROM sys.dm_db_index_physical_stats 3 ( 4 DB_ID(‘ALLOCATIONDB‘), 5 OBJECT_ID(‘Customers‘), 6 NULL, 7 NULL, 8 ‘DETAILED‘ 9 ) 10 GO
从输出结果可以看出,在索引页里,min_record_size_in_bytes列的值是7,max_record_size_in_bytes列的值是28。我们据此可以得出结论:在索引记录内部,聚集键是以变长列保存的。我们建立一个帮助表来存储DBCC IND的输出信息来做进一步分析。
1 -- Create a helper table 2 CREATE TABLE HelperTable 3 ( 4 PageFID TINYINT, 5 PagePID INT, 6 IAMFID TINYINT, 7 IAMPID INT, 8 ObjectID INT, 9 IndexID TINYINT, 10 PartitionNumber TINYINT, 11 PartitionID BIGINT, 12 iam_chain_type VARCHAR(30), 13 PageType TINYINT, 14 IndexLevel TINYINT, 15 NextPageFID TINYINT, 16 NextPagePID INT, 17 PrevPageFID INT, 18 PrevPagePID INT, 19 PRIMARY KEY (PageFID, PagePID) 20 ) 21 GO 22 23 -- Write everything in a table for further analysis 24 INSERT INTO HelperTable EXEC(‘DBCC IND(ALLOCATIONDB, Customers, 1)‘) 25 GO 26 27 -- Retrieve the root index page (1 page) 28 SELECT * FROM HelperTable 29 WHERE IndexLevel = 2 30 GO
我这里的根页是15058,我们使用DBCC PAGE命令查看下这个根页(记得先执行 DBCC TRACEON(3604))。
1 DBCC TRACEON (3604) 2 GO 3 --Dump out the root index page 4 DBCC PAGE(ALLOCATIONDB, 1, 15058, 1) 5 GO
即如下所示的数字:
00000000: 269d3b00 00010001 001b0043 7573746f ?&.;........Custo 00000010: 6d65724e 616d6531 333533?????????????merName1353
我们来分析下这些16进制值:
26 95020000 0100 0100 1b00 43757374 6f6d6572 4e616d65 31333533
- 26 第1个字节代表状态位
- 95020000 这4个字节代表索引记录指向的子页id(child-page-id)
- 0100 这2个字节代表索引记录指向的子文件id(child-file-id)
- 0100 这2个字节代表变长列数
- 1b00 这2个字节代表每个变长列结束为止的偏移量。每个变长列需要2字节。这个和在数据页里存储变长列一致。这里我们有1个变长列,因此SQL Server需要1个 2 byte的偏移量——27 byte的偏移量。这就是说下一个字节一直到27 byte的偏移量都是我们变长列(聚集键)的组成部分。
- 43757374 6f6d6572 4e616d65 31333533 聚集键的16进制值,即CustomerName列。
从上面的解释,我们可以看出SQL Server存储变长索引列格式和数据页里存储变长列格式是一样的。但你要知道有一点额外开销,因为你需要额外2 bytes 来存储变长列个数,对于每个变长列在变长列偏移数组里需要2 bytes。在设计索引和计算一个索引页存放多少索引记录时,要留意这些存储开销。
SQL Server如何在变长列上存储索引
标签:
本文系统来源:http://www.cnblogs.com/woodytu/p/4576689.html
内容总结
以上是互联网集市为您收集整理的SQL Server如何在变长列上存储索引全部内容,希望文章能够帮你解决SQL Server如何在变长列上存储索引所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。