昂贵的Oracle窗口功能

时间:2012-05-31 19:21:52

标签: oracle oracle10g

我正在使用窗口函数来计算序列号:

SELECT  R.ENCOUNTER_ID,
        M.MEASURE_ID,
        M.TAKEN_TIME,
        M.VALUE,
        row_number() OVER(PARTITION BY R.ENCOUNTER_ID, M.MEASURE_ID ORDER BY R.ENCOUNTER_ID, M.MEASURE_ID, TAKEN_TIME ASC) AS SEQ

FROM RECORD R 
INNER JOIN MEASURE M ON R.ABC_ID=M.ABC_ID

RECORD表在ABC_ID上有唯一索引,在ENCOUNTER_ID上有非唯一索引。

MEASURE表在ABC_ID和LINE上有唯一索引(未在查询中使用)。

关于没有row_number()的查询的解释计划给出了以下内容:

HASH JOIN                 119702
TABLE ACCESS RECORD FULL  278
TABLE ACCESS MEASURE FULL 50696

有关row_number()的查询的解释计划提供以下内容:

WINDOW                    377871
HASH JOIN                 119702
TABLE ACCESS RECORD FULL  278
TABLE ACCESS MEASURE FULL 50696

似乎跨表索引会有所帮助(在R.ENCOUNTER_ID和M.MEASURE_ID上),但我不确定它是否受支持。

我不知道表格统计信息更新的频率。

有没有办法在我的窗口功能上获得更好的性能?每个表都可以从其他指数中受益吗?

1 个答案:

答案 0 :(得分:1)

散列连接后的高成本表明您的散列连接正在溢出到磁盘,因为它通常会增加可忽略的成本。使用DBMS_Xplan获取所需的临时空间估计值。

如果你的内存受限于散列连接,那么窗口函数也会受到内存不足的影响。监视v $ sql_workarea以查看是否有多通道排序,并考虑在此查询期间增加内存分配。

至于索引,我怀疑你能做多少。