【发布时间】:2014-08-28 12:21:13
【问题描述】:
我的要求:找出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 在DEPT_NUM 列上表示INDEX STORAGE。
强制 Full Table 扫描使成本从 3855 变为 11092
表格总行数为632667;
以上都是测试区域结果。产量实际上是两倍。
我的数据库是 Exadata,Quarter RAC。运行 Oracle 11g R2。数据库足够强大,可以立即执行,但是 DBA 不愿意使用 13M 的 tempSpc。企业报告此报告的频率为每小时 4 次。主要的是,这张表有很多实时插入/更新
我们可以即兴创作这个过程吗
1) 增加会话的 PGA?(不确定,是否真的可能?)
2) 额外的索引会有帮助吗?
只是想让一些不同的人来看待这个问题,因为我们小组完全只关注 DBA 参数。
感谢您的任何建议!
【问题讨论】:
-
我不确定但是 row_identifier >= 10;在这里工作得更好,因为它不必评估两个不同的东西。由于 between 语句本质上是在执行 =10。
-
什么是可接受的 tempSpc 值?
-
您可以考虑在dba.stackexchange.com 上询问这个问题,并寻求 DBA 建议。
-
@ConradFrix prod 环境指出用法为
24M。我们还没有确定我们的阈值数字。将尽快更新相同的!我们的电子商务应用使用相同的数据库,并针对OLTP进行了优化 -
我认为您的 dba 过于保守。也就是说,如果这真的是一个问题,我认为您唯一能做的就是重组数据,对每个组的前 n 个使用旧式光标解决方案或使用资源管理器来限制资源。
标签: sql performance oracle oracle11g exadata