このクエリには 5 秒かかります。
With cte as
(
Select ROW_NUMBER() OVER (Order By dbo.GetLatestStatusDateTime(d.DocumentID)) peta_rn, d.DocumentID, d.IsReEfiled, d.IGroupID, d.ITypeID, d.RecordingDateTime,
d.IDate, d.InstrumentID, d.DocumentStatusID, u.Username, j.JDAbbreviation, inf.DocumentName, dbo.GetLatestStatusDateTime(d.DocumentID) as LatestStatusDatetime,
it.Abbreviation as ITypeAbbreviation, d.DocumentDate, ds.Abbreviation as DocumentStatusAbbreviation
From Documents d Left Join IGroupes ig On d.IGroupID = ig.IGroupID
Left Join ITypes it On d.ITypeID = it.ITypeID
Left Join Users u On u.UserID = d.UserID
Left Join DocumentStatuses ds On d.DocumentStatusID = ds.DocumentStatusID
Left Join InstrumentFiles inf On d.DocumentID = inf.DocumentID
Left Join Jurisdictions j on j.JurisdictionID = d.JurisdictionID Where 1 = 1 And d.JurisdictionID = 1
)
Select * from cte
Where 1 = 1
And peta_rn>92000 AND peta_rn<=92100
これは静的クエリですが、ユーザーの選択内容に基づくという意味で動的Order By
になります。Row_Number()
例えば。現在はそうですdbo.GetLatestStatusDateTime(d.DocumentID)
が、他のものでもかまいません。したがって、このクエリは if と then を使用してコードで生成されます。とにかく、私のクエリの間違いを見つけることができますか? わずか 100 レコードの場合、なぜ 5 秒かかるのでしょうか? SQL サーバーが数百万のレコードにスケールアップするのを見てきましたが、これはわずか 10 分の 1 であり、ボトルネックに悩まされています :(
編集:大幅な改善
クエリを次のように変更します。
With cte as
(
Select ROW_NUMBER() OVER (Order By d.DocumentID) peta_rn, d.DocumentID
From Documents d Left Join IGroupes ig On d.IGroupID = ig.IGroupID
Left Join ITypes it On d.ITypeID = it.ITypeID
Left Join Users u On u.UserID = d.UserID
Left Join DocumentStatuses ds On d.DocumentStatusID = ds.DocumentStatusID
Left Join InstrumentFiles inf On d.DocumentID = inf.DocumentID
Left Join Jurisdictions j on j.JurisdictionID = d.JurisdictionID Where 1 = 1 And d.JurisdictionID = 1
)
Select d.DocumentID, d.IsReEfiled, d.IGroupID, d.ITypeID, d.RecordingDateTime,
d.IDate, d.InstrumentID, d.DocumentStatusID, u.Username, j.JDAbbreviation, inf.DocumentName,
it.Abbreviation as ITypeAbbreviation, d.DocumentDate, ds.Abbreviation as DocumentStatusAbbreviation
From Documents d Left Join IGroupes ig On d.IGroupID = ig.IGroupID
Left Join ITypes it On d.ITypeID = it.ITypeID
Left Join Users u On u.UserID = d.UserID
Left Join DocumentStatuses ds On d.DocumentStatusID = ds.DocumentStatusID
Left Join InstrumentFiles inf On d.DocumentID = inf.DocumentID
Left Join Jurisdictions j on j.JurisdictionID = d.JurisdictionID
Inner Join cte On cte.DocumentID = d.DocumentID
And peta_rn>92000 AND peta_rn<=92100
クエリを 1 秒で実行します。しかし、100件のレコードに対して1秒は大きすぎると感じています。他の最適化をお願いします。