我正在为大表测试不同的体系结构,我看到的一个建议是使用分区视图,从而将一个大表分成一系列较小的“分区”表。
1 , 2 , 3 , 4
在测试这种方法时,我发现了一些对我来说意义不大的东西。当我在事实视图上过滤“分区列”时,优化器只在相关表上查找。此外,如果我在维度表上过滤该列,优化器会消除不必要的表。
但是,如果我过滤优化器在每个基表的 PK/CI 上寻找的维度的其他方面。
以下是有问题的查询:
select od.[Year], AvgValue = avg(ObservationValue) from dbo.v_Observation o join dbo.ObservationDates od on o.ObservationDateKey = od.DateKey where o.ObservationDateKey >= 20000101 and o.ObservationDateKey <= 20051231 group by od.[Year]; select od.[Year], AvgValue = avg(ObservationValue) from dbo.v_Observation o join dbo.ObservationDates od on o.ObservationDateKey = od.DateKey where od.DateKey >= 20000101 and od.DateKey <= 20051231 group by od.[Year]; select od.[Year], AvgValue = avg(ObservationValue) from dbo.v_Observation o join dbo.ObservationDates od on o.ObservationDateKey = od.DateKey where od.[Year] >= 2000 and od.[Year] < 2006 group by od.[Year];
我确实为在维度的一个方面进行过滤的(简单)查询进行了分区消除。
同时,这里是数据库的仅统计副本:
https://gist.github.com/swasheck/9a22bf8a580995d3b2aa
“旧的”基数估计器得到一个更便宜的计划,但这是因为对每个(不必要的)索引搜索的基数估计较低。
我想知道是否有办法让优化器在按维度的另一个方面进行过滤时使用键列,以便它可以消除对不相关表的搜索。
SQL 服务器版本:
Microsoft SQL Server 2014 - 12.0.2000.8 (X64) Feb 20 2014 20:04:26 Copyright (c) Microsoft Corporation Developer Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
启用跟踪标志 4199。
我还必须发出:
UPDATE STATISTICS dbo.ObservationDates WITH ROWCOUNT = 73049;
得到如下所示的计划。上传中缺少此表的统计信息。73,049 这个数字来自计划资源管理器附件中的表基数信息。我使用带有两个逻辑处理器的 SQL Server 2014 SP1 CU4(内部版本 12.0.4436),最大内存设置为 2048 MB,除 4199 外没有跟踪标志。
然后你应该得到一个具有动态分区消除功能的执行计划:
select od.[Year], AvgValue = avg(ObservationValue) from dbo.v_Observation o join dbo.ObservationDates od on o.ObservationDateKey = od.DateKey where od.[Year] >= 2000 and od.[Year] < 2006 group by od.[Year] option (querytraceon 4199);
计划片段:
这可能看起来更糟,但过滤器都是启动过滤器。一个示例谓词是:
循环的每次迭代都会测试启动谓词,只有当它返回 true 时,它下面的 Clustered Index Seek 才会执行。因此,动态分区消除。
这可能不如静电消除那么有效,特别是如果计划是并行的。
您可能需要在视图上尝试或之类MAXDOP 1的提示以获得相同的计划。分区视图(如分区表)的优化器成本选择可能很棘手。FAST 1``FORCESEEK
MAXDOP 1
FAST 1``FORCESEEK
关键是您需要一个具有启动过滤器功能的计划,以通过分区视图获得动态分区消除。
带有嵌入式USE PLAN提示的查询:(通过 gist.github.com):
USE PLAN