【发布时间】:2015-08-19 00:11:55
【问题描述】:
正如this answer 解释的那样,JOIN ON 与OR 结合使用无法优化。我确实注意到我正在尝试编写的查询中的可怕性能。
为了描述我的场景,应该返回一个标题记录以及来自所有相关项目记录的数据。项目可以基于三个字段之一与标题记录相关。下面的 SQL 在语法上看起来很合理,但由于无法优化 JOIN ON OR,因此代价高昂:
SELECT
header.a,
header.b,
item.x,
item.y,
item.z
FROM header
LEFT OUTER JOIN item ON item.x = header.a
OR item.y = header.a
OR item.z = header.b;
请注意,这是从一个复杂得多的查询中概括出来的(涉及另外 6 个连接和各种过滤器)。我预计JOIN ON OR 实现将起作用,尽管我无法确认它,因为OR 导致的全表扫描可能需要几个小时才能完成。 (额外的问题:三重条件会导致单个连续的 FTS 还是三个连续的 FTS?)
由于周围查询的复杂性,我想避免链接答案中建议的 UNION ALL 方法。这不仅是因为我想避免这种级别的重复,而且查询的其余部分虽然经过优化,但本身就非常昂贵。有没有我没有看到的替代方案?
【问题讨论】:
-
您使用的是哪个 dbms? (不同的产品以不同的方式优化事物......)
-
@jarlh 我们在 SAP HANA(SQL 脚本)上运行。
-
item表有多少列? -
@gotqn 大约 70 个。我选择了其中的 8 个。如果相关,它是一个列存储。
-
@Lilienthal 我不熟悉
hana,但在t-sql中,您可以使用included列创建额外的filtering索引,这可以优化性能,减少read操作。跨度>
标签: sql join optimization hana