Mag*_*ier 1 index sql-server materialized-view
我想创建一个与此类似的索引视图(稍微简化):
Create VIEW dbo._v1
WITH SCHEMABINDING
AS
SELECT
COUNT_BIG(*) as CB
,[ID]
,TITLE]
,dbo.getXmlTranslation1(acat.[TITLE], 'de-DE') as T
FROM dbo.[ArticleCategory] acat
Group by
[ID]
,[TITLE]
Run Code Online (Sandbox Code Playgroud)
在此上创建唯一聚集索引失败:
CREATE unique CLUSTERED INDEX __CLIX
ON dbo._v1([ID]);
Run Code Online (Sandbox Code Playgroud)
无法在视图“db._v1T”上创建聚集索引“__CLIX”,因为视图的选择列表包含聚合函数或分组列结果的表达式。考虑从选择列表中删除聚合函数或分组列结果的表达式。
我搜索了解决方案,但找不到。如果我删除 GROUP BY(我在这里真的不需要),我会被告知由于多个 [ID] 结果,无法创建唯一聚集索引。我添加了标量函数调用,以解决索引视图中不允许的 XML 操作。我检查了标量函数是否是确定性的,是什么情况。
你的问题绝对是你的功能,你必须做一些事情来让它以不同的方式工作。这是一个非常基本的例子来说明这个问题。
首先创建您的测试数据。
CREATE TABLE dbo.testResults
(
id INT IDENTITY(1,1) PRIMARY KEY CLUSTERED
,col1 VARCHAR(200)
);
GO
INSERT INTO dbo.testResults
( col1 )
VALUES ( 'test1' ), ( 'test1' ), ( 'test2' ), ( 'test3' ), ( 'test4' ), ( 'test4' );
GO
Run Code Online (Sandbox Code Playgroud)
现在我们将创建一个视图(可以正常工作)并将聚集索引添加到该视图中。
CREATE VIEW vwResults
WITH SCHEMABINDING
AS
SELECT col1
,COUNT_BIG(*) AS cbcol1
FROM dbo.testResults AS tr
GROUP BY tr.col1;
GO
--Works great
CREATE UNIQUE CLUSTERED INDEX cls_tr ON dbo.vwResults (col1);
GO
Run Code Online (Sandbox Code Playgroud)
接下来我们将添加一个非常简单和基本的函数,它只执行非常基本的字符串操作(给定字符串的左 3 个字符)。
CREATE FUNCTION dbo.left3 (@str varchar(200))
RETURNS varchar(3)
WITH schemabinding
AS
begin
RETURN LEFT(@str, 3)
END;
Run Code Online (Sandbox Code Playgroud)
现在我们将摆脱之前的视图,将此列添加到视图中。
DROP VIEW dbo.vwResults;
GO
CREATE VIEW vwResults
WITH SCHEMABINDING
AS
SELECT col1
,dbo.left3(col1) AS left3col1
,COUNT_BIG(*) AS cbcol1
FROM dbo.testResults AS tr
GROUP BY tr.col1, dbo.left3(col1);
GO
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好。但是,通过将这个简单的函数添加到视图中而不是其他任何东西,我们不再能够索引视图。
/*FAILURE!!!!!!*/
CREATE UNIQUE CLUSTERED INDEX cls_tr ON dbo.vwResults (col1);
GO
Run Code Online (Sandbox Code Playgroud)
所以对于这个例子,有一个非常简单的解决方案,我可以很容易地创建一个计算列,然后一切正常。这是我将如何做到这一点。
ALTER TABLE dbo.testResults
ADD left3col1 AS LEFT(col1, 3);
Run Code Online (Sandbox Code Playgroud)
这样做之后,我可以创建相同的视图,这次我可以添加唯一的聚集索引,如下所示。
DROP VIEW dbo.vwResults;
GO
CREATE VIEW vwResults
WITH SCHEMABINDING
AS
SELECT col1
,left3col1
,COUNT_BIG(*) AS cbcol1
FROM dbo.testResults AS tr
GROUP BY tr.col1, left3col1;
GO
/*IT WORKS!!!!!!*/
CREATE UNIQUE CLUSTERED INDEX cls_tr ON dbo.vwResults (col1, left3col1);
GO
Run Code Online (Sandbox Code Playgroud)
这可能不是您的方案的选项,但基本上您的功能是问题所在,如果您想让索引视图适用于您的方案,您需要通过一些替代方案(取决于它的作用)。