2014-02-13 39 views
2

表信息快20倍:甲骨文:ROW_NUMBER比ROWNUM

  • table1的有20百萬個條目
  • 表2有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; 
+7

你知道,那些是不等價的?第二個使用表的「隨機」排序來分配行號,而第一個使用定義的順序。執行計劃告訴你什麼? –

+2

我懷疑優化器只是在優化確定性查詢方面更好,但沒有實際查詢計劃的東西只是猜測。 –

+0

@a_horse_with_no_name我忘了注意這些請求的目的是要返回,如果是或否有存在的條目。條目的數量並不重要。 – sdespont

回答

1

就像之前說的,ROW_NUMBER()和ROWNUM是不等價的。

第一個是它使用的窗口的分析函數。訂單由命令按順序指定。

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 |