gpt4 book ai didi

sql - 用什么替换 View 中的左连接以便我可以拥有索引 View ?

转载 作者:行者123 更新时间:2023-12-02 03:59:00 27 4
gpt4 key购买 nike

我在数据库中有规范化的表,为了使其非规范化,我用两个表创建了一个 View 。当我尝试在 View 上创建聚集索引时,它不允许我这样做,因为 View 是使用左外连接创建的。我使用左连接是因为我希望空值显示在结果 View 中,就像之前的文章中建议的那样。

Question on join where one column one side is null

表结构和关系与上面链接中描述的非常相似。

我似乎在这里碰壁了,因为我无法将左连接转换为内连接,因为这会排除任何连接列上具有空值的所有记录。我的问题是:

  1. 为什么不允许在外连接或自连接上建立索引?
  2. 这种未编制索引的 View 是否会对性能造成影响?
  3. 有人知道解决此问题的方法吗?

我昨天刚刚完成 SQL Server 类(class),所以不知道如何继续。如有任何意见,将不胜感激。干杯。

最佳答案

这是一个替代方案。您想要一个不包含 B 的 A 的物化 View 。这不是直接可用的...因此,请物化两个 View 。所有 A 之一,以及仅有的 A 和 B 之一。然后,通过取除 B 之外的 A 来仅得到没有 B 的 A。这可以有效地完成:

创建两个物化 View (mA 和 mAB)(编辑:mA 可以只是基表)。mA 缺少 A 和 B 之间的连接(因此包含 A 的所有句点 [因此包含 B 中不匹配的那些记录])。mAB 连接 A 和 B(因此仅包含 A 和 B [因此排除 B 中不匹配的记录])。

要获取 B 中没有匹配的所有 A,请屏蔽掉那些匹配的:

with ids as (
select matchId from mA with (index (pk_matchid), noexpand)
except
select matchId from mAB with (index (pk_matchid), noexpand)
)
select * from mA a join ids b on a.matchId = b.matchId;

这应该会针对您的聚集索引产生一个左反半连接以获取 ids,并产生一个聚集索引来从您正在寻找的 mA 中获取数据。

本质上,您遇到的问题是这样的基本规则:SQL 更擅长处理存在的数据,而不是处理不存在的数据。通过具体化两个来源,您可以获得一些引人注目的基于集合的选项。您必须自己权衡这些观点的成本和 yield 。

关于sql - 用什么替换 View 中的左连接以便我可以拥有索引 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6476933/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com