【发布时间】:2014-03-12 03:57:15
【问题描述】:
表格详情:
- table1 有 2000 万个条目
- table2 有 120 个条目。
这些请求的目标是返回是否存在现有条目。条目数无关紧要。
有人解释一下原因吗
SELECT COUNT(rn) count
FROM
(
SELECT ROW_NUMBER() OVER (order by t2.id_field) AS rn
FROM table1 t1
INNER JOIN table2 t2 ON t2.id_table2 = t1.id_table2
WHERE t2.id_field = 2
)
WHERE rn < 2;
比 :
快 20 倍SELECT COUNT(rn) count
FROM
(
SELECT 1 rn
FROM table1 t1
INNER JOIN table2 t2 ON t2.id_table2 = t1.id_table2
WHERE t2.id_field = 2
)
WHERE ROWNUM < 2;
【问题讨论】:
-
你知道那些不相等吗?第二个使用表的“随机”排序来分配行号,而第一个使用定义的顺序。执行计划告诉你什么?
-
我怀疑优化器只是更擅长优化确定性查询,但没有实际查询计划的任何事情都只是猜测。
-
@a_horse_with_no_name 我忘了注意到这些请求的目的是返回是否存在现有条目。条目数无关紧要。
-
@sdespont 那么你最好使用
EXISTS...? -
请为这两种情况添加
EXPLAIN PLAN的结果。
标签: sql database oracle oracle11g query-optimization