为啥不允许在索引视图中使用 UNION

Posted

技术标签:

【中文标题】为啥不允许在索引视图中使用 UNION【英文标题】:Why is it not allowed to use UNION in an Indexed View为什么不允许在索引视图中使用 UNION 【发布时间】:2013-07-11 14:30:41 【问题描述】:

根据question/answer 和MSDN documentation,在设计索引视图时不能使用 UNION 关键字。

但是为什么这在技术上对 DBMS 来说是个问题?

在这种情况下,允许在 VUnion(ID) 上添加索引可能非常有用:

CREATE TABLE T1 (ID INT, Name NVARCHAR(100))
CREATE TABLE T2 (ID INT, Info NVARCHAR(1000))

CREATE VIEW VUnion
AS
SELECT ID FROM T1
    UNION
SELECT ID FROM T2
END

【问题讨论】:

【参考方案1】:

我无法回答“为什么”的技术性问题,可能只有 SQL-Server 项目的 Microsoft 开发人员才能完全阐明这一点。

但是你为什么没有另一张桌子,比如T0,它将容纳两张桌子中的任何一张中的所有IDs?你甚至可以有外键约束,来自T1T2,引用T0 表。

当然,这意味着您在 2 个表上的插入和删除过程需要额外的工作,但问题已经解决:您将在 T0 (id) 上拥有主键,这意味着它会自动建立一个索引。

【讨论】:

这就是我会做的。使用触发器或自定义精心修剪的存储过程。对于这样一个简单的目标来说,这似乎有点矫枉过正。但是当我断言“simple”时,我显然会错过一些东西。

以上是关于为啥不允许在索引视图中使用 UNION的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在 postgresql 中的视图不使用索引?

当我的视图包含 UNION ALL 时,如何让 Oracle 使用索引?

union all这样写为啥提示“使用 UNION、INTERSECT 或 EXCEPT 运算符合并的所有查询必须在其目标列表中有

为啥在golang中不允许对切片指针进行索引

MySQL 优化

使用 dbt_utils.union_relations 错误但不知道如何/为啥?