Sql server 物化(索引)视图的性能
考虑这个具体化的视图:Sql server 物化(索引)视图的性能,sql-server,sql-server-2012,Sql Server,Sql Server 2012,考虑这个具体化的视图: CREATE VIEW [vwPlaySequence] WITH SCHEMABINDING AS SELECT p.SiteIDNumber, dbo.ToUnsignedInt(p.SequenceNumber) AS PlayID, p.SequenceNumber FROM dbo.Play p GO CREATE UNIQUE CLUSTERED INDEX PK_vwPlaySequence ON [vwPlaySeq
CREATE VIEW [vwPlaySequence] WITH SCHEMABINDING
AS
SELECT
p.SiteIDNumber,
dbo.ToUnsignedInt(p.SequenceNumber) AS PlayID,
p.SequenceNumber
FROM dbo.Play p
GO
CREATE UNIQUE CLUSTERED INDEX
PK_vwPlaySequence ON [vwPlaySequence]
(
[PlayID],
[SiteIDNumber],
[SequenceNumber]
)
GO
基表在SequenceNumber上具有聚集索引
对基表的以下查询在4秒内执行1.6亿行:
select SiteIDNumber, min(SequenceNumber), max(SequenceNumber) from Play
group by SiteIDNumber
以下是执行计划:
这是在46秒内对视图执行的相同查询:
select SiteIDNumber, min(SequenceNumber), max(SequenceNumber) from vwPlaySequence
group by SiteIDNumber
其执行计划:
我不认为这些执行计划中有什么可以保证在运行时间上有如此大的差异。我多次运行这两个查询,结果相同。两个查询都使用视图。一个是平行的,一个不是。您说向两个查询添加
选项(MAXDOP 1)
会使所有差异消失。这意味着并行性解释了所有的差异
在这里的一种情况下,SQL Server没有逻辑上的理由必须选择串行计划。这可能是一个bug或已知的限制。我在索引视图匹配中遇到了许多限制和奇怪的行为。从这个意义上说,我只是有点惊讶
既然已经(某种程度上)解释了差异,该怎么办
选项(QUERYTRACEON 8649)——将并行成本设置为零。这是一个未记录的跟踪标志,一些主要专家认为它对生产是安全的。我也认为它是安全的。
您可以尝试使用和(NOEXPAND)
从视图中进行选择。这绕过了视图匹配,并有望使SQLServer找到一个并行计划
首选选项(2)。两个查询都使用该视图。一个是平行的,一个不是。您说向两个查询添加选项(MAXDOP 1)
会使所有差异消失。这意味着并行性解释了所有的差异
在这里的一种情况下,SQL Server没有逻辑上的理由必须选择串行计划。这可能是一个bug或已知的限制。我在索引视图匹配中遇到了许多限制和奇怪的行为。从这个意义上说,我只是有点惊讶
既然已经(某种程度上)解释了差异,该怎么办
您可以尝试强制并行:选项(QUERYTRACEON 8649)——将并行成本设置为零。这是一个未记录的跟踪标志,一些主要专家认为它对生产是安全的。我也认为它是安全的。
您可以尝试使用和(NOEXPAND)
从视图中进行选择。这绕过了视图匹配,并有望使SQLServer找到一个并行计划
首选选项(2)。两个查询都使用该视图。一个是平行的,一个不是。您说向两个查询添加选项(MAXDOP 1)
会使所有差异消失。这意味着并行性解释了所有的差异
在这里的一种情况下,SQL Server没有逻辑上的理由必须选择串行计划。这可能是一个bug或已知的限制。我在索引视图匹配中遇到了许多限制和奇怪的行为。从这个意义上说,我只是有点惊讶
既然已经(某种程度上)解释了差异,该怎么办
您可以尝试强制并行:选项(QUERYTRACEON 8649)——将并行成本设置为零。这是一个未记录的跟踪标志,一些主要专家认为它对生产是安全的。我也认为它是安全的。
您可以尝试使用和(NOEXPAND)
从视图中进行选择。这绕过了视图匹配,并有望使SQLServer找到一个并行计划
首选选项(2)。两个查询都使用该视图。一个是平行的,一个不是。您说向两个查询添加选项(MAXDOP 1)
会使所有差异消失。这意味着并行性解释了所有的差异
在这里的一种情况下,SQL Server没有逻辑上的理由必须选择串行计划。这可能是一个bug或已知的限制。我在索引视图匹配中遇到了许多限制和奇怪的行为。从这个意义上说,我只是有点惊讶
既然已经(某种程度上)解释了差异,该怎么办
您可以尝试强制并行:选项(QUERYTRACEON 8649)——将并行成本设置为零。这是一个未记录的跟踪标志,一些主要专家认为它对生产是安全的。我也认为它是安全的。
您可以尝试使用和(NOEXPAND)
从视图中进行选择。这绕过了视图匹配,并有望使SQLServer找到一个并行计划
首选选项(2)。两个查询都使用该视图。你有企业版,对吗?这个盒子有多少个CPU?您确定CI不在SiteIDNumber上吗?因为你得到的是一个流聚合。它必须在该列上进行排序。无论如何,您查看它时,两个查询仍然在同一个视图上,但执行时间相差一个数量级。两者的CI相同。一个是平行的,另一个不是平行的。我问这些问题是有原因的。。。并行性解释了11倍的差异吗?这个盒子是一个双四路,8个CPU。CI定义见上文。我尝试过移动PlayID和SiteID,但是结果是一样的。让我们做一个实验:向两个查询添加选项(MAXDOP 1)。现在时间和计划是否相同?两个查询都使用该视图。你有企业版,对吗?这个盒子有多少个CPU?您确定CI不在SiteIDNumber上吗?因为你得到的是一个流聚合。它必须在该列上进行排序。无论如何,您查看它时,两个查询仍然在同一个视图上,但执行时间相差一个数量级。两者的CI相同。一个是平行的,另一个不是平行的。我问这些问题是有原因的。。。并行性解释了11倍的差异吗?这个盒子是一个双四路,8个CPU。CI定义见上文。我尝试过移动PlayID和SiteID,但是结果是一样的