为什么使用 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 毫秒。
执行计划:
第二个查询(与 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/