我试图解释一个令我困惑的性能问题......
我有2张桌子,A和B。
表 A 定义了对象:
+----+--------------+
+ ID + other_things +
+----+--------------+
+ 1 + ~~~~~~~~~~~~ +
+ 2 + ~~~~~~~~~~~~ +
+ 3 + ~~~~~~~~~~~~ +
+----+--------------+
此表中有 575 行。
表 B 定义了所述对象的一些属性。
+----+-------------+-------------+
+ ID + prop_type + prop_value +
+----+-------------+-------------+
+ 1 + prop1 + foo +
+----+-------------+-------------+
+ 1 + prop2 + toto +
+----+-------------+-------------+
+ 3 + prop2 + lorem +
+----+-------------+-------------+
此表中有 20254 行。
目的是获取表 A 中项目的所有“prop2”值。
这里的一些用户非常友好地帮助我设置了“好”的解决方案(见 q. 41331902):
SELECT A.ID, B.prop_value
FROM A LEFT JOIN
B
ON A.ID = B.ID AND B.prop_type = 'prop2';
此查询在大约 20 秒内执行。
但是,目前使用的是另一个版本,我一开始就试图改进:
FOR (
SELECT ID as id_a FROM A
)
DO
prop = (select prop_value from B where prop_type = 'prop2' and id = id_a);
write id_a || ' ' || prop;
END
这给出了相同的结果,但查询在 1.5 秒内完成......
根据我在网上阅读的内容,我的理解是 JOIN 应该比循环更好,但实际结果却不然……
我试图改变表的顺序(即大连接小),但这只会让事情变得更糟(最多 1 分钟)。
你能帮我理解这里发生了什么吗?
旁注:我无法获得执行计划,因为数据库引擎不允许它(AspenTech 的 SQLPlus)
非常感谢你的帮助