sql-server-2008 - 无法创建索引...不精确,计算且未持久化

标签 sql-server-2008 tsql indexing

我不能在这个 View 上创建索引

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 

错误:

Msg 1901, Level 16, State 1, Line 3
Cannot create index or statistics 'VIX_Card' on view 'Calais.vwBossDaily' because key column 'BossBossNEID' is imprecise, computed and not persisted.
Consider removing reference to column in view index or statistics key or changing column to be precise. If column is computed in base table consider marking it PERSISTED there.

一个更简单的问题重现是

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*/

最佳答案

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

来自 Create Indexed Views :

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

(精确强调我的我)

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

据我了解,两个浮点值相对于它们的绝对值可能相差如此之小,以至于它们可能被某些处理器架构或微码版本认为是相等的,并且被认为与众不同。

关于sql-server-2008 - 无法创建索引...不精确,计算且未持久化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19734234/

相关文章:

sql-server - 使用相当于 sql IN 运算符的 linq

sql - 如何在不插入sql server记录的情况下知道表的下一个主键值?

c# - 'CREATE VIEW' 必须是查询批处理中的第一个语句

c++ - TokuMX 中的部分索引

sql-server - 按 FK 引用文献的顺序对表格进行排序?

sql-server - 选择最多一个空格的数据?

sql - 如何从 varchar 中获取最后四个字符?

umbraco - 设置 Umbraco 索引

需要Mysql优化帮助

sql - 自动更新 SQL Server 中的列值