SQL Server表和索引处理

SQL Server中在表结构与索引的原理方面还是有所不同的。这篇文章将简单总结一下SQL Server的表和索引的原理。[@more@]

表的结构如下图:
(贴图真是麻烦)


分区是用户定义的数据组织单元。默认情况下,表或索引只有一个分区,其中包含所有的表页或索引页。该分区驻留在单个文件组中。
当表或索引使用多个分区时,数据将被水平分区,以便根据指定的列将行组映射到各个分区。分区可以放在数据库中的一个或多个文件组中。


聚集表是有聚集索引的表。
数据行基于聚集索引键按顺序存储。聚集索引按 B 树索引结构实现,B 树索引结构支持基于聚集索引键值对行进行快速检索。
就是oracle里面的IOT表。


堆是没有聚集索引的表。
数据行不按任何特殊的顺序存储,数据页也没有任何特殊的顺序,也就是一般的表格。


非聚集索引,非聚集索引与聚集索引有一个相似的 B 树索引结构。不同的是,非聚集索引不影响数据行的顺序。
也就是普通的索引。

聚集索引设计指南

在创建聚集索引之前,应先了解数据是如何被访问的。考虑对具有以下特点的查询使用聚集索引:

使用运算符(如 BETWEEN、>、>=、< 和 <=)返回一系列值。
使用聚集索引找到包含第一个值的行后,便可以确保包含后续索引值的行物理相邻。例如,如果某个查询在一系列销售订单号间检索记录,SalesOrderNumber 列的聚集索引可快速定位包含起始销售订单号的行,然后检索表中所有连续的行,直到检索到最后的销售订单号。
返回大型结果集。
使用 JOIN 子句;一般情况下,使用该子句的是外键列。
使用 ORDER BY 或 GROUP BY 子句。
在 ORDER BY 或 GROUP BY 子句中指定的列的索引,可以使数据库引擎 不必对数据进行排序,因为这些行已经排序。这样可以提高查询性能。
一般情况下,定义聚集索引键时使用的列越少越好
唯一或包含许多不重复的值
按顺序被访问
经常用于对表中检索到的数据进行排序。按该列对表进行聚集(即物理排序)是一个好方法,它可以在每次查询该列时节省排序操作的成本。

聚集索引不适用于具有下列属性的列:

频繁更改的列
这将导致整行移动,因为数据库引擎 必须按物理顺序保留行中的数据值。这一点要特别注意,因为在大容量事务处理系统中数据通常是可变的。
宽键
宽键是若干列或若干大型列的组合。所有非聚集索引将聚集索引中的键值用作查找键。为同一表定义的任何非聚集索引都将增大许多,这是因为非聚集索引项包含聚集键,同时也包含为此非聚集索引定义的键列。


分配单元
分配单元是堆或 B 树内用于根据页类型管理数据的页集合。sqlserver中有三种分配单元:
IN_ROW_DATA:包含除大型对象 (LOB) 数据以外的所有数据的数据行或索引行。页的类型为 Data 或 Index。
LOB_DATA:以下列一种或多种数据类型存储的大型对象数据,页的类型为 Text/Image。
ROW_OVERFLOW_DATA:存储在超过 8,060 字节行大小限制的 varchar、nvarchar、varbinary 或 sql_variant 列中的可变长度数据。页的类型为 Data。


SQL Server中索引的限制:
最大索引限制 值 其他信息
每个表的聚集索引数 1
每个表的非聚集索引数 249 包括使用 PRIMARY KEY 或 UNIQUE 约束创建的非聚集索引,但不包括 XML 索引。
每个表的 XML 索引数 249 包括 XML 数据类型列的主 XML 索引和辅助 XML 索引。
每个索引的键列数 16 索引键的最大大小.
最大索引键记录大小 900 字节 与 XML 索引无关。


注意:可以通过在索引中包含非键列以避免受非聚集索引的索引键列和记录大小的限制,即创建具有包含性列的索引。


具有包含性列的索引
可以将非键列包含在非聚集索引中,以避免超过当前索引大小的限制(最大键列数为 16,最大索引键大小为 900 字节)。数据库引擎 计算索引键列数或索引键大小时,不考虑非键列。
例如:
假设要为 AdventureWorks 示例数据库的 Document 表中的以下列建立索引:

Title nvarchar(50)

Revision nchar(5)

FileName nvarchar(400)

因为 nvarchar 数据类型要求每个字符 2 个字节,所以包含这三列的索引将超过 900 字节的大小限制,多了 10 个字节 (455 * 2)。使用 CREATE INDEX 语句的 INCLUDE 子句,可以将索引键定义为 (Title, Revision),将 FileName 定义为非键列。这样,索引键大小将为 110 个字节 (55 * 2),并且索引仍将包含所需的所有列。下面的语句就创建了这样的索引。

USE AdventureWorks;
GO
CREATE INDEX IX_Document_Title
ON Production.Document (Title, Revision)
INCLUDE (FileName);


修改已定义为包含性列的表列时,要受下列限制:
除非先删除索引,否则无法从表中删除非键列。
除进行下列更改外,不能对非键列进行其他更改:
将列的为空性从 NOT NULL 改为 NULL。
增加 varchar、nvarchar 或 varbinary 列的长度。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/100091/viewspace-995875/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/100091/viewspace-995875/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值