如果一个SQL查询语句很长,执行速度很慢,有哪些优化方法?

解决方案 »

  1.   

    执行速度快慢并不见得就是与SQL语名的长短有关系
    楼主何不将语句贴出来呢
      

  2.   

    语句不是长就执行速度慢。看你用的怎样的查询。如果是单一的查询某一个表,一般速度不会慢的。单表查询数据量大如100万的表,有可能查询速度会慢一些。
    如果你的表使用的多表的连接查询的话,你做好还是建立存储过程这样每次查询的话不会大量的消耗服务的资源。
    优化的手段:建立索引、尽量在语句上优化了,尽量少用group by 、order by 等。
      

  3.   

    缺省情况下建立的索引是非群集索引,但有时它并不是最佳的;合理的索引设计要建立在对各种查询的分析和预测上。一般来说:
    1 有大量重复值、且经常有范围查询
    (between, >,< ,>=,< =)和order by、group by发生的列,可考虑建立群集索引;
    2 经常同时存取多列,且每列都含有重复值可考虑建立组合索引;
    3组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列。4.多表操作在被实际执行前,查询优化器会根据连接条件,列出几组可能的连接方案并从中找出系统开销最小的最佳方案。连接条件要充份考虑带有索引的表、行数多的表;内外表的选择可由公式:外层表中的匹配行数*内层表中每一次查找的次数确定,乘积最小为最佳方案。
    5.查看执行方案的方法-- 用set showplanon,打开showplan选项,就可以看到连接顺序、使用何种索引的信息;想看更详细的信息,需用sa角色执行dbcc(3604,310,302)。
    可见,所谓优化即where子句利用了索引,不可优化即发生了表扫描或额外开销。
    6.任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。
    7.in、or子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把子句拆开;拆开的子句中应该包含索引。
    8.要善于使用存储过程,它使SQL变得更加灵活和高效。
      

  4.   

    表结构和SQL语句拿出来看看,光这样说人家不好回答的