を登録しよう私は30分以上実行し、非常に単純なクエリに関するパフォーマンスの問題を持っている:集約は、パフォーマンスの問題(SQLサーバー)
SELECT P.pID
,COUNT(T1.ID) AS NB1
,COUNT(T2.ID) AS NB2
,COUNT(T3.ID) AS NB3
,COUNT(T4.ID) AS NB4
,COUNT(T5.ID) AS NB5
FROM MainTable P
LEFT OUTER JOIN Table1 T1 ON P.pID = T1.pID
LEFT OUTER JOIN Table2 T2 ON P.pID = T2.pID
LEFT OUTER JOIN Table3 T3 ON P.pID = T3.pID
LEFT OUTER JOIN Table4 T4 ON P.pID = T4.pID
LEFT OUTER JOIN Table5 T5 ON P.pID = T5.pID
GROUP BY P.pID
各クエリは、数ミリ秒で答えると同じように:
をex。 例:
SELECT P.pID
,COUNT(T1.ID) AS NB1
FROM MainTable P
LEFT OUTER JOIN Table1 T1 ON P.pID = T1.pID
GROUP BY P.pID
私は数ミリ秒で任意のアグリゲーション(COUNTまたは他の何か)クエリの実行を使用しない場合
。 SELECT P.pID 明らかにすべてのインデックスが設定されているなどFROM MainTable P
LEFT OUTER JOIN Table1 T1 ON P.pID = T1.pID
LEFT OUTER JOIN Table2 T2 ON P.pID = T2.pID
LEFT OUTER JOIN Table3 T3 ON P.pID = T3.pID
LEFT OUTER JOIN Table4 T4 ON P.pID = T4.pID
LEFT OUTER JOIN Table5 T5 ON P.pID = T5.pID
GROUP BY P.pID
... のみ「減速」要素は、このPIDはVARCHAR(50)ですが、私はそれを変更することはできませんし、私の意見ではということですここでの主な問題ではありません。
私は正常に動作するすべてのユニオンを含む回避策を使用しましたが、私は本当になぜこれが長すぎるのだろうと思っています、これを複数の左の結合に集約する方法は本当にレポートプロジェクトの共通のものです。
ご協力いただきありがとうございます。
[編集] thxからARION私は素敵な仕事をしています。
しかし、私の主な関心事は、複数の左結合でクエリを記述するSQLエンジンで何が問題なのかを理解することです。
表DESCRは次のようになります。
Table P (500 rows)
pID varchar(50) NOT NULL as primary key
p.* doesn't matter
Table Tn (between 2000 and 8000 rows)
Tn.ID int NOT NULL as primary key
pID varchar(50) NOT NULL as Foreign key
[EDIT]私の分析の私のエラーを指しsocial.msdn.microsoft.com上Erland Sommarskogに感謝します。 - その答えについての詳細
を覚えておいてください:
LEFT JOINのフォームを直積
私はいつも同じテーブルにREFEREとしてデカルト積がフィルタリングされた可能性があると仮定して間違っていました。
おかげ
いくつかのデータサンプルとテーブルの統計情報を参照する必要があります – cctan
元のクエリの問題は(唯一の)遅さではありません。また、 'Tx'テーブルに共通の' pID'を持つ行があると、間違った結果をもたらす可能性があります。 –