无法在View上创建CLUSTERED INDEX,因为我引用了同一个表两次,任何解决方法?

时间:2009-06-18 08:59:09

标签: sql-server-2005 tsql database-design

我想创建一个集成来自多个表的数据的索引视图,但SQL Server会抱怨错误消息:

无法在视图“MyView”上创建索引。该视图包含“dbo.Companies”上的自联接。

视图定义是这样的(简化版):

SELECT  T.Field1
      , T.Field2
      , P.CompanyName AS ProviderName
      , C.CompanyName AS CustomerName
      , T3.Field1
FROM dbo.Table1 T 
                  INNER JOIN dbo.Companies P ON T.ProviderId = T2.Id
                  INNER JOIN dbo.Companies C ON T.CustomerId = T2.Id
                  INNER JOIN dbo.Table3 ON T.Id = T3.Id

这种情况有解决方法吗?我不想将 Companies 表拆分为两个表。

提前致谢。

2 个答案:

答案 0 :(得分:2)

您将无法解决此问题,索引视图必须符合Creating Indexed Views中列举的某些限制。除其他外,不支持外部和自我连接(从上到下的第10个限制)。它归结为引擎能够在更新基表时更新视图索引。

不确切知道数据模型的所有细节,您确定索引视图是否必要且基表索引是否足够?

答案 1 :(得分:0)

描述了一种解决方法here

您创建了两个视图:

  1. 一个索引视图,其中包含一组用于第一次连接的行和一组用于第二次连接的行,即它未旋转数据。此视图可以编入索引。
  2. 一个未索引的视图,它将您的索引视图转回单独的列

在此变通方法中,您确实获得了一个执行连接的索引视图,但 SQL 需要执行额外的 PIVOT 操作以获取您希望如何使用数据的数据。我不知道这是否会提高性能与仅在没有索引视图的情况下进行连接。 (但如果您进行分析,请告诉我)。