0

我正在使用 Oracle 11g。我有一个包含大约十亿条记录的消息表,这些记录按时间戳进行范围分区。此消息表有几个参考分区子表,例如名称、地址和标识。

所有查询都包含消息时间戳分区键。当仅在消息字段上查询消息表时,它可以正常工作,并且我可以从子表中提取信息,但是对于从这些参考分区子表中查找包含特定名称或地址或其他值的消息的查询,我遇到了性能不佳的问题。

在分析这些查询并查看他们的计划时,我发现它在访问消息表之前对子表进行了完整的分区扫描。我可以通过使用前导提示并让查询以消息表开头来提高这些查询的性能,但我不喜欢必须使用提示,即使使用它,性能仍然不是很好。

我现在担心的是,参考分区模型可能根本不适合我的需求,我需要转移到不同的分区模型。我希望确认引用分区是否不是为通过引用的表数据进行过滤而设计的。我已经阅读了很多 Oracle 文档,但我找不到任何提及它的内容,所以我仍然不确定是否要继续进行这种代价高昂的迁移。


我希望有人能立即知道这是否属实,并指出我以某种方式错过的一些文档。但是现在我被要求提供示例查询和计划,这当然是合理的,我将不得不添加更多我遗漏的信息。除了范围分区之外,消息表还在 varchar 列上进行了子分区。

SELECT count(*) FROM EVT_TRANS_MSG A, EVT_TRANS_MSG_ID B WHERE A.TIMESTAMP_F >= '03-OCT-13 12.00.00.000000000 AM'  AND A.TIMESTAMP_F <= '03-OCT-13 11.59.59.999000000 PM' AND B.CODE = '999999999'  AND A.ID = b.message_fk AND a.object_type = 'BLAH';

执行时间:529秒(8分49秒)

计划

SELECT /*+ LEADING(A) */ count(*) FROM EVT_TRANS_MSG A, EVT_TRANS_MSG_ID B WHERE A.TIMESTAMP_F >= '03-OCT-13 12.00.00.000000000 AM'  AND A.TIMESTAMP_F <= '03-OCT-13 11.59.59.999000000 PM' AND B.CODE = '999999999'  AND A.ID = b.message_fk AND a.object_type = 'BLAH';

执行时间:12秒

有提示的计划

4

0 回答 0