gpt4 book ai didi

sql - 使用数据库变量时查询性能低下

转载 作者:行者123 更新时间:2023-12-02 21:05:44 25 4
gpt4 key购买 nike

我使用下一个查询从数据库中提取前 100 行和 101 行,并获取以下耗时,这完全不同(第二个查询比第一个查询慢 8 左右):

SELECT TOP (100) *
FROM PhotoLike WHERE photoAccountId=@accountId AND accountId<>@accountId
ORDER BY createDate DESC
GO

SQL Server 执行时间: CPU 时间 = 187 毫秒,运行时间 = 202 毫秒。

SELECT TOP (101) *
FROM PhotoLike WHERE photoAccountId=@accountId AND accountId<>@accountId
ORDER BY createDate DESC
GO

SQL Server 执行时间: CPU 时间 = 266 毫秒,运行时间 = 1644 毫秒。

前两种情况的执行计划: Select top 100 and 101 with variable

但是,如果我删除 @accoundId 变量,我会得到以下结果,该结果大约等于此问题的第一个查询,并且速度比该问题的第一个查询快 2 倍以上。

SELECT TOP (100) *
FROM PhotoLike WHERE photoAccountId=10 AND accountId<>10
ORDER BY createDate DESC
GO

SQL Server 执行时间: CPU 时间 = 358 毫秒,运行时间 = 90 毫秒。

SELECT TOP (101) *
FROM PhotoLike WHERE photoAccountId=10 AND accountId<>10
ORDER BY createDate DESC
GO

SQL Server 执行时间: CPU 时间 = 452 毫秒,运行时间 = 93 毫秒。

后两种情况的执行计划: Select top 100 and 101 without variable

为什么会发生这种情况以及如何使用变量提高性能?

更新

添加了执行计划。

最佳答案

这里发生了一些事情。

当您使用变量时,SQL Server 根本不会嗅探这些值,除非您还添加了OPTION (RECOMPILE)

photoAccountId=@accountId 匹配的行数的估计值比实际情况小得多。 (注意第二个计划中索引查找的粗线以及使用并行计划的决定)。

此外,TOP 100/TOP 101cut off point使用仅需要空间对 100 行进行排序的算法的 TOP N 排序与执行完整排序之间的差异。不准确的行计数估计可能意味着没有为完整排序分配足够的内存,因此溢出到 tempdb

简单地将OPTION (RECOMPILE)添加到带有变量的查询中可能会有所改善,尽管看起来即使“快速”计划也在执行许多可以通过不同索引来避免的关键查找。

关于sql - 使用数据库变量时查询性能低下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18126262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com