SQL 服务器索引视图分区
SQL Server Indexed View Division
是否可以在索引视图的SELECT语句中执行除法?
当我添加一个列结果,即一列的值除以另一列时,我开始收到以下错误:
无法在视图 'MyDB.dbo.getUsageForUsers' 上创建聚簇索引 'CX_t',因为视图的 select 列表包含聚合函数或分组列结果的表达式。考虑从 select 列表中删除聚合函数或分组列结果的表达式。
SUM(ISNULL(DATEDIFF(minute, ac.StartTime, ac.EndTime), 0)) AS Effort,
SUM(ISNULL(DATEDIFF(minute, ut.StartTime, ut.EndTime), 0)) AS Availability,
-- Below line leads to the error in the question
SUM(ISNULL(DATEDIFF(minute, ac.StartTime, ac.EndTime), 0)) / SUM(ISNULL(DATEDIFF(minute, ut.StartTime, ut.EndTime), 0)) AS Utilisation,
谢谢
如错误所述,您无法创建适用于聚合结果的表达式。不过,您可以做的是创建两个视图。第一个视图,即索引视图,仅计算聚合(Effort
和 Affordability
)。第二个视图 non-indexed 使用第一个视图并可以执行进一步的计算 (Utilisation
),并由查询代码使用。
您仍然会受益于维护聚合的索引,这是经常引入索引视图来解决的代价高昂的操作。
CREATE VIEW dbo.V1
WITH SCHEMABINDING
AS
SELECT
SUM(ISNULL(DATEDIFF(minute, ac.StartTime, ac.EndTime), 0)) AS Effort,
SUM(ISNULL(DATEDIFF(minute, ut.StartTime, ut.EndTime), 0)) AS Availability,
...
CREATE INDEX IX_V1 on dbo.V1 (...)
CREATE VIEW dbo.V2
WITH SCHMEBINDING
AS
SELECT
Effort,
Availability,
Effort/Availability as Utilisation
/* Other calcs */
FROM
dbo.V1 WITH (NOEXPAND)
是否可以在索引视图的SELECT语句中执行除法? 当我添加一个列结果,即一列的值除以另一列时,我开始收到以下错误:
无法在视图 'MyDB.dbo.getUsageForUsers' 上创建聚簇索引 'CX_t',因为视图的 select 列表包含聚合函数或分组列结果的表达式。考虑从 select 列表中删除聚合函数或分组列结果的表达式。
SUM(ISNULL(DATEDIFF(minute, ac.StartTime, ac.EndTime), 0)) AS Effort,
SUM(ISNULL(DATEDIFF(minute, ut.StartTime, ut.EndTime), 0)) AS Availability,
-- Below line leads to the error in the question
SUM(ISNULL(DATEDIFF(minute, ac.StartTime, ac.EndTime), 0)) / SUM(ISNULL(DATEDIFF(minute, ut.StartTime, ut.EndTime), 0)) AS Utilisation,
谢谢
如错误所述,您无法创建适用于聚合结果的表达式。不过,您可以做的是创建两个视图。第一个视图,即索引视图,仅计算聚合(Effort
和 Affordability
)。第二个视图 non-indexed 使用第一个视图并可以执行进一步的计算 (Utilisation
),并由查询代码使用。
您仍然会受益于维护聚合的索引,这是经常引入索引视图来解决的代价高昂的操作。
CREATE VIEW dbo.V1
WITH SCHEMABINDING
AS
SELECT
SUM(ISNULL(DATEDIFF(minute, ac.StartTime, ac.EndTime), 0)) AS Effort,
SUM(ISNULL(DATEDIFF(minute, ut.StartTime, ut.EndTime), 0)) AS Availability,
...
CREATE INDEX IX_V1 on dbo.V1 (...)
CREATE VIEW dbo.V2
WITH SCHMEBINDING
AS
SELECT
Effort,
Availability,
Effort/Availability as Utilisation
/* Other calcs */
FROM
dbo.V1 WITH (NOEXPAND)