|
原帖由 jboracle1981 于 2010-11-10 10:46 发表 ![]()
2.1的例子,下面两个查询应该不等价的吧???
Q2:
SELECT o_orderpriority, COUNT(*)
FROM orders
WHERE o_orderdate >= '1993-07-01' AND
EXISTS (SELECT *
FROM lineitem
WHERE l_orderkey = o_orderkey AND
l_returnflag = "R') OR
EXISTS (SELECT *
FROM lineitem
WHERE l_orderkey = o_orderkey AND
l_receiptdate > l_commitdate)
GROUP BY o_orderpriority;
我们的子查询合并会把两个EXISTS子查询并成单个带OR过滤谓词的子查询,变成Q3:
Q3
SELECT o_orderpriority, COUNT(*)
FROM orders
WHERE o_orderdate >= '1993-07-01' AND
EXISTS (SELECT *
FROM lineitem
WHERE l_orderkey = o_orderkey AND
(l_returnflag = "R' OR
l_receiptdate > l_commitdate))
GROUP BY o_orderpriority;
绝对的相等, 其实就是通过改写减少对表lineitem的访问, 这篇文章主要就是讲通过re-write SQL 语句, 为了得到更好的性能!
另外, 我感觉非常奇怪的就是, 该文章中举的例子都是非常普遍的, 只要你有相关的经验, 你就能快速改写成功!
该作者写该文档的学术性语言描述太多了, 我简单的看了看, 写的太不通俗了, 还给出了不少的图片, 这也写的太麻烦了, 像在写学术性论文!
我觉得调优SQL语句最好的方法, 还是去研究执行计划和统计数据, 毕竟语句的执行性能最终取决的不是语句本身的写法, 而是optimizer给出的相应的执行计划和统计数据, 当然所有的前提都是建立在表的设计[这个项目的数据模型]本身就是非常合理, 否则希望通过对SQL语句的调优来大幅度的提高整体的应用程序的性能, 那时完全不可能的!
[ 本帖最后由 bell6248 于 2010-11-10 14:18 编辑 ] |
|