我有一个像这样的SQL块:
with X as
(
select * from A
left outer join B
on A.a1 = B.a1
and A.b1 = B.b1
and A.a1 = B.c1
where a1 = 1
and b1 = 2
and c1 = 3
)
select * from X
实际上我有27个'WITH'命令块,它们从一个块连接到另一个块。目前查询运行超过一天..它只有9700万条记录..
edit1:这是一个块的解释计划:
答案 0 :(得分:0)
我不知道您使用的是哪个客户端,但使用 sqldeveloper ,例如选择查询并点击 f10 ,您会看到解释普通对象< /强>
阅读此内容,您将能够了解全桌扫描的内容,点击 ctrl + f12 ,即可打开调整顾问工具。
我希望这可以提供帮助,即使您没有使用sqldeveloper,也许现在您知道有些工具可以帮助您找到问题并且可能决定为您正在使用的字段创建索引在哪里条件。
答案 1 :(得分:0)
&#34;此处显示全表扫描已完成..当查询中有&#39;其中&#39;条款..不应该进行全表扫描。&#34;
根本不是真的。你说除主键外没有索引。哪些列是您的主键?如果A(a1,b1,c1)
是复合主键而B(a1,b1,c1)
也是复合主键,则支持主键的索引在访问WHERE子句谓词时非常有用。
但在所有其他情况下,数据库无法知道哪些行符合WHERE子句中的条件,除了读取表中的每一行并比较列中的值。如果你这样做了27次,难怪它需要一天。
所以你可能需要在这些列上构建索引。你还需要考虑这27个WITH子句是否是个好主意。开发人员喜欢WITH子句(我包括我自己)因为它们支持通过查询的程序流。但是,关系数据库使用数据集,而程序流通常比集合操作效率低得多。 27个blighter似乎是一个红旗:考虑是否有更好的,更多的SQL-y编写查询的方式。