




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一 为什么要创建索引呢 优点 这是因为 创建索引可以大大提高系统的性能 第一 通过创建唯一性索引 可以保证数据库表中每一行数据的唯一性 第二 可以大大加快数据的检索速度 这也是创建索引的最主要的原因 第三 可以加速表和表之间的连接 特别是在实现数据的参考完整性方面特别有意义 第四 在使用分组和排序子句进行数据检索时 同样可以显著减少查询中分组和排序的时间 第五 通过使用索引 可以在查询的过程中 使用优化隐藏器 提高系统的性能 二 建立方向索引的不利因素 缺点 也许会有人要问 增加索引有如此多的优点 为什么不对表中的每一个列创建一个索引呢 这 种想法固然有其合理性 然而也有其片面性 虽然 索引有许多优点 但是 为表中的每一个 列都增加索引 是非常不明智的 这是因为 增加索引也有许多不利的一个方面 第一 创建索引和维护索引要耗费时间 这种时间随着数据量的增加而增加 第二 索引需要占物理空间 除了数据表占数据空间之外 每一个索引还要占一定的物理空 间 如果要建立聚簇索引 那么需要的空间就会更大 第三 当对表中的数据进行增加 删除和修改的时候 索引也要动态的维护 这样就降低了 数据的维护速度 三 创建方向索引的准则 索引是建立在数据库表中的某些列的上面 因此 在创建索引的时候 应该仔细考虑在哪些列 上可以创建索引 在哪些列上不能创建索引 一般来说 应该在这些列上创建索引 第一 在经常需要搜索的列上 可以加快搜索的速度 第二 在作为主键的列上 强制该列的唯一性和组织表中数据的排列结构 第三 在经常用在连接的列上 这些列主要是一些外键 可以加快连接的速度 第四 在经常需要根据范围进行搜索的列上创建索引 因为索引已经排序 其指定的范围是 连续的 第五 在经常需要排序的列上创建索引 因为索引已经排序 这样查询可以利用索引的排序 加快排序查询时间 第六 在经常使用在 WHERE 子句中的列上面创建索引 加快条件的判断速度 同样 对于有些列不应该创建索引 一般来说 不应该创建索引的的这些列具有下列特点 第一 对于那些在查询中很少使用或者参考的列不应该创建索引 这是因为 既然这 些列很少使用到 因此有索引或者无索引 并不能提高查询速度 相反 由于增加了索引 反 而降低了系统的维护速度和增大了空间需求 第二 对于那些只有很少数据值的列也不应该增加索引 这是因为 由于这些列的取 值很少 例如人事表的性别列 在查询的结果中 结果集的数据行占了表中数据行的很大比例 即需要在表中搜索的数据行的比例很大 增加索引 并不能明显加快检索速度 第三 对于那些定义为 text image 和 bit 数据类型的列不应该增加索引 这是因为 这些列的数据量要么相当大 要么取值很少 第四 当修改性能远远大于检索性能时 不应该创建索引 这是因为 修改性能和检 索性能是互相矛盾的 当增加索引时 会提高检索性能 但是会降低修改性能 当减少索引时 会提高修改性能 降低检索性能 因此 当修改性能远远大于检索性能时 不应该创建索引 四 创建索引的方法 创建索引有多种方法 这些方法包括直接创建索引的方法和间接创建索引的方法 第一 直接创建索引 例如使用 CREATE INDEX 语句或者使用创建索引向导 第二 间接创建索引 例如在表中定义主键约束或者唯一性键约束时 同时也创建了索引 虽然 这两种方法都可以创建索引 但是 它们创建索引的具体内容是有区别的 使用 CREATE INDEX 语句或者使用创建索引向导来创建索引 这是最基本的索引创建方式 并且这种方法最具有柔性 可以定制创建出符合自己需要的索引 在使用这种方式创建索引时 可以使用许多选项 例如指定数据页的充满度 进行排序 整理统计信息等 这样可以优化索 引 使用这种方法 可以指定索引的类型 唯一性和复合性 也就是说 既可以创建聚簇索引 也可以创建非聚簇索引 既可以在一个列上创建索引 也可以在两个或者两个以上的列上创建 索引 通过定义主键约束或者唯一性键约束 也可以间接创建索引 主键约束是一种保持数据完整性 的逻辑 它限制表中的记录有相同的主键记录 在创建主键约束时 系统自动创建了一个唯一 性的聚簇索引 虽然 在逻辑上 主键约束是一种重要的结构 但是 在物理结构上 与主键 约束相对应的结构是唯一性的聚簇索引 换句话说 在物理实现上 不存在主键约束 而只存 在唯一性的聚簇索引 同样 在创建唯一性键约束时 也同时创建了索引 这种索引则是唯一 性的非聚簇索引 因此 当使用约束创建索引时 索引的类型和特征基本上都已经确定了 由 用户定制的余地比较小 当在表上定义主键或者唯一性键约束时 如果表中已经有了使用 CREATE INDEX 语句创建的 标准索引时 那么主键约束或者唯一性键约束创建的索引覆盖以前创建的标准索引 也就是说 主键约束或者唯一性键约束创建的索引的优先级高于使用 CREATE INDEX 语句创建的索引 五 索引的特征 索引有两个特征 即唯一性索引和复合索引 唯一性索引保证在索引列中的全部数据是唯一的 不会包含冗余数据 如果表中已经有一个主 键约束或者唯一性键约束 那么当创建表或者修改表时 SQL Server 自动创建一个唯一性索引 然而 如果必须保证唯一性 那么应该创建主键约束或者唯一性键约束 而不是创建一个唯一 性索引 当创建唯一性索引时 应该认真考虑这些规则 当在表中创建主键约束或者唯一性键 约束时 SQL Server 自动创建一个唯一性索引 如果表中已经包含有数据 那么当创建索引时 SQL Server 检查表中已有数据的冗余性 每当使用插入语句插入数据或者使用修改语句修改数 据时 SQL Server 检查数据的冗余性 如果有冗余值 那么 SQL Server 取消该语句的执行 并且返回一个错误消息 确保表中的每一行数据都有一个唯一值 这样可以确保每一个实体都 可以唯一确认 只能在可以保证实体完整性的列上创建唯一性索引 例如 不能在人事表中的 姓名列上创建唯一性索引 因为人们可以有相同的姓名 复合索引就是一个索引创建在两个列或者多个列上 在搜索时 当两个或者多个列作为一个关 键值时 最好在这些列上创建复合索引 当创建复合索引时 应该考虑这些规则 最多可以把 16 个列合并成一个单独的复合索引 构成复合索引的列的总长度不能超过 900 字节 也就是 说复合列的长度不能太长 在复合索引中 所有的列必须来自同一个表中 不能跨表建立复合 列 在复合索引中 列的排列顺序是非常重要的 因此要认真排列列的顺序 原则上 应该首 先定义最唯一的列 例如在 COL1 COL2 上的索引与在 COL2 COL1 上的索引是不相 同的 因为两个索引的列的顺序不同 为了使查询优化器使用复合索引 查询语句中的 WHERE 子句必须参考复合索引中第一个列 当表中有多个关键列时 复合索引是非常有用的 使用复合索引可以提高查询性能 减少在一个表中所创建的索引数量 六 索引的类型 根据索引的顺序与数据表的物理顺序是否相同 可以把索引分成两种类型 一种是数据表的物 理顺序与索引顺序相同的聚簇索引 另一种是数据表的物理顺序与索引顺序不相同的非聚簇索 引 七 聚簇索引的体系结构 索引的结构类似于树状结构 树的顶部称为叶级 树的其它部分称为非叶级 树的根部在非叶 级中 同样 在聚簇索引中 聚簇索引的叶级和非叶级构成了一个树状结构 索引的最低级是 叶级 在聚簇索引中 表中的数据所在的数据页是叶级 在叶级之上的索引页是非叶级 索引 数据所在的索引页是非叶级 在聚簇索引中 数据值的顺序总是按照升序排列 应该在表中经常搜索的列或者按照顺序访问的列上创建聚簇索引 当创建聚簇索引时 应该考 虑这些因素 每一个表只能有一个聚簇索引 因为表中数据的物理顺序只能有一个 表中行的 物理顺序和索引中行的物理顺序是相同的 在创建任何非聚簇索引之前创建聚簇索引 这是因 为聚簇索引改变了表中行的物理顺序 数据行按照一定的顺序排列 并且自动维护这个顺序 关键值的唯一性要么使用 UNIQUE 关键字明确维护 要么由一个内部的唯一标识符明确维护 这些唯一性标识符是系统自己使用的 用户不能访问 聚簇索引的平均大小大约是数据表的百 分之五 但是 实际的聚簇索引的大小常常根据索引列的大小变化而变化 在索引的创建过程 中 SQL Server 临时使用当前数据库的磁盘空间 当创建聚簇索引时 需要 1 2 倍的表空间的 大小 因此 一定要保证有足够的空间来创建聚簇索引 当系统访问表中的数据时 首先确定在相应的列上是否存在有索引和该索引是否对要检索的数 据有意义 如果索引存在并且该索引非常有意义 那么系统使用该索引访问表中的记录 系统 从索引开始浏览到数据 索引浏览则从树状索引的根部开始 从根部开始 搜索值与每一个关 键值相比较 确定搜索值是否大于或者等于关键值 这一步重复进行 直到碰上一个比搜索值 大的关键值 或者该搜索值大于或者等于索引页上所有的关键值为止 八 非聚簇索引的体系结构 非聚簇索引的结构也是树状结构 与聚簇索引的结构非常类似 但是也有明显的不同 在非聚簇索引中 叶级仅包含关键值 而没有包含数据行 非聚簇索引表示行的逻辑顺序 非聚簇索引有两种体系结构 一种体系结构是在没有聚簇索引的表上创建非聚簇索引 另一 种体系结构是在有聚簇索引的表上创建非聚簇索引 如果一个数据表中没有聚簇索引 那么这个数据表也称为数据堆 当非聚簇索引在数据堆的顶 部创建时 系统使用索引页中的行标识符指向数据页中的记录 行标识符存储了数据所在位置 的信息 数据堆是通过使用索引分配图 IAM 页来维护的 IAM 页包含了数据堆所在簇的存 储信息 在系统表 sysindexes 中 有一个指针指向了与数据堆相关的第一个 IAM 页 系统使 用 IAM 页在数据堆中浏览和寻找可以插入新的记录行的空间 这些数据页和在这些数据页中的 记录没有任何的顺序并且也没有链接在一起 在这些数据页之间的唯一的连接是 IAM 中记录的 顺序 当在数据堆上创建了非聚簇索引时 叶级中包含了指向数据页的行标识符 行标识符指 定记录行的逻辑顺序 由文件 ID 页号和行 ID 组成 这些行的标识符维持唯一性 非聚簇索 引的叶级页的顺序不同于表中数据的物理顺序 这些关键值在叶级中以升序维持 当非聚簇索引创建在有聚簇索引的表上的时候 系统使用索引页中的指向聚簇索引的聚簇键 聚簇键存储了数据的位置信息 如果某一个表有聚簇索引 那么非聚簇索引的叶级包含了映射 到聚簇键的聚簇键值 而不是映射到物理的行标识符 当系统访问有非聚簇索引的表中数据时 并且这种非聚簇索引创建在聚簇索引上 那么它首先从非聚簇索引来找到指向聚簇索引的指针 然后通过使用聚簇索引来找到数据 当需要以多种方式检索数据时 非聚簇索引是非常有用的 当创建非聚簇索引时 要考虑这 些情况 在缺省情况下 所创建的索引是非聚簇索引 在每一个表上面 可以创建不多于 249 个非聚簇索引 而聚簇索引最多只能有一个 系统如何访问表中的数据 一般地 系统访问数据库中的数据 可以使用两种方法 表扫描和索引查找 第一种方法是表 扫描 就是指系统将指针放置在该表的表头数据所在的数据页上 然后按照数据页的排列顺序 一页一页地从前向后扫描该表数据所占有的全部数据页 直至扫描完表中的全部记录 在扫描 时 如果找到符合查询条件的记录 那么就将这条记录挑选出来 最后 将全部挑选出来符合 查询语句条件的记录显示出来 第二种方法是使用索引查找 索引是一种树状结构 其中存储 了关键字和指向包含关键字所在记录的数据页的指针 当使用索引查找时 系统沿着索引的树 状结构 根据索引中关键字和指针 找到符合查询条件的的记录 最后 将全部查找到的符合 查询语句条件的记录显示出来 在 SQL Server 中 当访问数据库中的数据时 由 SQL Server 确定该表中是否有索引存在 如果没有索引 那么 SQL Server 使用表扫描的方法访问数据库中的数据 查询处理器根据分 布的统计信息生成该查询语句的优化执行规划 以提高访问数据的效率为目标 确定是使用表 扫描还是使用索引 九 索引的选项 在创建索引时 可以指定一些选项 通过使用这些选项 可以优化索引的性能 这些选项包 括 FILLFACTOR 选项 PAD INDEX 选项和 SORTED DATA REORG 选项 使用 FILLFACTOR 选项 可以优化插入语句和修改语句的性能 当某个索引页变满时 SQL Server 必须花费时间分解该页 以便为新的记录行腾出空间 使用 FILLFACTOR 选项 就是 在叶级索引页上分配一定百分比的自由空间 以便减少页的分解时间 当在有数据的表中创建 索引时 可以使用 FILLFACTOR 选项指定每一个叶级索引节点的填充的百分比 缺省值是 0 该数值等价于 100 在创建索引的时候 内部索引节点总是留有了一定的空间 这个空间足够 容纳一个或者两个表中的记录 在没有数据的表中 当创建索引的时候 不要使用该选项 因 为这时该选项是没有实际意义的 另外 该选项的数值在创建时指定以后 不能动态地得到维 护 因此 只应该在有数据的表中创建索引时才使用 PAD INDEX 选项将 FILLFACTOR 选项的数值同样也用于内部的索引节点 使内部的索引节 点的填充度与叶级索引的节点中的填充度相同 如果没有指定 FILLFACTOR 选项 那么单独 指定 PAD INDEX 选项是没有实际意义的 这是因为 PAD INDEX 选项的取值是由 FILLFACTOR 选项的取值确定的 当创建聚簇索引时 SORTED DATA REORG 选项清除排序 因此可以减少建立聚簇索引所 需要的时间 当在一个已经变成碎块的表上创建或者重建聚簇索引时 使用 SORTED DATA REORG 选项可以压缩数据页 当重新需要在索引上应用填充度时 也使用 该选项 当使用 SORTED DATA REORG 选项时 应该考虑这些因素 SQL Server 确认每 一个关键值是否比前一个关键值高 如果都不高 那么不能创建索引 SQL Server 要求 1 2 倍 的表空间来物理地重新组织数据 使用 SORTED DATA REORG 选项 通过清除排序进程而 加快索引创建进程 从表中物理地拷贝数据 当某一个行被删除时 其所占的空间可以重新利 用 创建全部非聚簇索引 如果希望把叶级页填充到一定的百分比 可以同时使用 FILLFACTOR 选项和 SORTED DATA REORG 选项 十 索引的维护 为了维护系统性能 索引在创建之后 由于频繁地对数据进行增加 删除 修改等操作使得索 引页发生碎块 因此 必须对索引进行维护 使用 DBCC SHOWCONTIG 语句 可以显示表的数据和索引的碎块信息 当执行 DBCC SHOWCONTIG 语句时 SQL Server 浏览叶级上的整个索引页 来确定表或者指定的索引是 否严重碎块 DBCC SHOWCONTIG 语句还能确定数据页和索引页是否已经满了 当对表进行 大量的修改或者增加大量的数据之后 或者表的查询非常慢时 应该在这些表上执行 DBCC SHOWCONTIG 语句 当执行 DBCC SHOWCONTIG 语句时 应该考虑这些因素 当执行 DBCC SHOWCONTIG 语句时 SQL Server 要求指定表的 ID 号或者索引的 ID 号 表的 ID 号 或者索引的 ID 号可以从系统表 sysindexes 中得到 应该确定多长时间使用一次 DBCC SHOWCONTIG 语句 这个时间长度要根据表的活动情况来定 每天 每周或者每月都可以 使用 DBCC DBREINDEX 语句重建表的一个或者多个索引 当希望重建索引和当表上有主键约 束或者唯一性键约束时 执行 DBCC DBREINDEX 语句 除此之外 执行 DBCC DBREINDEX 语句还可以重新组织叶级索引页的存储空间 删除碎块和重新计算索引统计 当 使用执行 DBCC DBREINDEX 语句时 应该考虑这些因素 根据指定的填充度 系统重新填充 每一个叶级页 使用 DBCC DBREINDEX 语句重建主键约束或者唯一性键约束的索引 使用 SORTED DATA REORG 选项可以更快地创建聚簇索引 如果没有排列关键值 那么不能使 用 DBCC DBREINDEX 语句 DBCC DBREINDEX 语句不支持系统表 另外 还可以使用数 据库维护规划向导自动地进行重建索引的进程 统计信息是存储在 SQL Server 中的列数据的样本 这些数据一般地用于索引列 但是还可以 为非索引列创建统计 SQL Server 维护某一个索引关键值的分布统计信息 并且使用这些统计 信息来确定在查询进程中哪一个索引是有用的 查询的优化依赖于这些统计信息的分布准确度 查询优化器使用这些数据样本来决定是使用表扫描还是使用索引 当表中数据发生变化时 SQL Server 周期性地自动修改统计信息 索引统计被自动地修改 索引中的关键值显著变化 统计信息修改的频率由索引中的数据量和数据改变量确定 例如 如果表中有 10000 行数据 1000 行数据修改了 那么统计信息可能需要修改 然而 如果只有 50 行记录修改了 那么仍 然保持当前的统计信息 除了系统自动修改之外 用户还可以通过执行 UPDATE STATISTICS 语句或者 sp updatestats 系统存储过程来手工修改统计信息 使用 UPDATE STATISTICS 语 句既可以修改表中的全部索引 也可以修改指定的索引 使用 SHOWPLAN 和 STATISTICS IO 语句可以分析索引和查询性能 使用这些语句可以更好 地调整查询和索引 SHOWPLAN 语句显示在连接表中使用的查询优化器的每一步以及表明使 用哪一个索引访问数据 使用 SHOWPLAN 语句可以查看指定查询的查询规划 当使用 SHOWPLAN 语句时 应该考虑这些因素 SET SHOWPLAN ALL 语句返回的输出结果比 SET SHOWPLAN TEXT 语句返回的输出结果详细 然而 应用程序必须能够处理 SET SHOWPLAN ALL 语句返回的输出结果 SHOWPLAN 语句生成的信息只能针对一个会话 如 果重新连接 SQL Server 那么必须重新执行 SHOWPLAN 语句 STATISTICS IO 语句表明输 入输出的数量 这些输入输出用来返回结果集和显示指定查询的逻辑的和物理的 I O 的信息 可以使用这些信息来确定是否应该重写查询语句或者重新设计索引 使用 STATISTICS IO 语 句可以
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 应急办安全培训文件课件
- 2024年金属非金属矿山安全作业试卷附完整答案详解(易错题)
- 2024年自考专业(计算机网络)模考模拟试题(考点提分)附答案详解
- 拿货欠款合同(标准版)
- 个人淘宝店铺转让合同(标准版)
- 强化训练人教版9年级数学上册《概率初步》专项训练练习题(含答案详解)
- 中考英语总复习资料2
- 2025年绿色金融债券发行市场趋势与投资价值研究报告
- 2025年工业碳捕获与封存(CCS)应用案例:技术、市场、政策三维分析报告
- 养老院防汛应急预案范文(32篇)
- 关于医院“十五五”发展规划(2026-2030)
- 软件测试升职述职报告
- 室内装饰测量放线专项方案
- 基于移动互联网的智慧观光巴士服务平台
- 一文了解华为MTL流程和LTC流程z1222
- 医院护理品管圈:提高新生儿喂养后体位摆放执行率
- 弹簧-锥形弹簧的计算
- 肾主生殖理论及肾性不孕
- 【家庭教育的不足对小学生心理健康的影响问题探讨6500字(论文)】
- 青少年软件编程(Scratch)三级考试题库(变量 克隆 画笔)
- 注浆加固技术课件
评论
0/150
提交评论