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

时间:2014-04-02 10:17:25

标签: 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 

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

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

SET @stringid='id008'

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

更重要的是:如果我将查询更改为不使用变量,只需传递值('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

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

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

1 个答案:

答案 0 :(得分:7)

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

有关MSSQL类型转换的一些有用信息也在How does SQL Server implicit type casting work in this case?