SQL性能:多个绑定或绑定到一个SQL变量以便重用?

时间:2013-05-29 21:32:26

标签: java sql sql-server performance spring

我的问题与确定如何从查询中获得最佳SQL性能有关。 目前,我正在使用Java Spring应用程序连接到SQL Server。在我的应用程序中,我执行连接多个表并将值绑定到查询的查询。

以下是其中一个查询的示例。我的问题需要注意的关键是所有绑定变量都是相同的值。

SELECT * FROM MY_DATA data
LEFT OUTER JOIN join1 ON data.id1=join1.id and join1.id2=?
LEFT OUTER JOIN join2 ON data.id2=join2.id and join2.id2=?
LEFT OUTER JOIN join3 ON data.id3=join3.id and join3.id2=?

我认为可能更好的是将该值绑定到SQL参数。因此修订后的查询可能如下所示:

DECLARE @bind_value varchar
SET @bind_value=?    
SELECT * FROM MY_DATA data
LEFT OUTER JOIN join1 ON data.id1=join1.id and join1.id2=@bind_value
LEFT OUTER JOIN join2 ON data.id2=join2.id and join2.id2=@bind_value
LEFT OUTER JOIN join3 ON data.id3=join3.id and join3.id2=@bind_value

这有助于或损害性能吗?或者是否有更好的方法来完全编写查询? 感谢您花时间看看这个!

1 个答案:

答案 0 :(得分:2)

例如,我有两个相同的查询:

--1

DECLARE @Date DATETIME
SELECT @Date = '20130101'

SELECT *
FROM dbo.Absence a
LEFT JOIN dbo.ScheduleDetail sd ON a.AbsenceCode = sd.AbsenceCode 
    AND sd.DateOut = @Date

--2

SELECT *
FROM dbo.Absence a
LEFT JOIN dbo.ScheduleDetail sd ON a.AbsenceCode = sd.AbsenceCode 
    AND sd.DateOut = '20130101'

SSMS中的执行计划:

SSMS

两个查询的比较:

dbForge Profiler

dbForge Query Profiler