小编rno*_*nko的帖子

sp_executesql 和 VARCHAR 参数的性能问题

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

7
推荐指数
1
解决办法
5155
查看次数