使用 CROSS APPLY 的慢查询
Slow query with CROSS APPLY
我有以下 SQL 代码,需要几秒钟才能执行:
SELECT instance.startdate
,instance.enddate
FROM (select mr.id
FROM meeting_recurrence AS mr
inner JOIN meeting_details md ON md.id = mr.meeting_template_id
WHERE host_user_id=17) AS p
CROSS APPLY GetRecurrenceMeetingInstances(p.id,'2018-11-09 11:00:00','2018-11-09 15:00:00') AS instance
WHERE 21015 IS NOT NULL
AND instance.meetingid <> 21015
上面例子中的内部select(select mr.id FROM meeting_recurrence...)
returns即刻,有两个id。
运行 GetRecurrenceMeetingInstances()
分别使用这两个 id,returns 立即为空结果。
为什么 运行 整个语句比单独 运行 花费的时间长?
执行计划图片:https://imgur.com/a/3Ydym
似乎 CROSS APPLY 调用 GetRecurrenceMeetingInstances() 的次数比我想象的要多得多。我通过首先将内部 select 保存在局部变量中解决了这个问题:
DECLARE @innerresult table(meetingid int)
INSERT INTO @innerresult(meetingid) (select mr.id FROM meeting_recurrence AS mr inner JOIN meeting_details md ON md.id = mr.meeting_template_id
WHERE host_user_id=17)
INSERT INTO @timeslots (startdate,enddate)
SELECT instance.startdate,instance.enddate
FROM (select meetingid FROM @innerresult) AS p
CROSS APPLY GetRecurrenceMeetingInstances(p.meetingid,'2018-11-09 11:00:00','2018-11-09 15:00:00') AS instance
我有以下 SQL 代码,需要几秒钟才能执行:
SELECT instance.startdate
,instance.enddate
FROM (select mr.id
FROM meeting_recurrence AS mr
inner JOIN meeting_details md ON md.id = mr.meeting_template_id
WHERE host_user_id=17) AS p
CROSS APPLY GetRecurrenceMeetingInstances(p.id,'2018-11-09 11:00:00','2018-11-09 15:00:00') AS instance
WHERE 21015 IS NOT NULL
AND instance.meetingid <> 21015
上面例子中的内部select(select mr.id FROM meeting_recurrence...)
returns即刻,有两个id。
运行 GetRecurrenceMeetingInstances()
分别使用这两个 id,returns 立即为空结果。
为什么 运行 整个语句比单独 运行 花费的时间长?
执行计划图片:https://imgur.com/a/3Ydym
似乎 CROSS APPLY 调用 GetRecurrenceMeetingInstances() 的次数比我想象的要多得多。我通过首先将内部 select 保存在局部变量中解决了这个问题:
DECLARE @innerresult table(meetingid int)
INSERT INTO @innerresult(meetingid) (select mr.id FROM meeting_recurrence AS mr inner JOIN meeting_details md ON md.id = mr.meeting_template_id
WHERE host_user_id=17)
INSERT INTO @timeslots (startdate,enddate)
SELECT instance.startdate,instance.enddate
FROM (select meetingid FROM @innerresult) AS p
CROSS APPLY GetRecurrenceMeetingInstances(p.meetingid,'2018-11-09 11:00:00','2018-11-09 15:00:00') AS instance