对于使用 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

posted @ 2013-01-17 16:51  Care健康  阅读(239)  评论(0编辑  收藏  举报
版权
作者:Bober Song

出处:http://bober.cnblogs.com

Care健康:http://www.aicareyou.com

推荐空间:华夏名网

本文首发博客园,版权归作者跟博客园共有。

转载必须保留本段声明,并在页面显著位置给出本文链接,否则保留追究法律责任的权利。