sql - 执行查询命令(动态sql)比普通查询运行速度更快

标签 sql sql-server database-performance

为什么使用 EXECUTE 命令的第二个查询的运行速度比不使用 EXECUTE 命令的第一个查询快约 4 倍?我该如何解决这个问题?

为什么在第二种情况下要创建额外的表(Workatable)?

变量:

DECLARE @count INT, @followerId BIGINT
SET @count=1024
SET @followerId=10

第一个查询(通常查询):

SELECT TOP (@count) Photo.* FROM Photo
WHERE  EXISTS (SELECT accountId FROM Follower
WHERE Follower.followerId=@followerId
AND Follower.accountId = Photo.accountId) 
AND Photo.closed='False'
ORDER BY Photo.createDate DESC

日志:

SQL Server 解析和编译时间:CPU 时间 = 0 毫秒,运行时间 = 7 毫秒。

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

表“照片”。扫描计数 952,逻辑读取 542435,物理读取 0,预读读取 0,lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。

表“关注者”。扫描计数 1、逻辑读取 7、物理读取 0、预读读取 0、lob 逻辑读取 0、lob 物理读取 0、lob 预读读取 0。

SQL Server 执行时间:CPU 时间 = 1466 毫秒,运行时间 = 9620 毫秒

执行计划:

First query execution plan

第二个查询(与 EXECUTE 相同的查询):

EXEC ('SELECT TOP (' +@count + ') Photo.* FROM Photo
WHERE  EXISTS ( SELECT  accountId FROM Follower
WHERE Follower.followerId=' +@followerId + '
AND Follower.accountId = Photo.accountId) 
AND Photo.closed=''False''
ORDER BY Photo.createDate DESC')

日志:

SQL Server 解析和编译时间:CPU 时间 = 0 毫秒,运行时间 = 0 毫秒。

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

SQL Server 执行时间:CPU 时间 = 0 毫秒,运行时间 = 0 毫秒。 SQL Server 解析和编译时间:CPU 时间 = 25 毫秒,运行时间 = 25 毫秒。

表“工作表”。扫描计数 0、逻辑读取 0、物理读取 0、预读读取 0、lob 逻辑读取 0、lob 物理读取 0、lob 预读读取 0。

表“照片”。扫描计数 952,逻辑读取 542707,物理读取 0,预读读取 0,lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。

表“关注者”。扫描计数 6、逻辑读取 9、物理读取 0、预读读取 0、lob 逻辑读取 0、lob 物理读取 0、lob 预读读取 0。

表“工作表”。扫描计数 0、逻辑读取 0、物理读取 0、预读读取 0、lob 逻辑读取 0、lob 物理读取 0、lob 预读读取 0。

SQL Server 执行时间:CPU 时间 = 1374 毫秒,运行时间 = 2140 毫秒。

SQL Server 执行时间:CPU 时间 = 1405 毫秒,运行时间 = 2165 毫秒

最佳答案

这可能是因为第二个查询(取决于第一个查询的上下文)更加可优化,因为变量变成了内联常量。比较:

DECLARE @count INT, @followerId BIGINT
SET @count=1024
SET @followerId=10

SELECT TOP (@count) Photo.* FROM Photo
WHERE  EXISTS (SELECT accountId FROM Follower
WHERE Follower.followerId=@followerId
AND Follower.accountId = Photo.accountId) 
AND Photo.closed='False'
ORDER BY Photo.createDate DESC

与:

SELECT TOP (1024) Photo.* FROM Photo
WHERE  EXISTS (SELECT accountId FROM Follower
WHERE Follower.followerId=10
AND Follower.accountId = Photo.accountId) 
AND Photo.closed='False'
ORDER BY Photo.createDate DESC

如果您的第一个查询是存储过程的一部分,变量是参数,并且在编译存储过程时使用不同的参数值优化特定查询,则尤其如此。

关于sql - 执行查询命令(动态sql)比普通查询运行速度更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18217068/

相关文章:

mysql - 优化Mysql查询

mysql - 使用额外字段简化多对多关系

sql-server - 设置容器事务 "Required"后 SSIS 包卡住

sql-server - 使用 OPENROWSET 通过 SQL Server 提供程序查询 Active Directory 时出错

mysql - 优化卡在 "Creating sort index"上的简单 MySQL GROUP BY 查询

SQL Server - INSERT 后返回值

sql-server - 更改 Excel 中的默认数据库连接

mysql - 想学习改进慢速mysql查询

sql - 如何估计 SQL Server 表中插入的单行的理论大小

mysql选择为重复列的第一行以外的所有内容返回空白