繁体   English   中英

Oracle“左外连接”性能问题

[英]Oracle 'left outer join' performance issue

我有一个这样的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”命令块,它们从一个块到另一个块都与WITH相连。 目前,该查询运行了一天多。.它只有9700万条记录。

edit1:这是一个块的说明计划:

在此处输入图片说明

我不知道您在使用哪个客户端,但是以sqldeveloper为例,例如选择查询并单击f10,您会看到解释简单的对象

阅读此内容,您将能够知道全表扫描的过程 ,单击ctrl + f12将打开调优顾问工具。

我希望这可以帮助您,即使您没有使用sqldeveloper,也许现在您知道有些工具可以帮助您发现问题,并可能决定为where条件中使用的字段创建索引

“这里显示完成了全表扫描。当查询具有'where'子句时..不应该进行全表扫描。”

完全不对。 您说除了主键之外没有索引。 您的主键是哪几列? 如果A(a1,b1,c1)是复合主键,而B(a1,b1,c1)也是复合主键,则支持该主键的索引在访问WHERE子句谓词时将很有用。

但是在所有其他情况下,数据库没有办法知道哪些行符合WHERE子句中的条件,除了读取表中的每一行并比较列中的值。 如果您要执行27次操作,那无疑会花费一天的时间。

因此,可能您需要在这些列上建立索引。 您还需要考虑这27个WITH子句是否是一个好主意。 开发人员喜欢WITH子句(我包括我自己),因为它们支持查询中的过程流。 但是,关系数据库使用数据集,并且过程流的效率通常比集合操作低得多。 其中的27个缺点似乎是一个危险信号:考虑是否存在一种更好,更SQL-y的查询编写方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM