使用动态查询时,我对查询计划感到困惑。
案例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 @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
对于此查询,我看到以下计划:
这一次显示了以下内容的执行计划“从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