2

为什么使用命令的第二个查询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 毫秒

4

1 回答 1

4

This could be because the second query (depending on the context of the first query) is more optimizable, since the variables become inline constants. Compare:

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

With:

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

This is especially true if your first query was part of a stored proc, the variables were arguments and that particular query was optimized with different parameter values when the stored proc was compiled.

于 2013-08-13T19:03:54.167 回答