大家能介绍一下关于sql语句的优化问题吗?
尤其是多表关联的,几千万条的大数据量的查询!
有哪些相关的知识??哪里有比较详细的介绍啊!
谢了啊!
各位高手指点一下!

解决方案 »

  1.   

    转帖先!
    SQL语句优化的原则:
    ==================
    1、使用索引来更快地遍历表。
       缺省情况下建立的索引是非群集索引,但有时它并不是最佳的。在非群集索引
    下,数据在物理上随机存放在数据页上。合理的索引设计要建立在
    对各种查询的分析和预测上。一般来说:①.有大量重复值、且经常有范围查询
    (between, > ,<  ,> =,<  =)和order by、group by发生的列,可考
    虑建立群集索引;②.经常同时存取多列,且每列都含有重复值可考虑建立组合索引
    ;③.组合索引要尽量使关键查询形成索引覆盖,其前导列一定
    是使用最频繁的列。索引虽有助于提高性能但不是索引越多越好,恰好相反过多的索
    引会导致系统低效。用户在表中每加进一个索引,维护索引集
    合就要做相应的更新工作。
    2、IS NULL 与 IS NOT NULL
       不能用null作索引,任何包含null值的列都将不会被包含在索引中。即使索引有
    多列这样的情况下,只要这些列中有一列含有null,该列就会从
    索引中排除。也就是说如果某列存在空值,即使对该列建索引也不会提高性能。任何
    在where子句中使用is null或is not null的语句优化器是不允
    许使用索引的。
    3、IN和EXISTS
       EXISTS要远比IN的效率高。里面关系到full table scan和range scan。几乎将所
    有的IN操作符子查询改写为使用EXISTS的子查询。
    4、在海量查询时尽量少用格式转换。
    5、当在SQL SERVER 2000中,如果存储过程只有一个参数,并且是OUTPUT类型的,必
    须在调用这个存储过程的时候给这个参数一个初始的值,否则
    会出现调用错误。
    6、ORDER BY和GROPU BY
       使用ORDER BY和GROUP BY短语,任何一种索引都有助于SELECT的性能提高。注意
    如果索引列里面有NULL值,Optimizer将无法优化。
    7、任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时
    要尽可能将操作移至等号右边。
    8、IN、OR子句常会使用工作表,使索引失效。如果不产生大量重复值,可以考虑把
    子句拆开。拆开的子句中应该包含索引。
    9、SET SHOWPLAN_ALL ON 查看执行方案。DBCC检查数据库数据完整性。
    DBCC(DataBase Consistency Checker)是一组用于验证 SQL Server 数据
    库完整性的程序。
    10、慎用游标
       在某些必须使用游标的场合,可考虑将符合条件的数据行转入临时表中,再对临
    时表定义游标进行操作,这样可使性能得到明显提高。
    总结:所谓优化即WHERE子句利用了索引,不可优化即发生了表扫描或额外开销。经
    验显示,SQL Server性能的最大改进得益于逻辑的数据库设计、
    索引设计和查询设计方面。反过来说,最大的性能问题常常是由其中这些相同方面中
    的不足引起的。其实SQL优化的实质就是在结果正确的前提下,
    用优化器可以识别的语句,充份利用索引,减少表扫描的I/O次数,尽量避免表搜索
    的发生。其实SQL的性能优化是一个复杂的过程,上述这些只是
    在应用层次的一种体现,深入研究还会涉及数据库层的资源配置、网络层的流量控制
    以及操作系统层的总体设计。