オプティマイザは、この権利を取得する必要がありますが、この1に対する元のクエリのパフォーマンスを比較することもできます。
select distinct
c.company_name,
o.outlet_name,
o.outlet_fce_id,
ug.usergroup_name
from company c
inner join (select distinct company_id, outlet_id, username from purchase_invoice) i on c.company_id=i.company_id
inner join outlet o
on i.outlet_id = o.outlet_id
and i.company_id = o.company_id
inner join ot_user u on b.username = e.username
inner join user_group ug on u.usergroup_id = d.usergroup_id
purschasesテーブル上の異なるが、いくつかの作業を排除することができますしかし、私はそれがたくさんあるなら、私は倍増します。
purchase_invoice (username, outlet_id, company_id)
のインデックスは何ですか?これはテーブル上にcovering indexになるため、速度を上げることができます。結合は索引を見るだけで済み、実際の表を読み飛ばすことができます。それはテーブルが広い場合に役立ちます。
インデックスの列の順序にも注意してください。ct_user
にも多くの行があり、Username
にクラスタード・インデックスがあることを推測しています。こうすると、インデックスとct_user
の両方がユーザー名でソートされ、2つの大きなテーブルを結合するためにmerge joinが許可されます。
また、user_groupの場合はc fr companyやugのようなテーブルでは、結合構文と意味のある別名を使用してください。それはデータベースには関係ありませんが、人間があなたのコードを読もうとしているときには致命的に役立ちます。 はまた、allcapsはYOUR SCREAMING ALL TIMEのように見えますが、多分それは私が自分の質問に答えてみましょうちょうど私
GJ
なぜネストされたクエリは通常、ジョインよりも優れているか悪いのですか?それは本当に多くのものに依存します。実際の問題は、あまりにも多くのデータを選択してから、「別個」を使用して重複を削除しているという事実に関連している可能性があります。なぜあなたは「別れた」必要がありますか?外部キーなどの関連するすべてのインデックスを表示できますか? –
私はこれについても好奇心が強いです。私の経験上、インデックスが正しく設定されていると仮定すると、オプティマイザは何よりも結合を最大限に活用しようとしています。 – moleboy
実行が遅い場合は、実行計画をチェックし、SQLプロファイラを実行します(ただし、プロダクションボックスに対しては使用しないでください:)。いったん把握したら、列の索引をDBAに追加することをお勧めします。しかし、ネストされたクエリのパフォーマンスに対するジョインに関する他のコメントに同意します。 – Eugene