• sql查询语句优化需要注意的几点


     

    为了获得稳定的执行性能,SQL语句越简单越好。对复杂的SQL语句,要设法对之进行简化。


    常见的简化规则如下:
     
    1)不要有超过5个以上的表连接(JOIN)
    2)考虑使用临时表或表变量存放中间结果。
    3)少用子查询
    4)视图嵌套不要过深,一般视图嵌套不要超过2个为宜。
    5)限制结果集
    6)合理的表设计          这个非常重要
    7)建立合适的索引       这个非常重要
     

    连接的表越多,其编译的时间和连接的开销也越大,性能越不好控制。

    最好是把连接拆开成较小的几个部分逐个顺序执行。

    优先执行那些能够大量减少结果的连接。

    拆分的好处不仅仅是减少SQL Server优化的时间,更使得SQL语句能够以你可以预测的方式和顺序执行。


    如果一定需要连接很多表才能得到数据,那么很可能意味着设计上的缺陷。

     


    连接是outer join,非常不好。因为outer join意味着必须对左表或右表查询所有行。

    如果表很大而没有相应的where语句,那么outer join很容易导致table scan或index scan。

    要尽量使用inner join避免scan整个表。


    优化建议:
     
    1)使用临时表存放t1表的结果,能大大减少logical reads(或返回行数)的操作要优先执行。
     仔细分析语句,你会发现where中的条件全是针对表t1的,所以直接使用上面的where子句查询表t1,然后把结果存放再临时表#t1中:
     
    Select t1….. into #tt1 from t1 where…(和上面的where一样)
     
    2)再把#tt1和其他表进行连接:
     
    Select #t1…
    Left outer join …
    Left outer join…
     
     
    3)修改 like 程序,去掉前置百分号。like语句却因为前置百分号而无法使用索引
    4)从系统设计的角度修改语句,去掉outer join。
    5)考虑组合索引或覆盖索引消除clustered index scan。
     
    上面1和2点建议立即消除了worktable,性能提高了几倍以上,效果非常明显。
  • 相关阅读:
    springboot以jar运行时参数传递
    linux 下ab压力测试
    Quartus 11生成pof文件在AS烧写之后,程序无法启动
    芯片底层热焊盘的焊接
    CC3200模块的内存地址划分和bootloader,启动流程(二)
    python开发记录第一篇
    windows下使用Python出现No module named tkinter.ttk
    Pycharm设置Python的路径
    Qsys配置生成nios系统模块
    sprintf()函数使用异常
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3181610.html
Copyright © 2020-2023  润新知