如何解决提高 SQL 视图加入多个表的速度,所有表都带有主键
我有一个包含 300 万条记录的事实表。该视图需要大约 8 分钟才能运行并连接到大约 9 个其他表(所有表都有 PK 并且连接是在 PK 上完成的)并且还有一个小的日期排除。
SELECT k.Field,l.Field
--...,z.field
FROM dbo.Fact f
join DimRegion dr on dr.RegionKey = f.RegionKey AND dr.RegionName = 'UK'
join DimDate dd on dd.DateKey = f.DateKey and dd.Date >= '2020-07-01'
join DimTable dt on dt.TKey = f.TKey and dt.isExcluded = 0
left join DimK dk on f.KKey = dk.KKey
--...
left join DimZ dz on f.ZKey = dz.ZKey
如果我注释掉所有 LEFT JOIN,查询需要 90 秒,并且每个增加大约 45 秒的运行时间。所有连接均使用整数值进行。
我重建了所有碎片化的索引,在日期上创建了索引,但这根本没有帮助。 这是数字最高的执行计划:
我还能做些什么来加快速度,或者数据量太大,这就是为什么需要这么长时间?
这是完整的计划(感谢@eshirvana): https://www.brentozar.com/pastetheplan/?id=S1tphqoEu
解决方法
您为什么要优化向客户端返回 230 万行的查询?
您应该在服务器上过滤和聚合结果。除了 1.5 分钟的 IO 等待和 1 分钟的 CPU 时间外,此查询仅花费 3 分钟将所有结果发送到客户端。
<WaitStats>
<Wait WaitType="ASYNC_NETWORK_IO" WaitTimeMs="171313" WaitCount="189426" />
<Wait WaitType="IO_COMPLETION" WaitTimeMs="66082" WaitCount="16620" />
<Wait WaitType="IO_QUEUE_LIMIT" WaitTimeMs="49006" WaitCount="3433" />
<Wait WaitType="RESERVED_MEMORY_ALLOCATION_EXT" WaitTimeMs="889" WaitCount="496442" />
<Wait WaitType="SOS_SCHEDULER_YIELD" WaitTimeMs="430" WaitCount="5574" />
<Wait WaitType="RESOURCE_GOVERNOR_IDLE" WaitTimeMs="162" WaitCount="19" />
<Wait WaitType="MEMORY_ALLOCATION_EXT" WaitTimeMs="80" WaitCount="44521" />
</WaitStats>
<QueryTimeStats CpuTime="75783" ElapsedTime="481785" />
为什么您的事实表是聚集索引表而不是 clustered columnstore?一旦停止将所有行和列返回给客户端,聚集列存储的性能应该会好得多。
,感谢您的所有帮助和想法! 我重建了统计数据,并专注于索引——尤其是 DimDate 的索引。 有帮助的是改变这一点
...f.DateKey and dd.Date >= '2020-07-01'
到
...f.DateKey and f.DateKey >= 20200701
我意识到在@Stu 评论使用强制命令(我已经设法找出哪个索引使我失败)后,花了一分半的时间,但完全跳过该索引需要半场时间(少 3.5 分钟)和剩余时间,正如@David Browne 提到的,3 分钟用于向客户发送完整数据,我对此很满意,因为大部分时间它会被客户和日期过滤,所以现在实际上需要几秒钟。 再次感谢。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。