私の要件:の上位 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 です。
上記はすべてテスト領域の結果です。生産は実際には2倍の量を持っています。
私のデータベースは Exadata、Quarter RAC です。Oracle 11g R2 を実行しています。データベースはすぐに実行できるほど強力ですが、DBA は 13M の tempSpc には乗り気ではありませんでした。ビジネスは、このレポートの頻度が 1 時間に 4 回になると報告しました。そして主なことは、このテーブルは多くのリアルタイムの挿入/更新を取得することです
1) セッションの PGA を増やすなどのプロセスを即席で行うことはできます
か?(本当に可能かどうかはわかりません)
2) 追加のインデックスが役立ちますか?
私たちのグループは完全に DBA パラメーターのみに焦点を当てているため、これを別の視点で見てもらいたいだけです。
あらゆる種類の提案をありがとう!