SQL Server数据库性能优化技术

 更新时间:2007年06月14日 00:00:00   作者:  

  2.索引选择 
  对于每个可优化的子句,优化器都查看数据库系统表,以确定是否有相关的索引能用于访问数据。只有当索引中的列 
的1个前缀与查询子句中的列完全匹配时,这个索引才被认为是有用的。因为索引是根据列的顺序构造的,所以要求匹配是 
精确的匹配。对于分簇索引,原来的数据也是根据索引列顺序排序的。想用索引的次要列访问数据,就像想在电话本中查 
找所有姓为某个姓氏的条目一样,排序基本上没有什么用,因为你还是得查看每一行以确定它是否符合条件。如果1个子句 
有可用的索引,那么优化器就会为它确定选择性。 
  所以在设计过程中,要根据查询设计准则仔细检查所有的查询,以查询的优化特点为基础设计索引。 
  (1)比较窄的索引具有比较高的效率。对于比较窄的索引来说,每页上能存放较多的索引行,而且索引的级别也较少。 
所以,缓存中能放置更多的索引页,这样也减少了I/O操作。 
  (2)SQL Server优化器能分析大量的索引和合并可能性。所以与较少的宽索引相比,较多的窄索引能向优化器提供更多 
的选择。但是不要保留不必要的索引,因为它们将增加存储和维护的开支。对于复合索引、组合索引或多列索引,SQL 
Server优化器只保留最重要的列的分布统计信息,这样,索引的第1列应该有很大的选择性。 
  (3)表上的索引过多会影响UPDATE、INSERT和DELETE的性能,因为所有的索引都必须做相应的调整。另外,所有的分页 
操作都被记录在日志中,这也会增加I/O操作。   

  (4)对1个经常被更新的列建立索引,会严重影响性能。 
  (5)由于存储开支和I/O操作方面的原因,较小的自组索引比较大的索引性能更好一些。但它的缺点是要维护自组的 
列。 
  (6)尽量分析出每一个重要查询的使用频度,这样可以找出使用最多的索引,然后可以先对这些索引进行适当的优化。 
  (7)查询中的WHERE子句中的任何列都很可能是个索引列,因为优化器重点处理这个子句。 
  (8)对小于1个范围的小型表进行索引是不划算的,因为对于小表来说表扫描往往更快而且费用低。 
  (9)与“ORDER BY”或“GROUP BY”一起使用的列一般适于做分族索引。如果“ORDER BY”命令中用到的列上有分簇索 
引,那么就不会再生成1个工作表了,因为行已经排序了。“GROUP BY”命令则一定产生1个工作表。 
  (10)分簇索引不应该构造在经常变化的列上,因为这会引起整行的移动。在实现大型交易处理系统时,尤其要注意这 
一点,因为这些系统中数据往往是频繁变化的。 
  3.合并选择 
  当索引选择结束,并且所有的子句都有了一个基于它们的访问计划的处理费用时,优化器开始执行合并选择。合并选 
择被用来找出一个用于合并子句访问计划的有效顺序。为了做到这一点,优化器比较子句的不同排序,然后选出从物理磁 
盘I/O的角度看处理费用最低的合并计划。因为子句组合的数量会随着查询的复杂度极快地增长,SQL Server查询优化器使 
用树剪枝技术来尽量减少这些比较所带来的开支。当这个合并选择阶段结束时,SQL Server查询优化器已经生成了1个基于 
费用的查询执行计划,这个计划充分利用了可用的索引,并以最小的系统开支和良好的执行性能访问原来的数据。 
3.2 高效的查询选择 
  从以上查询优化的3个阶段不难看出,设计出物理I/O和逻辑I/O最少的方案并掌握好处理器时间和I/O时间的平衡,是 
高效查询设计的主要目标。也就是说,希望设计出这样的查询:充分利用索引、磁盘读写最少、最高效地利用了内存和CPU 
资源。 
  以下建议是从SQL Server优化器的优化策略中总结出来的,对于设计高效的查询是很有帮助的。 
  1.如果有独特的索引,那么带有“=”操作符的WHERE子句性能最好,其次是封闭的区间(范围),再其次是开放的区 
间。 
  2.从数据库访问的角度看,含有不连续连接词(OR和IN)的WHERE子句一般来说性能不会太好。所以,优化器可能会采用 
R策略,这种策略会生成1个工作表,其中含有每个可能匹配的执行的标识符,优化器把这些行标志符(页号和行号)看做是 
指向1个表中匹配的行的“动态索引”。优化器只需扫描工作表,取出每一个行标志符,再从数据表中取得相应的行,所以 
R策略的代价是生成工作表。 
  3.包含NOT、<>、或! =的WHERE子句对于优化器的索引选择来说没有什么用处。因为这样的子句是排斥性的,而不是 
