加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

sql-server – 是否可以逼迫优化器消除此分区视图中不相干的表?

发布时间:2021-03-31 07:52:37 所属栏目:编程 来源:网络整理
导读:我正在为大型表测试差异的系统布局,而且我看到的一个提议是行使分区视图,个中大表被分成一系列较小的“分区”表. 1,2,3,4 在测试这种要领时,我发明白一些对我来说没有多大意义的对象.当我在究竟视图上过滤“分区列”时,优化器仅搜刮相干表.另外,假如我在维度

我正在为大型表测试差异的系统布局,而且我看到的一个提议是行使分区视图,个中大表被分成一系列较小的“分区”表.

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];

Here’s a link到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)

办理要领

启用跟踪符号4199.

我还必需发出:

UPDATE STATISTICS dbo.ObservationDates 
WITH ROWCOUNT = 73049;

得到下面表现的打算.上传时穷乏此表的统计信息. 73,049这个数字来自Plan Explorer附件中的Table Cardinality信息.我行使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等提醒以得到沟通的打算.分区视图(如分区表)的优化措施本钱选择也许很棘手.

要害是您必要一个具有启动过滤器的打算,以通过度区视图来消除动态分区.

行使嵌入式USE PLAN提醒的查询:(通过gist.github.com):

> Serial plan
> Parallel plan

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读