1

このクエリの実行に数分かかる理由を誰か教えてください。

Select  
   d.DocumentID, d.IsReEfiled, d.IGroupID, d.ITypeID, d.RecordingDateTime, 
   d.IDate, d.InstrumentID, d.DocumentStatusID,ig.Abbreviation as IGroupAbbreviation, 
   u.Username, j.JDAbbreviation, inf.DocumentName,
   it.Abbreviation as ITypeAbbreviation, d.DocumentDate, 
   ds.Abbreviation as DocumentStatusAbbreviation 
From Documents d 
Inner 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                         
Inner Join Jurisdictions j on j.JurisdictionID = d.JurisdictionID 
Where 
    d.DocumentID IN
      (SELECT DocumentID 
       FROM (SELECT ROW_NUMBER() OVER (Order By DocumentID desc) peta_rn, peta_query.* 
             From (Select d.DocumentID
                   From Documents d) as peta_query) peta_paged 
       WHERE peta_rn > 92000 AND peta_rn <= 92100)

サブクエリ:

SELECT DocumentID 
FROM (SELECT 
         ROW_NUMBER() OVER (Order By DocumentID desc) peta_rn, peta_query.* 
      FROM
         (SELECT d.DocumentID
          FROM Documents d) as peta_query) peta_paged 
WHERE peta_rn > 92000 AND peta_rn <= 92100

それ自体は0秒かかりますが、クエリ全体には数分かかり、結合もそれほど多くありません. 私の意見では、これらすべての外部キーにはインデックスがあるため、それほど多くの問題を引き起こさないはずの6〜7の結合はほとんどありません。誰が問題の可能性があるかを提案できますか?

編集:

これは素晴らしいです。0 秒で実行される次のクエリを参照してください。

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 
                Inner 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                         
                Inner Join Jurisdictions j on j.JurisdictionID = d.JurisdictionID 
                    Where d.DocumentID IN
                        (
                            SELECT DocumentID FROM (SELECT 
                                ROW_NUMBER() OVER (Order By DocumentID desc) peta_rn, peta_query.* From 
                                (
                                        Select   d.DocumentID
                                                From Documents d 

                                ) as peta_query) peta_paged WHERE peta_rn>92000 AND peta_rn<=92100
                        )

ご覧のとおりig.Abbreviation IGroupAbbreviation,、クエリから削除するだけです。私が置くとすぐに、ig.Abbreviation IGroupAbbreviation,数分かかり始めます。これはばかげたことの高さではありませんか?これは何が原因だと思いますか?

編集2:

もう少し奇妙です。に変更Inner Join IGroupes ig するとLeft Join IGroupes ig、クエリは 0 秒で実行されます。内部結合に数分かかる理由を教えてください。これは私の問題ですか?これはSQLサーバーのバグですか? あとは頭を壁にぶつけるだけです。4時間以上無駄にしました。

4

3 に答える 3

1

このバージョンのクエリを試してください。

SELECT  DocumentID 
INTO    #temp
FROM    (
        SELECT  ROW_NUMBER() OVER (Order By DocumentID desc) peta_rn
                , d2.DocumentID
        FROM    Documents d2 
        ) peta_paged
WHERE   peta_rn > 92000 AND peta_rn <= 92100

Select  d.DocumentID, d.IsReEfiled, d.IGroupID, d.ITypeID, d.RecordingDateTime, 
        d.IDate, d.InstrumentID, d.DocumentStatusID,ig.Abbreviation as IGroupAbbreviation, u.Username, j.JDAbbreviation, inf.DocumentName,
        it.Abbreviation as ITypeAbbreviation, d.DocumentDate, ds.Abbreviation as DocumentStatusAbbreviation 
            From Documents d 
                Inner 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                         
                Inner Join Jurisdictions j on j.JurisdictionID = d.JurisdictionID 
                INNER JOIN #temp ON d.DocumentID = #temp.DocumentID
于 2012-10-17T06:17:54.423 に答える
0

これには1つの問題しかありません。users テーブルにあるレコードの数に応じて、この行はすべてのユーザーを返します。 Left Join Users u On u.UserID = d.UserID

于 2012-10-17T06:26:02.770 に答える
0

これは、SQL Server クエリ オプティマイザーが、タイムアウトになる前にすべての可能な選択肢を評価できず、最終的に不適切な実行プランを選択してしまうケースのようです。クエリを再実行してオプティマイザーに別のショットを与えるか、適切な計画を立てることができるように十分に変更することで、クエリがすぐに実行されるようになりました。

あなたの最善の策は、実行計画を見て、すべての時間が費やされている場所を確認し、クエリヒントを使用してクエリを変更するか、適切なインデックスを追加するなど、データベースを変更することです。

この投稿には、SQL Server の仕組みに関する有益な情報が含まれています。

于 2012-10-17T08:21:10.977 に答える