我的要求:找出a的前10个账号DEPT_NUM
,按账号升序排列。
询问:
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 参数。
感谢您的任何建议!