0

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

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 上),但我不确定它是否受支持。

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

有没有办法在我的窗口函数上获得更好的性能?每个表都可以从额外的索引中受益吗?

4

1 回答 1

1

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

如果您在哈希连接上受到内存限制,那么窗口函数也将遭受内存不足的困扰。监视 v$sql_workarea 以查看您是否进行了多遍排序,并考虑在此查询期间增加内存分配。

至于索引,我怀疑您可以做很多事情。

于 2012-05-31T19:35:00.397 回答