首页 > 解决方案 > SQL Server:在左连接查询的执行计划中插入隐藏的“排序”

问题描述

SQL 2017 Standard 我有一个星型模式模型(数据仓库)中的数据库来填充事实表,我有一个存储过程,其中包含一个大约 470,0000 行的临时表。为了填写维度 ID,我在临时表和维度表之间进行了左连接操作。例如:

insert into factTable (...fields list...)
select t.Quantity1,t.Quantity2,d1.ID,d.ID,...,19.id from
MyTemp t
left outer join dim1 d1 on t.F1=d1.F1 and t.CompanyID=d1.CompanyID and t.DataSourceID=d1.DataSourceID
left outer join dim2 d2 on t.F2=d2.F2 and t.CompanyID=d2.CompanyID and t.DataSourceID=d2.DataSourceID
left outer join dim3 d3 on t.F3=d3.F3 and t.CompanyID=d2.CompanyID and t.DataSourceID=d2.DataSourceID
.......
left outer join dim19 d19 on t.F19=3.F19 and t.CompanyID=d19.CompanyID and t.DataSourceID=d19.DataSourceID

问题是当使用较少数量的连接时,例如前 5 或 6 个维度,查询非常快。

有 19 个连接,需要 4 个多小时。

执行计划显示瓶颈来自查询优化器插入的隐藏“排序”操作!!!!

从每个维度读取数据时,sql server 在加入临时表之前对维度数据进行排序。在临时表上引入索引并没有解决问题。即使将查询限制在临时表索引中的第一个字段也无济于事

执行计划中的隐藏排序

隐藏排序 - 第二张图片

标签: sqlsql-serverleft-joinexecution

解决方案


使用

CREATE CLUSTERED COLUMNSTORE INDEX

在临时表上解决了这个问题。谢谢你们。您可以查看CLUSTERED COLUMNSTORE INDEX了解更多详细信息(如果您使用的是 SQL Server 2016 标准版,则需要 SP2)


推荐阅读