這是我的查詢:慢速查詢執行效率
With cte as (
Select
ROW_NUMBER() OVER (Order By d.OldInstrumentID) peta_rn,
d.DocumentID
From Documents d
Inner Join Users u on d.UserID = u.UserID
Where 1=1
And (d.JurisdictionID = 1 Or DocumentStatusID = 5 Or DocumentStatusID = 9)
And d.DocumentStatusID <> 3 And d.DocumentStatusID <> 8
And d.DocumentStatusID <> 7
AND ((CreatedByJurisdictionID = 1 Or DocumentStatusID = 5 Or DocumentStatusID = 9 Or CreatedByAccountID IN (Select AccountID From AccountsJurisdictions Where JurisdictionID = 1)))
And d.DocumentStatusID = 9
)
Select
d.DocumentID,
d.IsReEfiled,
d.IGroupID,
d.ITypeID,
d.RecordingDateTime,
d.CreatedByAccountID,
d.JurisdictionID,
Case
When d.OldInstrumentID IS NULL
THEN d.LastStatusChangedDateTime
Else d.RecordingDateTime
End as LastStatusChangedDateTime,
dbo.FnCanChangeDocumentStatus(d.DocumentStatusID,d.DocumentID) as CanChangeStatus,
d.IDate,
d.InstrumentID,
d.DocumentStatusID,
d.DocumentDate,
Upper(dbo.GetFlatDocumentName(d.DocumentID)) as FlatDocumentName
From Documents d
Inner Join cte on cte.DocumentID = d.DocumentID
Where 1=1
And peta_rn>=80000
AND peta_rn<=80050
Order by peta_rn
有幾乎10萬條記錄的數據庫,但此查詢需要約2秒鐘來執行去取僅有50條記錄。完全不能接受!我甚至在大多數使用連接的列上都有索引。
單個連接是在CTE的基礎子句中進行的,但這是必需的。我知道加入是殺手,但我需要加入。如果刪除這段代碼:
And (d.JurisdictionID = 1 Or DocumentStatusID = 5 Or DocumentStatusID = 9)
And d.DocumentStatusID <> 3
And d.DocumentStatusID <> 8
And d.DocumentStatusID <> 7
AND ((CreatedByJurisdictionID = 1 Or DocumentStatusID = 5 Or DocumentStatusID = 9 Or CreatedByAccountID IN (Select AccountID From AccountsJurisdictions Where JurisdictionID = 1)))
And d.DocumentStatusID = 9
它運行速度非常快。在SSMS中顯示0秒。任何方式來加快這個查詢?我需要這些條件,他們甚至不是那麼大。爲什麼條件會減慢查詢速度?我已經在CreatedByAccountID和其他列上有索引。真煩人!
編輯:
感謝您的答覆。一些更多細節:
你們許多人建議刪除多餘的條件。對不起,這段SQL是在代碼中動態生成的,我在SSMS和這裏粘貼了這個版本。從where子句中刪除這些條件並沒有幫助:
Where 1=1
And (d.JurisdictionID = 1 Or d.DocumentStatusID = 5 Or d.DocumentStatusID = 9)
And d.DocumentStatusID <> 3
And d.DocumentStatusID <> 8
And d.DocumentStatusID <> 7
AND ((CreatedByJurisdictionID = 1 Or DocumentStatusID = 5 Or DocumentStatusID = 9 Or CreatedByAccountID IN (Select AccountID From AccountsJurisdictions Where JurisdictionID = 1)))
And d.DocumentStatusID = 9
事實上,儘快我把where子句放慢了速度。所以,即使這一個很慢:
Where 1=1
And (d.JurisdictionID = 1 Or d.DocumentStatusID = 5 Or d.DocumentStatusID = 9)
一些更多的細節。 Row_Number()中的order by子句是決定因素。 OldInstrumentID
這是類型varchar(14)的速度很慢,需要2秒,而如果我通過d.DocumentID
命令的類型爲int,它在0秒內工作正常,即使我保留所有這些冗餘條件。
這是我的執行計劃:
更新:
我創建的索引像這樣在每個柱,它似乎運行超級快。 Woot Woot !!!
Create NonClustered Index IX_DocumentDate on Documents
(
DocumentDate
)
Include(
JurisdictionID,
JudgementTypeID,
IDate,
EfileDate,
UserID,
RecordingDateTime,
ApprovedBy,
ACEfileBankAccountID,
LastStatusChangedDateTime,
ACEfileCreditCardID,
EfiledByUserID,
ITypeID,
IGroupID,
InstrumentID,
OldInstrumentID,
[CreatedByJurisdictionID],
CreatedByAccountID,
[DocumentStatusID]
,[Remarks]
,[InternalNotes]
,[ParentDocumentID]
,[FilingNumber]
,[StampData]
,[Receipt]
,[ReceiptNo]
,[IsReEfiled]
,[ImportedFromInstrumentID]
)
你能發佈執行計劃嗎? – SWeko
它在我看來''where'有太多的條件,但是如果d.DocumentStatusID不等於9,它們都會失敗9.對不起,很難閱讀這樣的查詢(你只在某些地方使用表別名 - 某處它是'd.DocumentStatusID',在其他地方是'DocumentStatusID' – a1ex07
在國際論壇上發佈問題時,最好避免使用高度區域化的詞語,如「lac」或「lakh」。更常規的詞語是100,000。 –