我正在测试大型表的不同体系结构,并且看到的一个建议是使用分区视图,即将大型表分解为一系列较小的“分区”表。
在测试这种方法时,我发现有些东西对我来说并没有太大意义。当我在事实视图的“分区列”上进行过滤时,优化程序仅在相关表上进行搜索。此外,如果我在维度表的该列上进行过滤,则优化程序会消除不必要的表。
但是,如果我在维度的其他方面进行过滤,则优化器将在每个基本表的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];
这是指向 SQL Sentry Plan Explorer会话的链接。
我正在实际对较大的表进行分区,以查看是否可以消除分区以类似的方式进行响应。
我确实获得了针对(简单)查询的分区消除,该查询在维度的某个方面进行了过滤。
同时,这是数据库的仅统计信息副本:
https://gist.github.com/swasheck/9a22bf8a580995d3b2aa
“旧的”基数估计器获得了一个较便宜的计划,但这是因为对每个(不必要的)索引搜索的基数估计值都较低。
我想知道是否有一种方法可以使优化器在按维度的另一个方面进行过滤时使用键列,从而可以消除对不相关表的查找。
SQL Server版本:
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)
ObservationDates
表的统计信息。即使4199,我也没有得到与Paul相同的计划,这就是为什么。
ObservationDates
。我最终UPDATE STATISTICS ObservationDates WITH ROWCOUNT = 10000
手动运行以得到Paul演示的计划。
ObservationDates
所以我不确定那是怎么回事。此外,我也无法获得生成的计划报酬。我将尝试更新以查看。
CREATE STATISTICS [_WA_Sys_00000008_2FCF1A8A] ON [dbo].[Observation_2010]([StationStateCode]) WITH STATS_STREAM = 0x01000000010000000000000000000000D4531EDB00000000D5080000000000009508000000000000AF030000AF000000020000000000000008D000340000000007000000E65DE0007DA5000076F9780000000000867704000000000000000000ABAAAA3C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000