使用变量时,SQL查询以特定值运行慢10倍

Bol*_*olu 1 sql sql-server performance sql-server-2008

编辑:没有结果DB1.dbo.TABLE_BSTRING_ID ='id009''id008'; STRING_IDvarchar(100)和不是唯一的.

EDIT2:两个查询的执行计划相同.

我在SQL Server 2008服务器上运行以下查询:

DECLARE @stringid nvarchar(10)
SET @stringid='id009'
SELECT * FROM DB1.dbo.TABLE_A
         INNER JOIN DB1.dbo.TABLE_B
         ON DB1.dbo.TABLE_A.ID=DB1.dbo.TABLE_B.ID
WHERE DB1.dbo.TABLE_B.STRING_ID=@stringid
ORDER BY DB1.dbo.TABLE_B.UID desc, DB1.dbo.TABLE_A.TIME desc 
Run Code Online (Sandbox Code Playgroud)

此查询将花费10秒钟来获取结果(为空).

如果我更改此查询的第二行以使用任何其他值,例如

SET @stringid='id008'
Run Code Online (Sandbox Code Playgroud)

查询将立即获得结果(空结果).

更重要的是:如果我将查询更改为不使用变量,而只是传递值('id009'),如下所示:

SELECT * FROM DB1.dbo.TABLE_A
         INNER JOIN DB1.dbo.TABLE_B
         ON DB1.dbo.TABLE_A.ID=DB1.dbo.TABLE_B.ID
WHERE DB1.dbo.TABLE_B.STRING_ID='id009'
ORDER BY DB1.dbo.TABLE_B.UID desc, DB1.dbo.TABLE_A.TIME desc
Run Code Online (Sandbox Code Playgroud)

查询也会立即得到结果(空结果).

所以我的问题是为什么这个查询运行得如此之慢,变量设置为某个值?

gts*_*gts 7

您将var声明为nvarchar(10).确保TABLE_B.STRING_ID的数据类型相同,或者@stringid var与TABLE_B.STRING_ID具有相同的数据类型.如果类型不同并且发生隐式转换,即使具有不同的值,也可以解释延迟.

关于MSSQL类型转换的一些有用信息也在SQL Server隐式类型转换如何在这种情况下工作?