【问题标题】:Indexed view: Union All / Full Join alternatives索引视图:Union All / Full Join 备选方案
【发布时间】:2012-09-03 19:37:17
【问题描述】:

我有两个表,它们都有一个“名称”列。这些表彼此不相关。我想强制这两列的唯一性。

我一直在尝试从两列中创建一个索引视图,但发现我不能使用 union all 或 full join 来获取完整的名称列表。我觉得我错过了一个明显的替代方案,可以让我添加唯一索引。

【问题讨论】:

    标签: sql-server sql-server-2008-r2


    【解决方案1】:

    假设您的两个基表都对“名称”具有唯一性约束,那么违反唯一性的唯一方法是两个表中的名称相同。

    即您希望针对它们的联接返回零行。因此,您可以将该连接的结果与一个有 2 行的表交叉连接,并创建一个唯一索引。

    CREATE TABLE dbo.Two
      (
         N INT PRIMARY KEY
      )
    
    INSERT INTO dbo.Two
    VALUES      (1),
                (2)
    
    GO
    
    CREATE VIEW dbo.UniqueNames
    WITH SCHEMABINDING
    AS
      SELECT T1.Name
      FROM   dbo.T1
             INNER JOIN dbo.T2
               ON T1.Name = T2.Name
             CROSS JOIN dbo.Two
    
    GO
    
    CREATE UNIQUE CLUSTERED INDEX IX
      ON dbo.UniqueNames(Name) 
    

    【讨论】:

    • 这种方法不会导致对基础表的任何更改重新构建聚集索引吗?
    • @Andomar - 重建什么?该视图应始终不包含任何行,除非它即将引发约束冲突,否则可能是暂时的。索引视图维护应该只尝试对基表中的已修改行进行连接。这就是为什么对索引视图有所有限制的原因。
    • 感谢您的澄清。我不知道索引视图这么聪明。 :)
    猜你喜欢
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 2011-07-11
    • 2015-03-26
    • 2021-10-12
    相关资源
    最近更新 更多