我正在使用窗口函数来计算序列号:
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上),但我不确定它是否受支持。
我不知道表格统计信息更新的频率。
有没有办法在我的窗口功能上获得更好的性能?每个表都可以从其他指数中受益吗?
答案 0 :(得分:1)
散列连接后的高成本表明您的散列连接正在溢出到磁盘,因为它通常会增加可忽略的成本。使用DBMS_Xplan获取所需的临时空间估计值。
如果你的内存受限于散列连接,那么窗口函数也会受到内存不足的影响。监视v $ sql_workarea以查看是否有多通道排序,并考虑在此查询期间增加内存分配。
至于索引,我怀疑你能做多少。