`
bluedusk
  • 浏览: 263634 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Sybase SQL Server索引的使用和优化

阅读更多

在应用系统中,尤其在联机事务处理系统中,对数据查询及处理速度已成为衡 量应用系统成败的标准。而采用索引来加快数据处理速度也成为广大数据库用户所 接受的优化方法。 

  在良好的数据库设计基础上,能有效地使用索引是SQL Server取得高性能的基础,SQL Server采用基于代价的优化模型,它对每一个提交的有关表的查询,决定是否使用索引或用哪一个索引。因为查询执行的大部分开销是磁盘I/O,使用索引提高性能的一个主要目标是避免全表扫描,因为全表扫描需要从磁盘上读表的每一个数据页,如果有索引指向数据值,则查询只需读几次磁盘就可以了。所以如果建立了合理的索引,优化器就能利用索引加速数据的查询过程。但是,索引并不总是提高系统的性能,在增、删、改操作中索引的存在会增加一定的工作量,因此,在适当的地方增加适当的索引并从不合理的地方删除次优的索引,将有助于优化那些性能较差的SQL Server应用。实践表明,合理的索引设计是建立在对各种查询的分析和预测上的,只有正确地使索引与程序结合起来,才能产生最佳的优化方 案。本文就SQL Server索引的性能问题进行了一些分析和实践。

  一、聚簇索引(clustered indexes)的使用

  聚簇索引是一种对磁盘上实际数据重新组织以按指定的一个或多个列的值排序。由于聚簇索引的索引页面指针指向数据页面,所以使用聚簇索引查找数据几乎总是比使用非聚簇索引快。每张表只能建一个聚簇索引,并且建聚簇索引需要至少相当该表120%的附加空间,以存放该表的副本和索引中间页。建立聚簇索引的思想是:

  1、 大多数表都应该有聚簇索引或使用分区来降低对表尾页的竞争,在一个高事务的环境中,对最后一页的封锁严重影响系统的吞吐量。

  2、 在聚簇索引下,数据在物理上按顺序排在数据页上,重复值也排在一起,因而在那些包含范围检查(between、<、<=、>、>=)或使用group by或order by的查询时,一旦找到具有范围中第一个键值的行,具有后续索引值的行保证物理上毗连在一起而不必进一步搜索,避免了大范围扫描,可以大大提高查询速度。

  3、 在一个频繁发生插入操作的表上建立聚簇索引时,不要建在具有单调上升值的列(如IDENTITY)上,否则会经常引起封锁冲突。

  4、 在聚簇索引中不要包含经常修改的列,因为码值修改后,数据行必须移动到新的位置。

  5、 选择聚簇索引应基于where子句和连接操作的类型。聚簇索引的侯选列是:

  ● 主键列,该列在where子句中使用并且插入是随机的。

  ● 按范围存取的列,如pri_order > 100 and pri_order < 200 。

  ● 在group by或order by中使用的列。

  ● 不经常修改的列。

  ● 在连接操作中使用的列。

  二、非聚簇索引(nonclustered indexes)的使用

  SQL Server缺省情况下建立的索引是非聚簇索引,由于非聚簇索引不重新组织表中的数据,而是对每一行存储索引列值并用一个指针指向数据所在的页面。换句话说非聚簇索引具有在索引结构和数据本身之间的一个额外级。一个表如果没有聚簇索引时,可有250个非聚簇索引。每个非聚簇索引提供访问数据的不同排序顺序。在建立非聚簇索引时,要权衡索引对查询速度的加快与降低修改速度之间的利弊。另外,还要考虑这些问题:

  ● 索引需要使用多少空间。

  ● 合适的列是否稳定。

  ● 索引键是如何选择的,扫描效果是否更佳。

  ● 是否有许多重复值。

  对更新频繁的表来说,表上的非聚簇索引比聚簇索引和根本没有索引需要更多的额外开销。对移到新页的每一行而言,指向该数据的每个非聚簇索引的页级行也必须更新,有时可能还需要索引页的分理。从一个页面删除数据的进程也会有类似的开销,另外,删除进程还必须把数据移到页面上部,以保证数据的连续性。所以,建立非聚簇索引要非常慎重。非聚簇索引常被用在以下情况: 

  ● 某列常用于集合函数(如Sum,....)。

  ● 某列常用于join,order by,group by。

  ● 查寻出的数据不超过表中数据量的20%。

  三、覆盖索引(covering indexes)的使用

  覆盖索引是指那些索引项中包含查寻所需要的全部信息的非聚簇索引,这 种索引之所以比较快也正是因为索引页中包含了查寻所必须的数据,不需去访 问数据页。 如果非聚簇索引中包含结果数据,那么它的查询速度将快于聚簇索引。

  但是由于覆盖索引的索引项比较多,要占用比较大的空间。而且update 操 作会引起索引值改变。所以如果潜在的覆盖查询并不常用或不太关键,则覆盖索引的增加反而会降低性能。

  四、索引的选择技术

  p_detail是住房公积金管理系统中记录个人明细的表,有890000行,观察在不同索引下的查询运行效果,测试在C/S环境下进行,客户机是IBM PII350(内存64M),服务器是DEC Alpha1000A(内存128M),数据库为SYBASE11.0.3。

  1、 select count(*) from p_detail where op_date>’19990101’ and op_date<’19991231’ and pri_surplus1>300 

  2、 select count(*),sum(pri_surplus1) from p_detail where op_date>’19990101’ and pay_month between ‘199908’ and ’199912’

  不建任何索引 查询1 1分15秒

  查询2 1分7秒

  在op_date上建非聚簇索引 查询1 57秒

  查询2 57秒

  在op_date上建聚簇索引 查询1 <1秒

  查询2 52秒

  在pay_month、op_date、pri_surplus1上建索引 查询1 34秒

  查询2 <1秒

  在op_date、pay_month、pri_surplus1上建索引 查询1 <1秒

  查询2 <1秒

  从以上查询效果分析,索引的有无,建立方式的不同将会导致不同的查询效果,选择什么样的索引基于用户对数据的查询条件,这些条件体现于where从句和join表达式中。一般来说建立索引的思路是:

  (1)、主键时常作为where子句的条件,应在表的主键列上建立聚簇索引,尤其当经常用它作为连接的时候。

  (2)、有大量重复值且经常有范围查询和排序、分组发生的列,或者非常频繁地被访问的列,可考虑建立聚簇索引。

  (3)、经常同时存取多列,且每列都含有重复值可考虑建立复合索引来覆盖一个或一组查询,并把查询引用最频繁的列作为前导列,如果可能尽量使关键查询形成覆盖查询。

  (4)、如果知道索引键的所有值都是唯一的,那么确保把索引定义成唯一索引。

  (5)、在一个经常做插入操作的表上建索引时,使用fillfactor(填充因子)来减少页分裂,同时提高并发度降低死锁的发生。如果在只读表上建索引,则可以把fillfactor置为100。

  (6)、在选择索引键时,设法选择那些采用小数据类型的列作为键以使每个索

  引页能够容纳尽可能多的索引键和指针,通过这种方式,可使一个查询必须遍历的索引页面降到最小。此外,尽可能地使用整数为键值,因为它能够提供比任何数据类型都快的访问速度。

  五、索引的维护

  上面讲到,某些不合适的索引影响到SQL Server的性能,随着应用系统的运行,数据不断地发生变化,当数据变化达到某一个程度时将 会影响到索引的使用。这时 需要用户自己来维护索引。索引的维护包括:

  1、重建索引

  随着数据行的插入、删除和数据页的分裂,有些索引页可能只包含几页数据,另外应用在执行大块I/O的时候,重建非聚簇索引可以降低分片,维护大块I/O的效率。重建索引实际上是重新组织B-树空间。在下面情况下需要重建索引:

  (1)、数据和使用模式大幅度变化。

  (2)、排序的顺序发生改变。

  (3)、要进行大量插入操作或已经完成。

  (4)、使用大块I/O的查询的磁盘读次数比预料的要多。

  (5)、由于大量数据修改,使得数据页和索引页没有充分使用而导致空间的使用超出估算。

  (6)、dbcc检查出索引有问题。

  当重建聚簇索引时,这张表的所有非聚簇索引将被重

  建.

  2、索引统计信息的更新

  当在一个包含数据的表上创建索引的时候,SQL Server会创建分布数据页来存放有关索引的两种统计信息:分布表和密度表。优化器利用这个页来判断该索引对某个特定查询是否有用。但这个统计信息并不动态地重新计算。这意味着,当表的数据改变之后,统计信息有可能是过时的,从而影响优化器追求最有工作的目标。因此,在下面情况下应该运行update statistics命令:

  (1)、数据行的插入和删除修改了数据的分布。

  (2)、对用truncate table删除数据的表上增加数据行。

  (3)、修改索引列的值。 

  六、结束语

  实践表明,不恰当的索引不但于事无补,反而会降低系统的执行性能。因为大量的索引在插入、修改和删除操作时比没有索引花费更多的系统时间。例如下面情况下建立的索引是不恰当的:

  ● 在查询中很少或从不引用的列不会受益于索引,因为索引很少或从来不必搜索基于这些列的行。

  ● 只有两个或三个值的列,如男性和女性(是或否),从不会从索引中得到好处。

  另外,鉴于索引加快了查询速度,但减慢了数据更新速度的特点。可通过在一个段上建表,而在另一个段上建其非聚簇索引,而这两段分别在单独的物理设备上来改善操作性能。

分享到:
评论

相关推荐

    Sybase SQL Server索引的使用和优化.pdf

    Sybase SQL Server索引的使用和优化.pdf

    SQL SyBase IQ

    Sybase IQ是与Adaptive Server Enterprise (ASE),Sybase Adaptive Server Anywhere (ASA),Microsoft SQL Server,Oracle和IBM DB2等一样的关系型数据库管理系统(DBMS),Sybase IQ最初是Expressway公司作为查询...

    SQL Server数据库的高性能优化经验总结

    本文主要向大家介绍的是正确优化SQL Server数据库的经验总结,其中包括在对其进行优化的实际操作中值得大家注意的地方描述,以及对SQL语句进行优化的最基本原则,以下就是文章的主要内容描述。 优化数据库的注意事项...

    LECCO SQL Expert (智能自动SQL优化)

    目前在商用数据库领域LECCO TechnologyLimited(灵高公司)拥有该技术并提供使用该技术的自动优化产品——LECCO SQL Expert,其支持Oracle、Sybase、MS SQLServer和IBMDB2数据库平台。该产品针对数据库应用的开发和...

    数据库设计和自动安装工具BDB V2.2(for Oracle/MS SQLServer/MySQL/Access/SQLAnywhere/Sybase)

    BDB是跨数据库平台的数据库设计和自动安装工具、 支持Oracle、MS SQLServer、Access、MySQL、SQLAnyWhere、Sybase数据库。 通过BDB可以快速建立数据库模型、并随时与实体数据库进行双向同步。 同时它还可以...

    SYBASE_12.0数据库维护快速参考手册

    2.12 在SCO OPENSERVER 5上安装SQL SERVER 11.0.x 59 2.13 在SCO Unixware7.1上安装ASE11.92 62 2.14 ASE 11.9.2 for Linux安装步骤 64 3.常见问题 66 3.1 初级篇 66 3.1.1 在SQL Server中表大小是否有限制? 66 ...

    数据库设计/自动安装工具BDB 2007 V2.3(For Oracle/MS SQLServer/Access/MySQL/SQLAnyWhere/Sybase)

    BDB是跨数据库平台的数据库设计和自动安装工具、 支持Oracle、MS SQLServer、Access、MySQL、SQLAnyWhere、Sybase数据库。 通过BDB可以快速建立数据库模型、并随时与实体数据库进行双向同步。 同时它还可以...

    日常收集整理SqlServer数据库优化经验和注意事项

    2、使用存储过程,它使SQL变得更加灵活和高效。 3、备份数据库和清除垃圾数据。 4、SQL语句语法的优化。(可以用Sybase的SQL Expert,可惜我没找到unexpired的序列号) 5、清理删除日志。 SQL语句优化的基本原则: 1...

    SQL Server数据库优化

     2、使用存储过程,它使SQL变得更加灵活和高效。  3、备份数据库和清除垃圾数据。  4、SQL语句语法的优化。(可以用Sybase的SQL Expert,可惜我没找到unexpired的序列号)  5、清理删除日志。  SQL语句...

    SQL21日自学通

    Microsoft and Sybase SQL Server 171 Personal Oracle7171 总结172 问与答172 校练场173 练习173 第九天创建和操作表174 目标174 CREATE DATABASE 语句174 建立数据库时的选项175 设计数据库176 建立数据字典176 ...

    Sybase ASE快速参考手册

    2.51 如何执行optdiag命令来监控表和索引的物理使用情况? 36 2.52 如何执行reorg 系列命令来优化Dol表及其索引? 36 2.53 如何使用sp_sysmon存储过程来查看当前数据库的性能情况? 37 3. 技术专刊 38 3.1 关于...

    Sybase数据库培训教材.doc

    Sybase数据库培训教材 目 录 第1章 Sybase数据库简介 7 1.1 版本 7 1.2 Sybase数据库的特点 7 1.3 Sybase数据库的组成 8 ...10.3 附录3: 由SQL Server提供的系统过程功能和执行权 50 10.4 附录4:常用SQL命令 52

    Sybase ASE快速参考手册.pdf

    2.51 如何执行optdiag命令来监控表和索引的物理使用情况? 40 2.52 如何执行reorg 系列命令来优化Dol表及其索引? 41 2.53 如何使用sp_sysmon存储过程来查看当前数据库的性能情况? 41 3. 技术专刊 43 3.1 关于...

    SQL必知必会(第3版 中文高清版)

     b.8 使用microsoft sql server   b.9 使用mysql   b.10 使用oracle   b.11 使用php   b.12 使用postgresql   b.13 使用query tool   b.14 使用sybase   b.15 配置odbc数据源  附录c sql...

    SQL,全称结构化查询语言(Structured Query Language)

    SQL语言由命令、子句、运算和集合函数等构成,并可与多种数据库程序协同工作,如MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase等。 SQL可以分为两个部分:数据操作语言(DML)和数据定义语言(DDL)。...

    S.Q.LSQL全称

    如今无论是像Oracle ,Sybase,Informix,SQL server这些大型的数据库管理系统,还是像Visual Foxporo,PowerBuilder这些微机上常用的数据库开发系统,都支持SQL语言作为查询语言。 SQL是高级的非过程化编程语言,允许...

    Jetpack ActiveX控件集合

    4.0, 95 和 97 空白表格程序、Text 文件和ODBC 远程数据库如 Microsoft SQL Server, Sybase SQL Server, ORACLE Server, 和 Ingres Server。还有其他任何可安装的 ISAM 数据库; ...

    1数据库题库2-数据库L1-1.doc

    在sqlserver数据库中,通过哪条语句可以检查查询使用的时间和CPU使用情况( ) A.使用 set statistics io 语句 B.使用 set statistics time 语句 C.使用 set statistics CPU 语句 D.使用 set statistics

    mysql和oracle的区别小结(功能性能、选择、使用它们时的sql等对比)

    虽然InnoDB引擎的表可以用行级锁,但这个行级锁的机制依赖于表的索引,如果表没有索引,或者sql语句没有使用索引,那么仍然使用表级锁。 oracle: oracle使用行级锁,对资源锁定的粒度要小很多,只是锁定sql需要的...

    SQL智能完成工具BDB

    不过与上述软件只能在单个特定数据库平台使用不同, BDB支持更多的数据库平台,具体包括: Oracle、MS SQLServer、MySQL、Access、SQLAnywhere和Sybase。 &lt;br&gt; 一、使用 &lt;br&gt;运行BDB,切换至...

Global site tag (gtag.js) - Google Analytics