簡體   English   中英

SQL 服務器查詢執行時間太慢

[英]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 秒以下。

盡管我不知道您的數據的外觀如何,但我有一些建議,但我使用了一些經驗法則,它們似乎在大多數情況下都對我有用。

  • 你有幾個 NOT IN,我會將它們改造成半連接方法(EXISTS)。 這將允許您只需要進行部分匹配檢查而不是完整比較。

http://www.gregreda.com/2013/06/03/join-vs-exists-vs-in/

和 s.ID 不在(SELECT ID1 來自#DoubleShifts)和 s.ID 不在(SELECT ID2 來自#DoubleShifts)

總的來說,我會盡可能避免使用“IN”語句,但這只是經驗法則,並非總是如此。

  • 您在最終插入臨時表的末尾附近還有一個 order by 語句。 我要么刪除插入到臨時表中,要么刪除順序,然后返回排序后的臨時表。 您不需要在將數據插入臨時表之前對其進行排序,因為插入順序對您來說並不重要。

這就是我現在看到的。 祝你好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM