3

我无法在此视图上创建索引

CCF.UserHistory.NEID是一个计算和持久的列。

CREATE VIEW [Calais].[vwBossDaily]
WITH SCHEMABINDING
AS
  SELECT SUM(ISNULL(Score, 0))               AS Score,
         SUM(ISNULL(DivideBy, 0))            AS DivideBy,
         COUNT_BIG(*)                        AS Count,
         ReportDefGroupID,
         ImportDate,
         MetricID,
         ISNULL(Calais.Card.BossNEID, 0)     AS BossNEID,
         ISNULL(CCF.UserHistory.BossNEID, 0) AS BossBossNEID
  FROM   Calais.Card
         INNER JOIN CCF.UserHistory
           ON Calais.Card.BossNEID = CCF.UserHistory.NEID
              AND Calais.Card.ImportDate = CCF.UserHistory.keyDate
  GROUP  BY ReportDefGroupID,
            ImportDate,
            MetricID,
            ISNULL(Calais.Card.BossNEID, 0),
            ISNULL(CCF.UserHistory.BossNEID, 0)

GO

/****** Object:  Index [VIX_Card]    Script Date: 10/24/2013 11:28:01 ******/
CREATE UNIQUE CLUSTERED INDEX [VIX_Card]
  ON [Calais].[vwBossDaily] ( 
                            [ReportDefGroupID] ASC, 
                            [ImportDate] ASC, 
                            [MetricID] ASC, 
                            [BossNEID] ASC, 
                            [BossBossNEID] ASC )
  WITH (PAD_INDEX = OFF, 
        STATISTICS_NORECOMPUTE = OFF, 
        SORT_IN_TEMPDB = OFF, 
        IGNORE_DUP_KEY = OFF, 
        DROP_EXISTING = OFF, 
        ONLINE = OFF, 
        ALLOW_ROW_LOCKS = ON, 
        ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO 

错误:

消息 1901,级别 16,状态 1,第 3 行
无法在视图“Calais.vwBossDaily”上创建索引或统计信息“VIX_Card”,因为键列“BossBossNEID”不精确、已计算且未保留。
考虑删除对视图索引或统计键中的列的引用,或者准确地更改列。如果列是在基表中计算的,请考虑将其标记为 PERSISTED 。

一个更简单的问题再现是

CREATE TABLE T
(
id int,
BossNEID AS CAST(id as float) PERSISTED
)

GO

CREATE VIEW V
WITH SCHEMABINDING
AS
SELECT ISNULL(BossNEID, 0) AS BossNEID
FROM dbo.T  
GROUP BY ISNULL(BossNEID, 0)

GO

CREATE UNIQUE CLUSTERED INDEX IX ON V(BossNEID) /*Fails*/
4

1 回答 1

4

持久性不是这里的问题。精确度是。

创建索引视图

即使一个表达式是确定性的,如果它包含浮点表达式,确切的结果可能取决于处理器架构或微码的版本。为确保数据完整性,此类表达式只能作为索引视图的非键列参与。不包含浮点表达式的确定性表达式称为精确。只有精确的确定性表达式才能参与键列以及索引视图的 WHERE 或 GROUP BY 子句。

(精确强调了我的我)

不精确,被报告为错误的可能原因。

据我了解,相对于它们的绝对值,两个浮点值可能相差很小,以至于某些处理器架构或微码版本可能认为它们相等,而其他人则认为它们不同。

于 2013-11-11T20:12:32.567 回答