替换sql server子查询以加快查询速度,而不是爬行
我想加快这个查询的速度,我尝试了各种连接,但我似乎不能不使用连接重复查询storm2=1和storm2=2替换sql server子查询以加快查询速度,而不是爬行,sql,sql-server,sql-server-2008,subquery,Sql,Sql Server,Sql Server 2008,Subquery,我想加快这个查询的速度,我尝试了各种连接,但我似乎不能不使用连接重复查询storm2=1和storm2=2 SELECT v1.id ,v1.StormOut ,v1.StormNo ,v1.StormYes ,v1.Equipment ,( SELECT TimeOn FROM [v_StormLog] WHERE vehicle = v1.Vehicle AND Storm2 =
SELECT v1.id
,v1.StormOut
,v1.StormNo
,v1.StormYes
,v1.Equipment
,(
SELECT TimeOn
FROM [v_StormLog]
WHERE vehicle = v1.Vehicle
AND Storm2 = 1
AND CurrentDate = v1.CurrentDate
) AS TimeOn
,v1.Vehicle
,v1.NAME
,v1.Equipment AS Equip
,(
SELECT ScheduleOrig
FROM [v_StormLog]
WHERE vehicle = v1.Vehicle
AND Storm2 = 1
AND CurrentDate = v1.CurrentDate
) AS ScheduleOrig
,(
SELECT ScheduleHTML
FROM [v_StormLog]
WHERE vehicle = v1.Vehicle
AND Storm2 = 1
AND CurrentDate = v1.CurrentDate
) AS ScheduleHTML
,(
SELECT Schedule
FROM [v_StormLog]
WHERE vehicle = v1.Vehicle
AND Storm2 = 1
AND CurrentDate = v1.CurrentDate
) AS Schedule
,(
SELECT TimeOff
FROM [v_StormLog]
WHERE vehicle = v1.Vehicle
AND Storm2 = 1
AND CurrentDate = v1.CurrentDate
) AS TimeOff
,v1.StormTimeOn
,v1.StormTimeOff
,v1.StormOut AS 'Out'
,v1.StormYes AS Yes
,v1.StormNo AS No
,(
SELECT comments
FROM [v_StormLog]
WHERE vehicle = v1.Vehicle
AND Storm2 = 1
AND CurrentDate = v1.CurrentDate
) AS comments
,v1.StormComments
,(
SELECT Comments
FROM [v_StormLog]
WHERE vehicle = v1.Vehicle
AND Storm2 = 1
AND CurrentDate = v1.CurrentDate
) AS CommentsHTML
,v1.Storm2
FROM [v_StormLog] v1
WHERE DATEADD(dd, DATEDIFF(dd, 0, v1.[CurrentDate]), 0) = @Date
AND v1.sgroup = 'North'
AND v1.Storm2 = @storm2
ORDER BY v1.ScheduleHTML
,v1.NAME
您需要将表本身连接起来。这将减少内部选择的数量。您仍然应该检查是否有适当的索引来查看执行计划
SELECT v1.*, v2.* -- update using the fields you need
FROM [v_StormLog] v1
JOIN [v_StormLog] v2
ON v2.vehicle = v1.Vehicle
AND v2.CurrentDate = v1.CurrentDate
WHERE
DATEADD(dd, DATEDIFF(dd, 0, v1.[CurrentDate]), 0) = @Date
AND v1.sgroup = 'North'
AND v1.Storm2 = @storm2
AND v2.Storm2 = 1
此外,您还有重复的字段
,v1.StormOut
,v1.StormNo
,v1.StormYes
及
如果我没记错的话,这种风格的子查询会被转换为外部联接,但您应该检查您的执行计划以确保。假设是这样的话:
SELECT v1.id
,v1.StormOut
,v1.StormNo
,v1.StormYes
,v1.Equipment
,v2.TimeOn AS TimeOn
,v1.Vehicle
,v1.NAME
,v1.Equipment AS Equip
,v2.ScheduleOrig AS ScheduleOrig
,v2.ScheduleHTML AS ScheduleHTML
,v2.Schedule AS Schedule
,v2.TimeOff AS TimeOff
,v1.StormTimeOn
,v1.StormTimeOff
,v1.StormOut AS 'Out'
,v1.StormYes AS Yes
,v1.StormNo AS No
,v2.comments AS comments
,v1.StormComments
,v2.Comments AS CommentsHTML
,v1.Storm2
FROM [v_StormLog] v1
LEFT JOIN [v_StormLog] v2
ON v2.vehicle = v1.Vehicle
AND v2.CurrentDate = v1.CurrentDate
AND v2.Storm2 = 1
WHERE v1.[CurrentDate] >= @Date
AND v1.[CurrentDate] < DATEADD(dd,@Date,1)
AND v1.sgroup = 'North'
AND v1.Storm2 = @storm2
ORDER BY v1.ScheduleHTML
,v1.NAME
这意味着CurrentDate在@Date当天或之后,在@Date之后一天的午夜之前。至少向我们展示执行计划
SELECT v1.id
,v1.StormOut
,v1.StormNo
,v1.StormYes
,v1.Equipment
,v2.TimeOn AS TimeOn
,v1.Vehicle
,v1.NAME
,v1.Equipment AS Equip
,v2.ScheduleOrig AS ScheduleOrig
,v2.ScheduleHTML AS ScheduleHTML
,v2.Schedule AS Schedule
,v2.TimeOff AS TimeOff
,v1.StormTimeOn
,v1.StormTimeOff
,v1.StormOut AS 'Out'
,v1.StormYes AS Yes
,v1.StormNo AS No
,v2.comments AS comments
,v1.StormComments
,v2.Comments AS CommentsHTML
,v1.Storm2
FROM [v_StormLog] v1
LEFT JOIN [v_StormLog] v2
ON v2.vehicle = v1.Vehicle
AND v2.CurrentDate = v1.CurrentDate
AND v2.Storm2 = 1
WHERE v1.[CurrentDate] >= @Date
AND v1.[CurrentDate] < DATEADD(dd,@Date,1)
AND v1.sgroup = 'North'
AND v1.Storm2 = @storm2
ORDER BY v1.ScheduleHTML
,v1.NAME
v1.[CurrentDate] >= @Date
AND v1.[CurrentDate] < DATEADD(dd,@Date,1)