51Testing丛书:性能测试进阶指南—LoadRunner 11实战(2)

发表于:2012-5-04 11:25

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:陈霁    来源:51Testing软件测试网原创

  对于SQL语句优化的基本原则如下。

  ● 使用索引来更快地遍历表。默认情况下建立的索引是非聚集索引,但有时它并不是最佳的。在非聚集索引下,数据在物理上随机存放在数据页上。合理的索引设计要建立在对各种查询的分析和预测上。一般来说:

    → 有大量重复值且经常有范围查询(between,>,<,>=,< =)和order by、group by发生的列,可考虑建立聚集索引。

    → 经常同时存取多列,且每列都含有重复值可考虑建立组合索引。

    → 组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列。

  ● IS NULL 与 IS NOT NULL不能用NULL作为索引,任何包含NULL值的列都将不会被包含在索引中。即使索引有多列这样的情况下,只要这些列中有一列含有NULL,该列就会从索引中排除。也就是说如果某列存在空值,即使对该列建索引也不会提高性能。任何在WHERE子句中使用IS NULL或IS NOT NULL的语句优化器是不允许使用索引的。

  ● IN和EXISTS,EXISTS要远比IN的效率高,里面关系到FULL TABLE SCAN和RANGE SCAN,几乎将所有的IN操作符子查询改写为使用EXISTS的子查询。

  ● 在海量查询时尽量少用格式转换。

  ● 当在SQL Server 2000中,如果存储过程只有一个参数,并且是OUTPUT类型的,必须在调用这个存储过程的时候给这个参数一个初始的值,否则会出现调用错误。

  ● ORDER BY和GROPU BY:使用ORDER BY和GROUP BY短语,任何一种索引都有助于SELECT的性能提高。注意如果索引列中有NULL值,Optimizer将无法优化。

  ● 任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等,查询时要尽可能将操作移至等号右边。

  ● IN、OR子句常会使用工作表,使索引失效。如果不产生大量重复值,可以考虑把子句拆开,拆开的子句中应该包含索引。

  ● 谨慎使用游标。在某些必须使用游标的场合,可考虑将符合条件的数据行转入临时表中,再对临时表定义游标进行操作,这样可使性能得到明显提高。

  注释:所谓的优化就是WHERE子句利用了索引,不可优化即发生了表扫描或额外开销。经验显示,SQL Server性能的最大改进得益于逻辑的数据库设计、索引设计和查询设计方面。反过来说,最大的性能问题常常是由其中这些相同方面中的不足引起的。其实SQL优化的实质就是在结果正确的前提下,用优化器可以识别的语句,充分利用索引,减少表扫描的I/O次数,尽量避免表搜索的发生。

  其实SQL的性能优化是一个复杂的过程,上述这些只是在应用层次的一种体现,深入研究还会涉及数据库层的资源配置、网络层的流量控制及操作系统层的总体设计。

  对于某一条查询语句我们可以使用查询计划获得查询性能,来帮助我们确认如何编写性能更加优秀,举例如下。

  ● 仅在主键上建立聚集索引,并且不划分时间段

  Select gid,fariqi,neibuyonghu,title
  from tgongwen
  用时:128470毫秒(128秒)

  ● 在主键上建立聚集索引,在fariq上建立非聚集索引

  select gid,fariqi,neibuyonghu,title
  from Tgongwen
  where fariqi> dateadd(day,-90,getdate())
  用时:53763毫秒(54秒)

  ● 将聚集索引建立在日期列(fariqi)上

  select gid,fariqi,neibuyonghu,title
  from Tgongwen
  where fariqi> dateadd(day,-90,getdate())
  用时:2423毫秒(2秒)

54/5<12345>
《2023软件测试行业现状调查报告》独家发布~

精彩评论

  • 夜修罗
    2013-2-25 10:23:10

    我想请问一下,这下面两个语句有差别吗?为什么执行用时会不同?

     ● 在主键上建立聚集索引,在fariq上建立非聚集索引

      select gid,fariqi,neibuyonghu,title
      from Tgongwen
      where fariqi> dateadd(day,-90,getdate())
      用时:53763毫秒(54秒)

      ● 将聚集索引建立在日期列(fariqi)上

      select gid,fariqi,neibuyonghu,title
      from Tgongwen
      where fariqi> dateadd(day,-90,getdate())
      用时:2423毫秒(2秒)

  • zbj793989849
    2012-6-29 13:43:51

    可以下载吗?

  • flyingboy218
    2012-5-23 17:52:45

    有些晕,有些抽象

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号