包括性的,所以在扫描整个原来数据表之前无法确定子句的选择性。 
  4.限制数据转换和串操作,优化器一般不会根据WHERE子句中的表达式和数据转换式生成索引选择。例如: 
  paycheck * 12>36000 or substring(lastname,1,1)=“L” 
  如果该表建立了针对paycheck和lastname的索引,就不能利用索引进行优化,可以改写上面的条件表达式为: 
  paycheck<36000/12 or lastname like “L%” 
  5.WHERE子句中的本地变量被认为是不被优化器知道和考虑的,例外的情况是定义为储备过程输入参数的变量。 
  6.如果没有包含合并子句的索引,那么优化器构造1个工作表以存放合并中最小的表中的行。然后再在这个表上构造1 
个分簇索引以完成一个高效的合并。这种作法的代价是工作表的生成和随后的分族索引的生成,这个过程叫 
REFORMATTING。  所以应该注意RAM中或磁盘上的数据库tempdb的大小(除了SELECT INTO语句)。另外,如果这些类型的 
操作是很常见的,那么把tempdb放在RAM中对于提高性能是很有好处的。 
4 性能优化的其他考虑 
  上面列出了影响SQL Server的一些主要因素,实际上远不止这些。操作系统的影响也很大,在Windows NT下,文件系 
统的选择、网络协议、开启的服务、SQL Server的优先级等选项也不同程度上影响了SQL Server的性能。 
  影响性能的因素是如此的多,而应用又各不相同,找出1个通用的优化方案是不现实的,在系统开发和维护的过程中必 
须针对运行的情况,不断加以调整。事实上,绝大部分的优化和调整工作是在与客户端独立的服务器上进行的,因此也是 
现实可行的。

相关文章

  • Linux下实现OpenGauss数据库远程连接的教程

    Linux下实现OpenGauss数据库远程连接的教程

    openGauss是一款开源关系型数据库管理系统,采用木兰宽松许可证v2发行,本文主要为大家详细介绍了如何在Linux环境下实现OpenGauss数据库远程连接,需要的可以参考下
    2023-09-09
  • 开源数据库设计神器chiner的安装及初体验介绍

    开源数据库设计神器chiner的安装及初体验介绍

    最近在造轮子,从 0 到 1 的那种,就差前台的界面了,大家可以耐心耐心耐心期待一下。其中需要设计一些数据库表,可以通过 Navicat 这种图形化管理工具直接开搞,也可以通过一些数据库设计工具来搞,比如说 PowerDesigner,更专业一点
    2022-02-02
  • SQL数据库与oracle数据库镜像有什么不同对比

    SQL数据库与oracle数据库镜像有什么不同对比

    数据库镜像是将数据库事务处理从一个数据库移动到不同环境中的另一个数据库中。镜像的拷贝是一个备用的拷贝,不能直接访问,它只用在错误恢复的情况下。
    2010-03-03
  • 如何利用分析函数改写范围判断自关联查询详解

    如何利用分析函数改写范围判断自关联查询详解

    这篇文章主要给大家介绍了关于如何利用分析函数改写范围判断自关联查询的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用sql具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10
  • 数据库的三级模式和两级映射介绍

    数据库的三级模式和两级映射介绍

    在这里大家一定要注意三级模式中的概念模式对应的是数据库设计的逻辑模型,而不是概念模型(E-R模型),一定不要弄混了
    2012-10-10
  • 收藏的SQL知识以及SQL语句简单实践通俗易懂

    收藏的SQL知识以及SQL语句简单实践通俗易懂

    首先说明,这个笔者2年前学习SQL的遗漏下来的笔记,由于参加完腾讯的笔试,内容比较偏向数据机构和编译以及数据库,刚好要换台本本,心里不想把它弄死在硬盘里,觉得蛮好的,所以把它都分享了
    2012-06-06
  • 把Navicat中数据库所有表导出的方法

    把Navicat中数据库所有表导出的方法

    通过Navicat导出数据库中的数据是比较常用的操作之一,下面这篇文章主要给大家介绍了关于如何把Navicat中数据库所有表导出的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • 数据库分库分表是什么,什么情况下需要用分库分表

    数据库分库分表是什么,什么情况下需要用分库分表

    这篇文章主要介绍了数据库分库分表是什么,什么情况下需要用分库分表,需要的朋友可以参考下
    2021-03-03
  • dbeaver导入导出数据库图文教程(sql文件形式)

    dbeaver导入导出数据库图文教程(sql文件形式)

    这篇文章主要介绍了如何使用DBeaver复制数据库,在导出和导入数据库时,需要注意编码一致性,以避免导入错误,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-02-02
  • NoSQL开篇之为什么要使用NoSQL

    NoSQL开篇之为什么要使用NoSQL

    NoSQL在2010年风生水起,大大小小的Web站点在追求高性能高可靠性方面,不由自主都选择了NoSQL技术作为优先考虑的方面
    2016-02-02

最新评论