My Requirement: Identify top 10 accounts of a DEPT_NUM
, ordered by the account number in ascending order.
Query:
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;
Trace:
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:
The index scan
says, INDEX STORAGE
on a column DEPT_NUM
.
Forcing Full Table
scan made cost from 3855 to 11092
Total number of rows in the table is 632667;
All the above are test region results. Production actually has twice the amount.
My Database is Exadata, Quarter RAC. Running Oracle 11g R2. The databse is powerful enough to execute it instantly, But DBA were reluctant on the tempSpc of 13M. Business reported the frequency of this report would be 4 times an hour. And Main thing is, this table gets a Lot of real time inserts/updates
Can we improvise the process like
1) Increasing the PGA for a session?(Not sure, if it really possible?)
2) Will An additional index help?
Just want some different eyes to look on this, as our group is totally focusing on the DBA parameters only.
Thanks for any kind of suggestions!
Analytic function performance may depend on the index column order. Changing the index from
(ACCTNUM,DEPT_NUM)
to(DEPT_NUM,ACCTNUM)
may lower the cost and remove the need for temporary tablespace.INDEX FAST FULL SCAN uses faster multi-block IO but it also requires sorting the data and possibly temporary tablespace for the sort area.
INDEX FULL SCAN uses slower single-block IO but it returns the data in order and avoids sorting.
Sample schema and data
(ACCTNUM,DEPT_NUM) = WINDOW SORT PUSHED RANK
(DEPT_NUM,ACCTNUM) = WINDOW NOSORT