JNB*_*JNB 7 performance sql-server execution-plan spatial amazon-rds
两台服务器,Development 和 Live。实时服务器是一个 Amazon RDS SQL Server Web 实例。两台服务器都具有相同的架构和数据。几何列上有一个很好的空间索引。在我的开发服务器上,查询在 < 30 毫秒内执行。在实时服务器上,查询需要 > 20 分钟。
检查执行计划表明它们完全不同。一方面,在我的开发环境中,查询是并行化的,而在实时服务器上则不是。
如果您对原因或如何最好地诊断问题有任何见解,我将不胜感激。
DECLARE @geoBoundary geometry;
SET @geoBoundary = geometry::STGeomFromText('POLYGON((407439.5 108792.25, 408022.5 108792.25, 408022.5 108575.75, 407439.5 108575.75, 407439.5 108792.25))', '0');
SELECT
ogr_geometry.ToString() AS strGeometry
,ogr_geometry
FROM inspire as geo
WHERE geo.ogr_fid IN
(
SELECT
geo.ogr_fid
FROM .inspire as geo
WHERE
(
(@geoBoundary.STContains(geo.ogr_geometry) = 1)
)
UNION
SELECT
geo.ogr_fid
FROM .inspire as geo
WHERE
(
(@geoBoundary.STOverlaps(geo.ogr_geometry) = 1)
)
)
Run Code Online (Sandbox Code Playgroud)
cost threshold for parallelism两台服务器上为5(默认值)。max server memory 两者都是一样的。比较所提供的两个执行计划的详细信息:
由于软件和硬件存在如此多的基本差异,因此计划有所不同也就不足为奇了。
理想情况下,开发和测试环境应尽可能与生产相匹配。它们当然应该使用相同版本的 SQL Server(注意 2012 年的安装仍然在 RTM 上,两个完整的服务包和七个进一步的累积更新。
如果没有查询中涉及的模式的纯统计副本,就很难知道如何建议来改进 2012 年的查询计划。如果您习惯使用提示,您可以尝试添加:
OPTION (LOOP JOIN, HASH JOIN, CONCAT UNION, QUERYTRACEON 8649);
Run Code Online (Sandbox Code Playgroud)
在查询结束时鼓励优化器朝着更好的计划的大方向前进。该提示集合的最后一部分(为查询设置跟踪标志 8649)未记录,并且不支持生产。
这些提示可能会成功,也可能不会成功,因为根本问题是 70 级基数估计器提供的基数估计不准确。查询重写或索引更改也可能会成功,但从这里猜测确实不切实际。
相关阅读:
强制并行执行计划
UAT 和 PROD 上的不同计划
“相同”查询的多个计划
“相同”服务器的不同计划
| 归档时间: |
|
| 查看次数: |
652 次 |
| 最近记录: |