【问题标题】:Oracle : ROW_NUMBER 20 times faster than ROWNUMOracle : ROW_NUMBER 比 ROWNUM 快 20 倍
【发布时间】: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


【解决方案1】:

如前所述,ROW_NUMBER() 和 ROWNUM 根本不等价。

第一个是使用窗口的分析函数。顺序是由order by command指定的。

http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions004.htm#SQLRF51198

select
  ename,
  ROW_NUMBER() OVER (order by ename ) AS rn 
from emp
where deptno =20;

ENAME              RN
---------- ----------
ADAMS               1
FORD                2
JONES               3
SCOTT               4
SMITH               5


Execution Plan
----------------------------------------------------------
Plan hash value: 3145491563

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     5 |    45 |     4  (25)| 00:00:01 |
|   1 |  WINDOW SORT       |      |     5 |    45 |     4  (25)| 00:00:01 |
|*  2 |   TABLE ACCESS FULL| EMP  |     5 |    45 |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------

使用rownum:

select ename, 
  ROWNUM
from emp
where deptno =20;

ENAME          ROWNUM
---------- ----------
SMITH               1
JONES               2
SCOTT               3
ADAMS               4
FORD                5


Execution Plan
----------------------------------------------------------
Plan hash value: 1498225739

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     5 |    45 |     3   (0)| 00:00:01 |
|   1 |  COUNT             |      |       |       |            |          |
|*  2 |   TABLE ACCESS FULL| EMP  |     5 |    45 |     3   (0)| 00:00:01 |

【讨论】:

    猜你喜欢
    • 2012-10-16
    • 1970-01-01
    • 2021-07-18
    • 2010-09-15
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 2019-06-26
    • 2010-10-24
    相关资源
    最近更新 更多