【发布时间】:2020-08-04 00:11:37
【问题描述】:
问题:在索引处于活动状态时完全刷新期间性能显着下降。我不确定为什么在完全刷新期间激活索引会导致性能显着差异。目前,我们的数据仓库存在过度索引的问题,但我很惊讶地看到,即使只有一个活动索引与完全刷新时没有活动索引相比,性能也会大幅下降。
Oracle 版本 12c
研究: Materialized view refresh terrible performance degradation 我在 SO 上找到了这个,但它不一定回答我的问题,为什么索引会导致性能下降。我可能会继续建议在完全刷新后删除索引并重建,但我仍在尝试找出原因。
性能测试示例: 我有很多 MV,但这是我如何测试 MV 和相关成本的一个例子。我已经测试了大约 10 个 MV,它们都显示出相同的模式。请注意,我修改了代码以删除所有对象名称
所有索引都处于活动状态:
exec dbms_mview.refresh('MY_MV_TEST','C');
从 SQL Developer 报告的实时执行:~153s
获得性能:
SELECT elapsed_time, log_purge_time
FROM dba_mvref_stats
....
已用时间 = 151 log_purge_time = 1
ALTER INDEX IX_MY_MV_TEST_1 UNUSABLE;
....
ALTER INDEX IX_MY_MV_TEST_13 UNUSABLE;
重新运行完全刷新:
exec dbms_mview.refresh('MY_MV_TEST','C');
从 dba_mvref_stats 获取统计信息:
elapsed_time = 27 log_purge_time = 1
有点惊讶,所以我一个一个地尝试,一次只有 1 个索引处于活动状态。对于每个索引,报告的 elapsed_time 为 33,log_purge_time 为 2(我认为它们都报告了相同的时间有点奇怪)。还有一些其他的 MV 也从 300 秒到 40 秒。到目前为止,我只对我们数据仓库的一小部分进行了测试,并且我将假设我们的一些较大的 MV 将显示相同的结果。据 SQL 开发人员报告,索引的重建只需要 11 秒。
MV DDL: 重命名所有对象需要一些时间,但如有必要,我会在需要时进行。目前,这是此特定 MV 定义的总体概述。在 SELECT 子句中只有列、一对 case 语句、一对 substr() 和 cast()。
CREATE MATERIALIZED VIEW MY_MV_TEST
BUILD DEFERRED
USING INDEX REFRESH FORCE ON DEMAND
USING DEFAULT LOCAL ROLLBACK SEGMENT
USING ENFORCED CONSTRAINTS AS
SELECT column1, column2, CASE..., SUBSTR(..), CAST()...
FROM mv1, mv2, mv3
WHERE mv1.column1 = mv2.column1
AND mv1.column1 = mv3.column1
AND ... (other simple conditions using the equality operator)
另外请注意,我测试过的所有 MV 都支持 REFRESH FAST。 DBMS_MVIEW.EXPLAIN_MVIEW 表明它们具有 REFRESH FAST 能力。我使用 COMPLETE REFRESH 只是为了测试。
【问题讨论】:
标签: oracle indexing performance-testing materialized-views