【发布时间】:2019-05-06 06:17:50
【问题描述】:
我有一个在生产和开发环境中运行的 SQL Server 查询。完全相同的查询。
SELECT DISTINCT
[Record_Transformation_ACCRUALS],
[Record_Transformation_FA:AMORTIZATION],
[Record_Transformation_BONUS:AMORTIZATION],
[Record_Transformation_CPH:BYLABOUR],
[Record_Transformation_CPH:BYTARGETHOURS],
[Record_Transformation_OVERHEAD:CULTURE],
[Record_Transformation_DEDICATED COSTCENTER],
[Record_Transformation_PUSHDOWN:EXPENSE],
[Record_Transformation_OVERHEAD:FACILITIES],
[Record_Transformation_OVERHEAD:GENOME],
[Record_Transformation_TAXES:MANAGEMENT],
[Record_Transformation_TAXES:MARKETING],
[Record_Transformation_OVERHEAD:OFFICETECH],
[Record_Transformation_EXPENSE:PASSTHROUGH],
[Record_Transformation_OVERHEAD:PEOPLEPRACTICES],
[Record_Transformation_OVERHEAD:RECRUITING],
[Record_Transformation_TAXES:SALES],
[Record_Transformation_Static Transfer],
[Record_Label]
FROM
Warehouse_20181204
WHERE
Is_Target_Employee = 1 OR Is_Source_Employee = 1
我们比较了这两个表的创建脚本,它们是相同的(除了相关表的名称)。
我们还验证了它们都在使用聚集列存储索引。
在开发过程中,此查询只需不到一秒钟的时间。在 prod 上大约需要一分钟。起初我们认为数据的大小可能是问题所在,但差异很小(几十万行)。
然后我们检查了两者的实际执行计划。在 dev 上,实际的执行计划是:
在 prod 上,实际的执行计划却大不相同:
我们发现自己很难理解为什么会这样。我们已验证 SQL Server 的版本是相同的:
Microsoft SQL Server 2017 (RTM-CU5) (KB4092643) - 14.0.3023.8 (X64)
Web Edition (64-bit) on Windows Server 2016 Datacenter 10.0 <X64> (Build 14393:) (Hypervisor)
我的问题有两个:
- 我们如何确定为什么 prod 和 dev 之间的执行计划如此不同?
- 在给定类似数据集的情况下,如何让 prod 环境与 dev 环境一样快地运行?
编辑:
一些额外要求的细节:
- 两台服务器都有 8G 内存,运行时都有超过 1G 的空闲空间
- 两台服务器都有 2 个处理器
- 硬件与您得到的一样 - 两个相同大小的 aws 实例
- 我们已验证两个表和聚集列存储索引的 sql 是相同的
希望这些对当前 SQL 计划的所有其他细节有所帮助:
DEV sql 计划:https://gist.github.com/klick-barakgall/17a7ce926777a3257f7eecb32859458e
PROD sql 计划:https://gist.github.com/klick-barakgall/76eabf1008f5bfb0c51259c2ba3f509d
为那些有兴趣深入研究执行的人添加粘贴计划的链接。
【问题讨论】:
-
执行计划优化也是两面派;艺术和科学。 2个环境之间有很多相关的变量。您只能在 dev 上获得部分数据; # 使用该表的用户数;这些表的索引;记忆泡泡;关于 prod 中数据如何分区的文件组。
-
第一个计划是并行的,第二个不是。您的服务器是否具有相同的硬件,例如相同数量的处理器?
-
两个计划中从过滤器中出来的 估计 行是什么? (以及两者的最终结果?)
-
并行成本阈值的设置是否相同?服务器上的最大并行度是多少?两个盒子的统计数据都是最新的吗?
-
为 Jeroen 的问题添加了详细信息。 Martin_Smith 您要求的详细信息在我现在链接的 SQL 计划中。 @Zane:刚刚在两台服务器上运行了“UPDATE STATISTICS [table]”,然后在两台服务器上都运行了带有 OPTION(重新编译)的查询。两种性能都没有变化。两台服务器上的阈值并行成本相同 (5)。两台服务器上的最大度数也为零 (0)..
标签: sql-server tsql sql-server-2017