[英]Speeding up this SQL Query?
此查詢當前大約需要30秒才能運行。
我想幫助加快速度,但不知道如何去做。 任何幫助都會很棒。 請注意:我目前無法對數據庫或其設計進行任何實際更改。
SELECT top 1 v.[address], v.[address2], v.[city], v.[state_prov_id],v.[postcode],
v.[first_name], v.[last_name], v.[client_specific_id], v.[name], v.phone,
v.Location_id, v.Contact_id, v.Event_ID, v.client_id, v.program_id,
v.source_code_id, v.file_source_code_id, v.URL, v.ScriptFrame,
v.calldatemark, v.NumCallMark + 1 as Numcallmark,
v.NumCallMarkDay + 1 as NumCallMarkDay,
v.NumCallMarkWeek + 1 as NumCallMarkWeek, v.autoaudio,
v.autohumantext, v.automachinetext
FROM vw_locationcontactdialer v
WHERE v.program_id = 10001565
and v.numcallmark < 3
and (dateadd(hh,72,v.calldatemark) < getdate()
or v.calldatemark = '01/01/1900' or v.calldatemark is null)
and source_code_id = 10015311
and v.contact_id not in ( select contact_ID from CALL_HISTORY with (NOLOCK)
where program_ID = 10001565
and result_id not in ('8','U','N')
group by contact_ID)
order by calldatemark
我得到了一個嘗試和加入的小費,但我不確定如何實現這個目標。 我不確定如何進行JOIN並確保所有不在子查詢中的contact_id都已完成。
我想出了這個:
SELECT TOP 1 v.[address], v.[address2], v.[city], v.[state_prov_id],v.[postcode],
v.[first_name], v.[last_name], v.[client_specific_id], v.[name],
v.phone, v.Location_id, v.Contact_id, v.Event_ID, v.client_id,
v.program_id, v.source_code_id, v.file_source_code_id, v.URL,
v.ScriptFrame, v.calldatemark,
v.NumCallMark + 1 as Numcallmark,
v.NumCallMarkDay + 1 as NumCallMarkDay,
v.NumCallMarkWeek + 1 as NumCallMarkWeek, v.autoaudio,
v.autohumantext, v.automachinetext
from vw_locationcontactdialer v
JOIN CALL_HISTORY ch on v.Contact_ID = ch.contact_ID
where v.Program_ID = 10001565
and v.NumCallMark < 3
and (DATEADD(hh,72,v.calldatemark) < GETDATE()
or v.CallDateMark = '01/01/1900' or v.CallDateMark is null)
and v.Source_Code_ID = 10015311
and ch.result_ID not in ('8','U','N')
group by ch.contact_id
order by v.CallDateMark
但是因為這個錯誤而無法正常工作,我不完全理解:Msg 8120,Level 16,State 1,Line 1 Column'vw_locationcontactdialer.address'在選擇列表中無效,因為它不包含在聚合函數中或GROUP BY子句。
任何幫助都是極好的。
我可以給你一個小提示:子句“(DATEADD(hh,72,v.calldatemark)<GETDATE()”阻止calldatemark字段上的索引被使用。它可能有助於用“v.calldatemark <替換它” DATEADD(HH,-72,GETDATE())”。
另外,忽略“分組依據”。 您只對某些contact_Ids感興趣。 如果subselect的結果只包含幾個條目,則在將其轉換為JOIN時將無法獲得任何性能。
正如評論已經說過的那樣,您應該檢查並最終發布底層視圖的模式,因為它可能是性能不佳的根本原因。
您可以將其轉換為連接,如下所示:
from vw_locationcontactdialer v left outer join
(select contact_ID
from CALL_HISTORY with (NOLOCK)
where program_ID = 10001565 and
result_id not in ('8','U','N')
group by contact_ID
) ch
on v.contact_id = vh.contact_id
where . . .
ch.contact_id is null
order by calldatemark
(道歉,如果我嘗試發布整個查詢,我會收到錯誤。)
但是,為了使這項工作更好,您可能希望返回原始查詢並使用相關子查詢:
where
not exists (select 1
from CALL_HISTORY ch with (NOLOCK)
where program_ID = 10001565 and
result_id not in ('8','U','N') and
ch.contact_id = v.contact_id
)
如果你有一個關於CALL_HISTORY.Contact_Id的索引,那么它會有所幫助。 更好的是,Call_History上的多部分索引包含contact_id,result_id和program_id。
我確實想辦法讓這個工作正常,這是我的代碼:
Select top 1 v.[address], v.[address2], v.[city], v.[state_prov_id], v.[postcode],
v.[first_name], v.[last_name], v.[client_specific_id], v.[name],
v.phone, v.Location_id, v.Contact_id, v.Event_ID, v.client_id, v.program_id,
v.source_code_id, v.file_source_code_id, v.URL, v.ScriptFrame, v.calldatemark,
v.NumCallMark + 1 as Numcallmark,
v.NumCallMarkDay + 1 as NumCallMarkDay,
v.NumCallMarkWeek + 1 as NumCallMarkWeek, v.autoaudio,
v.autohumantext, v.automachinetext
from vw_locationcontactdialer v
left join (select contact_id from CALL_HISTORY
where program_ID = 10001565 and result_ID not in ('8','U','N')
group by contact_ID) h on v.Contact_ID = h.contact_ID
where v.program_id = 10001565
and v.numcallmark < 3 and (dateadd(hh,72,v.calldatemark) < getdate()
or v.calldatemark = '01/01/1900' or v.calldatemark is null)
and source_code_id = 10015311
and h.contact_ID is null order by calldatemark
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.