1

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

案例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

我看到的执行计划是:

在此处输入图像描述

查询计划没有显示我在动态 sql 查询中编写的选择查询,即有关“从 HumanResources.Employee 中选择 EmployeeID,其中 EmployeeID 在 @FromID 和 @ToID 之间的位置”的计划缺失。现在考虑第二种情况:

案例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   

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

在此处输入图像描述

这次它显示了以下内容的执行计划“从 HumanResources.Employee 中选择 EmployeeID,其中 EmployeeID 在@FromID AND @ToID 之间”

我的问题是第一种情况发生了什么?为什么它没有显示任何有关选择查询(存在于动态查询中)计划的信息?以我在第一种情况下使用的方式使用动态查询是性能好还是坏?我正在考虑使用这种情况:

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
4

0 回答 0