sql - 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 在加入临时表之前对维度数据进行排序。在临时表上引入索引并没有解决问题。即使将查询限制在临时表索引中的第一个字段也无济于事
解决方案
使用
CREATE CLUSTERED COLUMNSTORE INDEX
在临时表上解决了这个问题。谢谢你们。您可以查看CLUSTERED COLUMNSTORE INDEX了解更多详细信息(如果您使用的是 SQL Server 2016 标准版,则需要 SP2)
推荐阅读
- python - 显示特定学生以各自价格购买的水果
- android - 无需清单权限即可打开呼叫意图和短信意图
- ionic-framework - 在离子菜单中设置动态项目
- c - 删除使用 __attribute__((section)) 创建的部分
- reactjs - 序列化数据以响应提交发布请求
- symfony - Sylius 1.3 - “Sylius\Component\Addressing\Model\X”的类“App\Entity\X”子类不是有效的实体或映射的超类
- java - Java将int重载为long
- sass - Fontawesome 5+ 图标未显示
- arrays - 将具有 1 个有效位的 16 字节/字节数组转换/重新打包为具有 python3 中所有有效位的字节
- python - 在给定路径时搜索 S3 中的文件