我不能在这个 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/