SQL Server存储机制

1、数据库

2、区段
区段是为表和索引分配空间的

3、页
每个区段包涵8页。
页类型:数据、索引。
1)页拆分

4、行
行最大可达8KB。1024列

5、稀疏列(高级)
SQL Server2008新的数据结构。
列数可达30000列。

理解索引

排序规则:二进制、字典顺序

1、平衡树(B-树)
1)页拆分简介
拆分过程:
创建新页
将行从现有的页移动到新页上
将新行添加到其中一页上
在父节点中添加另一个记录项

2、SQL Server中访问数据的方式
1)使用表扫描
从头到尾进行查找,使用EXISTS可以优化效率
2)使用索引
使用索引的工作原理类似于EXISTS运算符。
3)索引类型和索引导航
3种索引类型:群集索引、非群集索引(分为2种:堆上的,群集表上的)
索引都是叶级和非叶级页,叶集页是存储标识记录的‘键’级别,非叶级可以导向叶级。

3.1)群集表
具有群集索引的表,如果你的值不是唯一标识的,那么软件将会在内部强制将他变成唯一标识的。
3.2)堆
没有群集索引的任意表。
4)群集索引
一个表只能有一个群集索引。
群集索引的的叶级就是实际的数据。
5)导航树
查找某个范围内的值,利用平衡二叉树数据结构,某些结点的结尾不在这个范围的最大值内,那么可以不需要检查,直接到下一个结点再进行判断是否大于这个范围内的最大值。
6)堆上的非群集索引
和群集索引差不多,但是到叶级结点后还不能获取到值,需要通过叶级节点的指针进行值获取。
7)群集表上的非群集索引(比较难明白)
通过某种条件然后到达群集索引位置,在进行查找。

创建、修改和删除索引

两种方式创建索引:
通过显示的CREATE INDEX命令。
在创建约束时作为隐含的对象。

1、CREATE INDEX 语句
基本语法:(详细语法见书)
CREATE [UNIQUE] [CLUSTERED|NONCLUSTERED]
INDEX <索引名> ON <表或视图名>(<列名> [ASC|DESC] [,…n])
1)ASC|DESC
排序索引
2)INCLUDE
将列放在叶级上。
3)WITH
创建索引后门还需要的选项。
4)PAD_INDEX
第一次创建索引时,非叶级页有多满的开关 。
5)FILLFACTOR
创建索引时,非叶级页有多满,百分比。
6)IGNORE_DUP_KEY
出错不会进行回滚,但是还是不会更改数据。
7)DROP_EXISTING
指定这个选项,那么现有索引将在构建新索引前被删除
8)STATISTICS_NORECOMPUTE
统计更新信息。
9)SORT_IN_TEMPDB
位于独立的物理设备上时才有意义
10)ONLINE
强制表对一般访问有效。
11)ALLOW ROW / PAGE LOCKS(高级主题)
用于索引是否允许行锁和页锁。
12)MAXDOP
用于并行。
13)ON
用于将索引和数据分开存放。

2、创建XML索引(未看)

明智的选择——在何时何地使用何种索引

1、选择性
仅次于像“多长时间使用一次?”这样的问题。

2、注意成本

3、选择群集索引
如果不想声明为群集索引,那么在创建表的时候添加上NONCLUSTERED关键字。
1)正面观点
列常作为查询,使用群集索引。
2)反面观点
经常插入的列。

4、列顺序问题

5、修改索引
基本语法:
ALTER INDEX ( <索引名>|ALL)
ON <表或视图名>
1)索引名
2)表名或视图名
3)REBUILD
完全丢弃旧的索引生成新的索引。
4)DISABLE
让索引离线。
5)REORGANIZE
重新组织索引,但不会影响非叶级。

6、删除索引
语法:DROP INDEX <表或者视图名>.<索引名>
7、从查询计划中获取提示

8、使用数据库引擎调整向导

维护索引

1、碎片
2、确定碎片和页拆分的可能性