编辑:DB1.dbo.TABLE_B
或STRING_ID ='id009'
导致'id008'
无效; STRING_ID
为varchar(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
查询也会立即得到结果(空结果)。
所以我的问题是为什么这个查询运行得如此之慢,变量设置为某个值?
答案 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?