zoukankan      html  css  js  c++  java
  • 对于使用 UNIKON ALL 中表的顺序

    对于使用 UNIKON ALL (或 UNION, 如果不特别关注是否有重复数据, 应该使用UNION ALL) 的查询

    请注意 UNION ALL 中表的顺序

    -- 这个查询中的tb1, tb2 ,应该按照数据量大小倒排序,数据量最大的表,应该出现在最前面

    SELECT * FROM tb1 WITH(NOLOCK)

    UNION ALL

    SELECT * FROM tb2 WITH(NOLOCK)

             Henson 这国的一个项目, 查询效率低, 就是因为表的顺序有问题,因为字段上的设置有差异, 在相同的优先组下, 会以前面的表结构为标准来做转换,由于大数据量的表放在后面,导致被转换的是大表, 从而产生了额外的性能开销

             另外,过于复杂的查询, 不要追求一句搞定, 适当考虑把重复使用的查询先存到临时表, 降低查询的复杂程度, 并且通过分步骤+判断来减少查询对象, 会对性能有帮助

             Henson这边之前优化的查询就有这种问题, 一个查询要翻几页才看得完, 涉及的对象多, 还嵌套复杂的视图, 这种人看着累,SQL要分析出这个查询也是很累的

             一句查询是告诉 SQL 最终想要的结果, 给 SQL 更多发挥的空间;但过于复杂的一句,可达到目标的方案就会非常多,SQL 就无法评估全部的方案,所以其最终决定的执行的方案就不一定是最优的;另外,SQL在评估方案的时候,其中一个重要的信息就是表中的数据分布,这是一个大概统计值,当要评估的东西多的时候,这个大概的结果累计所评估的结果与实际结果的差异就可能会非常大,这也会导致查询方案有问题。当然,也不要过于干涉

             当然,必须注意的是,也不要太过于注重把语句分解为多步+临时表去做,那样SQL可发挥的空间低,性能可能也会变得不好。如果把握,没有一个准确的尺度,但如果一个查询分翻几页才能看完的话,我想就应该是有问题了.

    出处:Jack Zou

    作者:Bober Song
    出处:http://bober.cnblogs.com/
    CARE健康网: http://www.aicareyou.com/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    获取网络上的北京时间,如果大于设定的过期时间就...
    MYSQL注释
    mysql的perror
    Spring + CXF(REST):webservice not found
    vim 学习笔记
    mysql存储过程controller的not found造成混乱的解决办法
    pt-query-digest 安装及使用
    MYSQL预处理传参不区分大小写解决办法
    解压版mysql安装--windows系统
    sql plus 和 pl/sql无法连接远程oracle数据库
  • 原文地址:https://www.cnblogs.com/bober/p/2864819.html
Copyright © 2011-2022 走看看