2011-05-12 27 views
3

我是Oracle 11g的新手,我有一个关于执行计划的问题。我运行了一个查询,即使查询中没有ORDER BY子句,执行计划的统计信息仍然显示内存中有6种排序。任何人都可以向我解释为什么发生这种情况?以下是查询和统计:关于排序的优化器统计信息

SQL> SELECT ZIP FROM NOZIPSORT WHERE ZIP BETWEEN '10000' AND '29999' AND rownum < 26; 

25 rows selected. 

Elapsed: 00:00:00.07 

Execution Plan 
---------------------------------------------------------- 
Plan hash value: 4176934817 

-------------------------------------------------------------------------------- 
| Id | Operation   | Name  | Rows | Bytes | Cost (%CPU)| Time  | 
-------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT |   | 25 | 150 |  2 (0)| 00:00:01 | 
|* 1 | COUNT STOPKEY  |   |  |  |   |   | 
|* 2 | TABLE ACCESS FULL| NOZIPSORT | 28 | 168 |  2 (0)| 00:00:01 | 
-------------------------------------------------------------------------------- 

Predicate Information (identified by operation id): 
--------------------------------------------------- 

    1 - filter(ROWNUM<26) 
    2 - filter("ZIP"<='29999' AND "ZIP">='10000') 


Statistics 
---------------------------------------------------------- 
     311 recursive calls 
      0 db block gets 
     47 consistent gets 
     38 physical reads 
     520 redo size 
     805 bytes sent via SQL*Net to client 
     431 bytes received via SQL*Net from client 
      3 SQL*Net roundtrips to/from client 
      6 sorts (memory) 
      0 sorts (disk) 
     25 rows processed 
+0

请注意,“统计”与“执行计划”本身无关 - 它们是执行查询本身的实际统计数据。再次运行它,即使执行计划保持不变,每次都会看到不同的统计信息。 – 2011-05-12 07:50:46

回答

3

我会说这将是进行一些排序的递归调用 - 例如,当查询被解析时,需要查询数据字典来检查表和列的定义,其中一些查询将涉及DISTINCT或其他需要排序的操作。