我的要求:确定DEPT_NUM
的排名前10的帐户,由帐号按升序排序。窗口函数排序昂贵,我们可以克服它吗?
查询:
SELECT * FROM
(
select acctnum,dept_num,row_number() OVER (PARTITION BY DEPT_NUM ORDER BY ACCTNUM) as row_identifier
FROM MYTABLE
)
WHERE row_identifier between 1 and 10;
跟踪:
7532 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 1480074522
--------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 577K| 15M| | 3855 (1)| 00:00:47 |
|* 1 | VIEW | | 577K| 15M| | 3855 (1)| 00:00:47 |
|* 2 | WINDOW SORT PUSHED RANK| | 577K| 7890K| 13M| 3855 (1)| 00:00:47 |
| 3 | INDEX FAST FULL SCAN | IMTAB05 | 577K| 7890K| | 987 (1)| 00:00:12 |
--------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("ROW_IDENTIFIER">=1 AND "ROW_IDENTIFIER"<=5)
2 - filter(ROW_NUMBER() OVER (PARTITION BY "DEPT_NUM" ORDER BY "ACCTNUM")<=5)
Statistics
----------------------------------------------------------
0 recursive calls
2 db block gets
4298 consistent gets
0 physical reads
0 redo size
144367 bytes sent via SQL*Net to client
486 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
7532 rows processed
指数:
的index scan
说,INDEX STORAGE
在列DEPT_NUM
。
强制Full Table
扫描制成成本从3855到11092
表中的行的总数为632667;
以上皆为测试区域结果。产量实际上有两倍的数量。
我的数据库是Exadata,Quarter RAC。运行Oracle 11g R2。数据库足够强大,可立即执行,但DBA不愿意使用13M的tempspc。商业报道,这份报告的频率将是每小时4次。而最主要的是,此表获取实时插入/更新的地块
我们能凑合像
1的过程)增加PGA的会话?(不知道,如果真的可能吗?)
2 )会额外索引有帮助吗?
只是想让一些不同的眼睛看到这一点,因为我们的团队完全专注于DBA参数。
感谢您的任何建议!
我不确定,但会row_identifier> = 10;在这里工作得更好,因为它不必评估两种不同的东西。由于介于两者之间本质上是做<= 1 and a > = 10。 – Phil
什么是tempspc的可接受值? –
您可以考虑在http://dba.stackexchange.com/上询问此问题以及DBA建议。 –