为什么左连接这么慢?

时间:2015-06-03 14:30:15

标签: sql oracle optimization

我有下一个查询:

SELECT MV1.Column2,
    MV1.Column3,
    T2.Column3,
    T3.Column5
FROM MaterializedView1 MV1
LEFT JOIN Table2 T2 ON T2.Id = MV1.T2_Id
LEFT JOIN Table3 T3 ON T3.Id = T2.T3_Id

MV1有超过5M的行,我每天刷新这个物化视图。 T2有大约500K行,T3有大约1M行。 T2和T3有主键" Id"这些列的有效索引。好吧,我构建了解释计划,它向我显示,对于此加入,Oracle将使用索引完整扫描嵌套循环,查询成本也是如此大(超过1M)。 如果我使用简单:

SELECT T2.Column3
FROM Table2 T2
WHERE
T2.Id = 1

SELECT T3.Column5
FROM Table3 T3
WHERE
T3.Id = 10

然后Oracle使用INDEX UNIQUE SCAN,此查询的成本为1。 从MaterializedView1中选择的成本约为1000。 任何人都可以告诉我,什么是错的以及如何优化我的查询?

3 个答案:

答案 0 :(得分:-1)

请你试试看,然后查看。

SELECT MV1.Column2,
    MV1.Column3,
    T2.Column3,
    T3.Column5
FROM (Select column2,column3 from MaterializedView1 group by column2,column3) MV1
LEFT JOIN Table2 T2 ON T2.Id = MV1.T2_Id
LEFT JOIN Table3 T3 ON T3.Id = T2.T3_Id

答案 1 :(得分:-1)

对于MaterializedView1,在T2_id上添加索引,在Table2上,在T3_Id上添加索引。仅仅因为你有外键,如果你这样做,它仍然不意味着索引是自动创建的。你必须创建它们,如果你还没有,或者你的连接表现总是很糟糕。

答案 2 :(得分:-1)

我的第一个猜测是摆脱物化视图并创建一个真实的"而是表。您可以使用当前物化视图的频率删除(或截断)/更新该表,但我觉得您的查询会更快。

据我记得(直到版本11),物化视图很好,因为"快照"出于报告目的但如果你在复杂的情况下使用它们会失去控制力。查询。