使用动态查询时对查询计划的困惑

时间:2013-06-01 12:33:03

标签: sql-server sql-server-2008 sql-server-2008-r2 query-optimization sql-execution-plan

使用动态查询时,我对查询计划感到困惑。

案例1 :在临时表中插入动态查询的结果,然后选择临时表

当我运行以下查询时:

USE AdventureWorks;


DECLARE @Sql NVARCHAR(255)
DECLARE @FromID INT
DECLARE @ToID INT
SET @FromID = 10
SET @ToID = 100000


CREATE TABLE #Temp ( EmployeeID INT )

SELECT  @sql = 'Select EmployeeID from HumanResources.Employee Where 
EmployeeID between @FromID AND @ToID';

INSERT  INTO #Temp
        EXEC sp_executesql @sql, N'@FromID int,@ToID int', @FromID = @FromID,
            @ToID = @ToID

SELECT   EmployeeID
FROM    #Temp

DROP TABLE #Temp

我看到的执行计划是:

enter image description here

查询计划没有显示我在动态sql查询中写的我的选择查询,即关于这个东西的计划“从HumanResources.Employee选择EmployeeID     @FromID和@ToID“之间的EmployeeID丢失了。现在考虑第二种情况:

案例2:只执行动态查询(此处不使用临时表):

USE AdventureWorks;


DECLARE @Sql NVARCHAR(255)
DECLARE @FromID INT
DECLARE @ToID INT
SET @FromID = 10
SET @ToID = 100000


SELECT  @sql = 'Select EmployeeID from HumanResources.Employee Where EmployeeID between @FromID AND @ToID';


EXEC sp_executesql @sql, N'@FromID int,@ToID int', @FromID = @FromID,
    @ToID = @ToID   

对于此查询,我看到以下计划:

enter image description here

这一次显示了以下内容的执行计划“从HumanResources.Employee选择EmployeeID     @FromID和@ToID之间的EmployeeID“

我的问题是,第一种情况发生了什么?为什么它没有显示有关选择查询(存在于动态查询中)计划的任何内容?以我在第一种情况下使用的方式使用动态查询是性能明智还是好?我想用这个案子:

INSERT  INTO #Temp
        EXEC sp_executesql @sql, N'@FromID int,@ToID int', @FromID = @FromID,
            @ToID = @ToID 

因为在该查询之后我将在#Temp表上应用分页。

第一个执行计划中的以下部分也在哪里:

INSERT  INTO #Temp
        EXEC sp_executesql @sql, N'@FromID int,@ToID int', @FromID = @FromID,
            @ToID = @ToID

0 个答案:

没有答案