表Segments具有按 DEPARTMENT (VARCHAR(10)) 和 BDPID(VARCHAR(10)) 的索引。
第一个查询的执行时间为 34 秒
SELECT TOP 10 c.BDPID, seg.FINAL_SEGMENT
FROM Customers c
LEFT JOIN Segments seg
ON seg.DEPARTMENT = 'DEP345'
AND seg.BDPID = c.BDPID
Run Code Online (Sandbox Code Playgroud)
当我将 DEPARTMENT 的参数移动到变量时,执行时间变为 1 秒。执行计划#2(快速)
DECLARE @dd VARCHAR(10)
SET @dd = 'DEP345'
SELECT TOP 10 c.BDPID, seg.FINAL_SEGMENT
FROM Customers c
LEFT JOIN Segments seg
ON seg.DEPARTMENT = @dd
AND seg.BDPID = c.BDPID
Run Code Online (Sandbox Code Playgroud)
但我必须使用动态sql。当我将查询移动到 sp_execitesql 时,执行时间再次变为 34 秒。执行计划#3(慢)
EXECUTE sp_executesql
'SELECT TOP 10 c.BDPID, seg.FINAL_SEGMENT
FROM Customers c …Run Code Online (Sandbox Code Playgroud) performance sql-server dynamic-sql sql-server-2008-r2 query-performance