我在 SQL Server 中创建了一个物化视图,但是从中选择时,我得到的性能和执行计划与从未“物化”的相同查询中选择时相同。
观点很简单:
CREATE VIEW TestView WITH SCHEMABINDING
AS
SELECT TAB_A.C1, TAB_A.C2, TAB_A.C3
FROM TAB1
INNER JOIN TAB2 ON TAB1.C2 = TAB2.C2
INNER JOIN TAB3 ON TAB2.C1 = TAB3.C1;
CREATE UNIQUE CLUSTERED INDEX IX_TestView
ON TestView(C1, C2, C3);
现在,当我做类似的事情时
SELECT C1 FROM TestView
我希望在计划中看到只有对视图的访问,而不是其他任何东西,而是它访问基础表,就像视图甚至不存在一样。我也得到了完全相同的计划和相同的执行时间。
我究竟做错了什么?如果 SQL Server 无法“具体化”视图,我希望至少在创建它时会出现错误。
就像评论中提到的@sp_BlitzErik 一样,您需要使用
WITH (NOEXPAND)
提示,如下所示:当 SQL Server 读取您的查询并将视图的名称替换为视图的定义时,这就是所谓的“扩展”视图,因此
NOEXPAND
,您明确告诉 SQL Server 不要扩展视图,而是使用那里的索引.另一方面,如果没有索引(就像有人做
ALTER VIEW
的那样!),如果您使用WITH NOEXPAND
.