提问人:Serhat Celik 提问时间:11/12/2023 最后编辑:Serhat Celik 更新时间:11/13/2023 访问量:113
相同的查询 - 不同的 Azure SQL - 关闭逻辑读取 - 不同的性能
Same Query - Different Azure SQL - Close Logical Reads - Different Performance
问:
X Azure SQL DB 和 Y Azure SQL DB 在不同的 SQL 弹性池上运行。
尽管同一查询返回的行数不同,但它执行的逻辑读取数彼此接近,而在 X Azure SQL DB 中需要 904 毫秒,而在 Y Azure SQL DB 中需要 4207 毫秒。
您可以在下面找到详细的屏幕截图。
如何找到这种性能差异的根本原因?
提前非常感谢你。
-- 相同的查询时间和 IO 统计信息如下。
-- X AZURE SQL DB QUERY TIME/IO STATS
(300 rows affected)
Table 'A'. Scan count 1, logical reads 15709, physical reads 0
Table 'B'. Scan count 1, logical reads 1488, physical reads 0
Table 'C'. Scan count 1, logical reads 2, physical reads 0
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0
Table 'D'. Scan count 304, logical reads 645, physical reads 0
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0
Table 'E'. Scan count 1, logical reads 603, physical reads 0
Table 'F'. Scan count 0, logical reads 1204, physical reads 0
Table 'G'. Scan count 301, logical reads 1825, physical reads 0
Table 'H'. Scan count 0, logical reads 606, physical reads 0
Table 'I'. Scan count 303, logical reads 610, physical reads 0
Table 'J'. Scan count 1, logical reads 2, physical reads 0
Table 'K'. Scan count 0, logical reads 0, physical reads 0
SQL Server Execution Times:
CPU time = 906 ms, elapsed time = 904 ms.
-- Y AZURE SQL DB QUERY TIME/IO STATS
(2 rows affected)
Table 'A'. Scan count 1, logical reads 23625, physical reads 0
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0
Table 'E'. Scan count 1, logical reads 5, physical reads 0
Table 'F'. Scan count 0, logical reads 8, physical reads 0
Table 'G'. Scan count 2, logical reads 12, physical reads 0
Table 'H'. Scan count 0, logical reads 14, physical reads 0
Table 'D'. Scan count 7, logical reads 14, physical reads 0
Table 'I'. Scan count 7, logical reads 14, physical reads 0
Table 'B'. Scan count 5, logical reads 1464, physical reads 0
Table 'C'. Scan count 1, logical reads 2, physical reads 0
Table 'J'. Scan count 1, logical reads 2, physical reads 0
Table 'K'. Scan count 0, logical reads 0, physical reads 0
SQL Server Execution Times:
CPU time = 4203 ms, elapsed time = 4207 ms.
答:
1赞
Alberto Morillo
11/12/2023
#1
这可能与参数嗅探有关。使用某些特定参数,查询会生成不同的查询计划,有时这些查询计划具有不同的性能结果。以下查询将返回同一查询哈希的所有查询计划:
SELECT TOP (10)
ClearPlanHandleFromCacheCmd = N'DBCC FREEPROCCACHE (' + CONVERT(nvarchar(max), qs.plan_handle, 1) + N');'
, qplan.query_plan, qs.query_plan_hash, txt.text, qs.*
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qplan
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS txt
WHERE qs.query_hash = 0x150517EA5F3979B4
ORDER BY qs.execution_count DESC
请更改您共享的图像上显示的查询哈希数。在查询结果上,单击查询计划,您可能会看到它们具有不同的运算符和查询优化器做出的决策。
使用 OPTION(RECOMPILE) 是否能提供更好的查询性能?它可能有助于为不同的参数制定更好的计划。
评论
0赞
Serhat Celik
11/13/2023
嗨,@Alberto莫里洛。谢谢你的回答。我正在使用 OPTION(RECOMPILE) 运行具有文本值的相同查询,并且在 Y Azure SQL DB 上性能不佳。我没有参数嗅探问题,但正如你所说,X 和 Y Azure SQL DB 上的执行计划不同。我比较了所有索引,注意到 Y Azure SQL DB 中还有额外的 4 个索引,其中两个用于执行计划。请注意,我们在 Azure 中使用“自动创建索引”选项。因此,我的下一个行动计划是在 Y Azure SQL DB 中删除额外的索引,并在 X Azure SQL DB 中查看相同的执行计划。
1赞
Alberto Morillo
11/13/2023
大多数情况下,自动创建索引选项会创建重复的索引。我不建议自动调谐。也尝试更新统计信息。
0赞
Serhat Celik
11/13/2023
我将删除自动创建的索引并更新用于 SQL for Y Azure SQL DB 的表统计信息。然后我应该在 Y Azure SQL DB 中看到相同的执行计划,例如 X Azure SQL DB,对吧?我的意思是,对于两个数据库,QueryPlanHash 值也应该相同,例如 QueryHash 值。
1赞
Alberto Morillo
11/13/2023
添加变量并将文字分配给变量,然后在 querr 上使用变量,这可能会有所帮助。
评论