使用动态查询时,我对查询计划感到困惑。
案例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