[英]SQL Server query execution time is too slow
我不得不對在我的組織中大量使用的查詢進行調整。 幾乎,“主要查詢”並沒有在一夜之間完成輪班。 我添加了#DoubleShifts 和#CombinedShifts 部分。 他們找到了所有在一夜之間完成的班次。 我的更改有效,但現在查詢的執行時間從 10 秒開始超過 3 分鍾,這不起作用。
我只是在尋找有用的提示來優化這個查詢的速度。
謝謝你。
-- variables
DECLARE @dateFrom DATETIME
DECLARE @dateTo DATETIME
SET @dateFrom = '03/24/2019 00:00:00'
SET @dateTo = '03/24/2019 23:59:59'
IF OBJECT_ID ('tempdb..#DoubleShifts') IS NOT NULL
DROP TABLE #DoubleShifts
IF OBJECT_ID ('tempdb..#CombinedSchedules') IS NOT NULL
DROP TABLE #CombinedSchedules
IF OBJECT_ID ('tempdb..#callsvsAideDetailsReport') IS NOT NULL
DROP TABLE #callsvsAideDetailsReport
-- Double Shifts
SELECT
s1.ID AS ID1,s2.ID as ID2, s1.Provider1Code, s1.FromDateTime,
s2.ToDateTime, s1.ClientID, s1.EmpID, s1.Deleted
INTO #DoubleShifts
FROM EMR.dbo.ScheduleOfService s1,
EMR.dbo.ScheduleOfService s2, EMR.dbo.Patients p
WHERE
s2.FromDateTime >= @dateFrom
AND s2.ToDateTime <= @dateTo
AND s1.ToDateTime = s2.FromDateTime
AND s1.ClientID = p.ID
AND s1.SCProg = 'H'
AND s1.ClientID = s2.ClientID
AND s1.EmpID = s2.EmpID
AND s1.Deleted = 'False'
AND s2.Deleted = 'False'
AND p.IsHospice <> 1
AND s1.Provider1Code = s2.Provider1Code
-- Schedules
SELECT ID, Provider1Code, FromDateTime, ToDateTime, ClientID, EmpID,
Deleted
INTO #CombinedSchedules
FROM EMR..ScheduleOfService s
WHERE
FromDateTime BETWEEN @dateFrom AND @dateTo AND Deleted = 'False'
AND s.ID NOT IN ( SELECT ID1 FROM #DoubleShifts )
AND s.ID NOT IN ( SELECT ID2 FROM #DoubleShifts )
UNION ALL
SELECT ID1 as ID, Provider1Code, FromDateTime, ToDateTime, ClientID,
EmpID, Deleted
FROM #DoubleShifts
-- Main Query
SELECT
CASE WHEN p.Office <> '356' THEN ob.Office
ELSE CASE WHEN p.TeamPatient IN ('TEAM07', 'Team09', 'Team10') THEN
'(01) Person1'
ELSE CASE WHEN p.TeamPatient IN ('TEAM01', 'Team02', 'Team03' ) THEN
'(01) Person2'
ELSE p.Team
END END END Office,
p.CO_ORD,
eb.id1 'Aide ID1',
eb.[Last],
eb.[First],
s.Provider1Code,
p.id1 'Member ID1',
p.LastName,
p.FirstName,
s.FromDateTime,
(SELECT MAX(realizeddate) FROM EMR..compliance c
WHERE c.EmpID = eb.id
AND c.SubType = 'Spec1'
AND c.RealizedDate > '03/31/2018') AS 1Date,
(SELECT MAX(realizeddate) FROM EMR..compliance c
WHERE c.EmpID = eb.id
AND c.SubType = 'Spec2'
AND c.RealizedDate > '03/31/2018') AS 2Date,
(SELECT TOP 1 TAS_MasterId FROM db..EMR_Process
WHERE CAST(SavedDate AS DATE) BETWEEN CAST(s.FromDateTime AS DATE)
AND CAST(s.ToDateTime AS DATE)
AND s.ClientID = EMR_ID) AS [OAR_ID]
INTO #callsvsAideDetailsReport
FROM
#CombinedSchedules s,
EMR..Offices_Base ob,
EMR..Patients p,
EMR..Employees_Base eb,
EMR..Providers pro
WHERE
s.EmpID = eb.ID
AND s.ClientID = p.id
AND p.Office = ob.OfficeCode
AND p.IsHospice <> 1
AND p.BillTo1 = pro.Code
AND p.BillTo1 NOT IN ('Hospice', 'CHOSPITAL,'NON-BILLABLE')
AND pro.BillTypeID NOT IN (3, 10, 20, 25)
AND s.Deleted = 'false'
AND eb.Active = 1
AND NOT p.id IN ('261110') -- nonbillable
AND NOT p.office IN ('85','95','99','357','158','153','130','111','83')
--AND s.FromDateTime BETWEEN @dateFrom and @dateTo -- End one day later
then the desired date range
ORDER BY
ob.Office, p.CO_ORD, eb.[Last], eb.[first], s.Provider1Code, p.LastName,
p.FirstName
-- TEMP TABLE
SELECT *
FROM #callsvsAideDetailsReport
ORDER BY Office, CO_ORD, [Last], [First], Provider1Code, LastName,
FirstName
沒有錯誤消息。 運行時間需要 3 多分鍾才能完成。 我希望 output 至少在 20 秒以下。
盡管我不知道您的數據的外觀如何,但我有一些建議,但我使用了一些經驗法則,它們似乎在大多數情況下都對我有用。
http://www.gregreda.com/2013/06/03/join-vs-exists-vs-in/
和 s.ID 不在(SELECT ID1 來自#DoubleShifts)和 s.ID 不在(SELECT ID2 來自#DoubleShifts)
總的來說,我會盡可能避免使用“IN”語句,但這只是經驗法則,並非總是如此。
這就是我現在看到的。 祝你好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.