没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
SQL Server 2005 编程入门经典(第 2 版)
制作:badnewfish
联系:http://badnewfish.cnblogs.com
索引是数据库设计和系统维护的关键部分。它们为 SQL Server(以及就此而言的任何其
他的数据库系统)提供了查询数据和获得数据物理位置的快捷方式的其他方法。添加正确的
索引能够减少查询之外操作所占的 大量时间。遗憾的是,许多设计很差的索引实际上会增
加查询运行所花费的时间。毫无疑问,索引趋向于成为一种 SQL Server 提供的最令人误解的
对象,因此索引也趋向于成为一种最容易管理不当的对象。
本章将从开发者和管理者的角度学习索引,但是为了理解索引,也需要理解在 SQL
Server 中是如何存储数据的。因此,本章将首先介绍 SQL Server 的数据存储机制。
9.1 SQL Server 存储
在 SQL Server 中的数据可以看作是存在于一种层次结构中的对象。这种层次结构相当简
单。在这种层次结构中的一些对象是您将要直接处理的,并且将因此很容易地 理解它们。
少数其他的一些对象存在于隐蔽处,虽然在某些情况下可以直接处理它们,但是在通常情况
下是不可以的。下面将逐个介绍。
9.1.1 数据库
数据库比较容易。我听见人们说:“数据库,我知道的。”是的,您可能知道,但是因
为它是存储定义的最高层次(对于给定的服务器),所以我在这里将它作为独特的实体指出。
尽管您不能明确地创建一个数据库层次的锁,但这是可以建立锁的最高层次。
提示:
锁既是系统使用的保持标记,也是放置标记。当您使用 SQL Server 进行开发时—— 或
者就此而言的其他数据库—— 您将发现理解和管理锁对于系统而言是绝对关键的。
将在第 14 章中详尽地介绍锁,但是首先介绍在查看存储时顺便讨论的 SQL Server 中对
象的可锁定性。
9.1.2 盘区
盘区是存储的基本单元,这些存储用来为表和索引分配空间。它由 8 个连续的 64K 数据
页面组成。
在盘区(而不是实际使用空间)基础上分配空间的概念,对于习惯于操作系统存储原理的
人们而言可能稍微难于理解。关于盘区的要点包括:
● 一旦盘区已满,那么下一个记录将要占据的不是记录的大小,而是整个新盘
区的大小。许多 SQL Server 的新手在空间估计上犯错误,一部分原因是由于一次分
配一个盘区而不是一个记录。
● 通过预先分配空间,SQL Server 节省了为每个记录分配新空间的时间。
只是因为添加了过多的行以适合当前分配的分区,所以可能看起来占用整个盘区是一种
浪费,但是这种方法浪费的空间数量一般不是非常多。尽管如此,它可以累加——特别在片
段较多的环境中——所以它是您应当紧记的确切内容。
占据所有空间的好消息是 SQL Server 跳过了一些分配时间的系统开销。不需要担心每次
写入一行时的分配问题,SQL Server 仅仅当需要新的盘区时才处理额外的空间分配。
提示:
不要将盘区占据的空间和数据库占有的空间相互混淆。不管将哪些空间分配给数据库,
将看到从磁盘驱动器的可用空间上消失的内容。盘区仅仅是事物在由数据库保存的整个空间
内按照顺序分配的方式。
9.1.3 页面
在数据库中和盘区很相似的内容是分配单元,页面是在特定盘区内的分配单元。每一个
盘区包含 8 个页面。
页面是在到达实际数据行之前所达到的最后一个层次。尽管每一个盘区中的页面数目是
固定的,但是每一个页面中的行数目不是固定的——这完全取决于行的大小,而行的大小是
可以变化的。可以把页面认为是既用于表又用于索引行数据的容器。不允许在页面之间进行
拆分。
有许多种不同的页面类型。对于本书的目的而言,所关心的类型包括:
● 数据:数据页面是自解释的——它们是在表中的实际数据,例外情况是任何
没有以 text in row 选项或者 varchar(max)定义的 BLOB 数据。
● 索引:索引页面也是相当直观的——它们既拥有非群集索引的非叶层次的页
面,也拥有叶层次的页面(将要在本章后面研究这些内容),而且也拥有群集索引的非
叶层次的页面。通过本章的继续叙述,将更加了解这些索引类型。
页面拆分
当页面已满时,可对其进行拆分。这意味着多个新的页面被分配——它也意味着来自现
有页面上的将近一半的数据被移动到新的页面上。
当使用群集索引时,对于这个过程而言是个例外。如果有一个群集索引,而且下一个插
入的行将在物理上作为表中最后的记录定位,那么创建新的页面,并且将新的行添加到这个
新的页面,而不需要重新定位任何现有的数据。当研究索引时,将要看到更多的页面拆分。
9.1.4 行
您将要看到许多关于“行层次锁定”的内容,所以在听到这个术语时不应感到惊讶。行
可以最大达到 8KB。
除了 8 060 字符的限制,还有最大 1 024 列的限制。实际上,当达到 8060 字符限制之前,
您将会发现到达用完允许的最多列的情况是不常见的。1 024 提供了 8 个字节的平均列宽度。
对于大多数使用情况,您将会很容易超出这个限制。这方面的例外情况可能是在度量和统计
信息中——其中有很多的不同内 容,这些是您正在存储的数值的例子
9.2 理解索引
Webster 的字典定义索引如下:
提示:
通常以一些指定数据(如作者、主题或者关键字)的字母顺序排列的列表(作为著作的主要
部分的目录信息或者引用)。
我将要在数据库上下文中使用较为简单的方法,并且将它介绍为一种快速到达数据的潜
在方法。尽管如此,Webster 的定义不是太坏——甚至对于特定的目的而言。
也许在 Webster 的定义中指出的关键内容是单词“通常”。“字母顺序”的定义根据许
多规则而变化。例如,在 SQL Server 中,有许多不同的可用整理选项。其中一些选项如下:
● 二进制:根据字符的数字表示排序(例如,以 ASCII 码的形式,用数字 32 表示
空格,用 68 表示字母“D”,但是用 100 表示字母“d”)。因为每个内容 都是数字,
所以这是最快的选择—— 遗憾的是,它完全不是人们思考的方式,并且在 WHERE
子句中进行比较时,使用这种选项会带来严重的负面影响。
● 字典顺序:这种排序方式与期望在字典中看到的排序方式一样,但是具有变
通——您可以设置许多不同的额外选项来决定是否区分大小写、音调和字符集。
如果告诉 SQL Server 注意大小写,那么“A”将和“a”不相等,理解这一点相当简单。同
样地,如果告诉 SQL Server 不区分大小写,那么“A”将和“a”相等。当您添加音调区分时,
事情变得使人困惑——也就是说,SQL Server 注意可区别的标记,因此“a”和“á”是不同的,
和“à”也不同。以下情况会使许多人变得甚至更加困惑:整理顺序如何不仅影响数据的等式,
而且影响排序的顺序(从而影响在索引中存储它的方式)。
通过示例的方法,查看在表 9-1 中的一些整理选项的等式,以及它们对排序顺序和等式
信息的影响。见表 9-1。
表 9-1
整 理 顺 序 比 较 值 索引存储顺序
字典顺序、区分大小写、区
分音调(默认值)
A = a = à = á = â = Ä =
ä = Å = å
a, A, à, â, á, Ä, ä,
Å, å
字典顺序、区分大小写、区
分音调、大写字母优先
A = a = à = á = â = Ä =
ä = Å = å
A, a, à, â, á, Ä, ä,
Å, å
字典顺序、区分大小写
A _ a, Ä _ ä, Å _ å,
a _ à _ á _ â _ ä _ å,
A_ Ä _ Å
A, a, à, á, â, Ä, ä,
Å, å
这里的 要点在于:在索引中所发生的情况取决于为数据建立的整理信息。可以在数据
库或者列的层次上设置整理,所以在控制级别上有相当好的粒度。如果假定服务器是区 分
大小写的,那么需要确保系统文件处理这一点,或者有更好的关于技术支持电话的计划——
特别是如果您正在美国之外进行销售。设想您是独立的软件供应商 (ISV),并且您将产品销
售给在现有的服务器上安装它的顾客(对于顾客而言,这似乎是完全合理的事情),但是现有
的服务器碰巧是已经设置为区分大小写的 老式服务器。您将会接收到来自非常不满意的顾
客的电话,要求相关的技术支持。
注意:
一旦设置了整理顺序,改变它是非常重要的(但是可能的),所以在设置之前确定需要的
整理顺序。
9.2.1 平衡树(B-树)
平衡树或 B-Tree 的概念当然不是伴随着 SQL Server 一起创建的。实际上,在数据库内外
有非常多的索引系统使用平衡树。
平衡树 仅仅试图提供一种一致的并且相对低成本的方法,该方法用于查找特定的信息
块。名称中的“平衡”是自描述的——平衡树是自平衡的(只有很少的例外情况),这 意味
着每次树的分支都有接近一半的数据在一边,而另一半数据在另一边。名称中的“树”在这
一点上可能也是非常明显的——当您绘制该结构,然后完全颠倒它 时,该结构具有树的一
般形式,因此称为树。
平衡树在根节点处开始(另一个类似于树的方面,但不是最后的方面)。如果有少量的数
据,这个根节点能够直接指向数据的实际位置。在这种情况下,您将最终获得看起来如图 9-
1 所示的结构。
所以,在根节点开始并浏览记录,直到找到最后一页,该页开始于小于正在查找值的数
值。然后获得指向该节点的一个指针,并且浏览它,直到找到想要的行。
图 9-1
然而,在大多数情况下,有太多通过根节点引用的 数据,所以根节点指向中间的节点
——或者称为非叶层次的节点。非叶层次的节点是在根节点和告诉您数据物理存储位置的节
点之间的节点。非叶层次的节点可以指 向其他非叶层次的节点,或者指向叶层次的节点(最
后一个类似于树的引用)。叶层次的节点是在其中获得实际物理数据的引用的节点。树叶是
定位实际树的路线的 末端,与此类似,在叶层次上所到达的节点是用于索引的行的末端—
—从这里,可以直接到达在其上有数据的实际数据节点。
从图 9-2 中可以看出,开始于根节点,然后移动 到以如下最高值开始的节点:等于或者
略小于所寻找的值,并且也是在下一个层次上的最高值。然后重复这个过程——寻找具有等
于或者小于所寻找值的最高起始值 的节点。继续沿着树一层一层往下,直到到达叶层次—
—从叶节点中知道数据的物理位置,并且可以很快地定位它。
图 9-2
页面拆分——简介
所有这些在等式的阅读方面工作良好——它是有点 需要技巧的插入。回顾一下,在 B-
树中的 B 代表平衡(Balanced)。您也可以回顾一下,前面提到每次当您遇到树中的分支时,
因为大约一半的数据是在 任意一边的,所以 B-树是平衡的。因为添加新数据到树上的方法
一般可避免它们的不平衡,所以 B-树有时候被认为是自平衡的。
当添加数据到树上时,节点将要最终填满,并且将需要拆分。因为在 SQL Server 中,一
个节点等于一个页面——这称为页面拆分,在图 9-3 中解释。
提示:
当页面拆分发生时,数据自动地四处移动以保持内容上的平衡。数据的前半部分保留在
旧的页面上,而数据的剩余部分添加到新的页面—— 这样您有大约对半的拆分,并且您的
树保持平衡。
图 9-3
如果考虑这个拆分过程,将认识到它在拆分时增加了大量系统开销。没有插入一页,而
是:
● 创建新的页面
● 将行从现有的页面移动到新的页面上
剩余95页未读,继续阅读
资源评论
- 撼地神牛2012-10-08看了之后发现不错,就是内容简单了点
wangzheji
- 粉丝: 3
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功