select id, c.name as name
from a join b on a.id=b.id
join c on a.id=c.id
union
select id, d.name as name
from a join b on a.id=b.id
join d on a.id=d.id
コストがクエリの応答時間が13secsに30secsから改善したSQL組合が参加し、高速ですが、クエリプランは、より多くのI/O
select id,
case when c.name is not null or c.name <> '' then c.name
else d.name end as name
from a join b on a.id=b.id
left join c on a.id=c.id
left join d on a.id=d.id
where c.name is not null or d.name is not null
に最適化されたと言います。
- :
- SQL組合= 30secs
- SQLが= 13secs 、SQL組合は、低I/Oコストを持つクエリプランをチェックする時に
ただし、以下を参照してください参加左sql union =ステートメント1(行1)の推定I/Oコスト合計:6277566.
- sql left join =ステートメント1(行1)の推定I/Oコストの合計:10481124.
私はSybase 12.5 ASEを使用しており、クエリプランはDBArtisan 8.5からのものでした。クエリプラン全体をアップロードする必要があるかどうかを教えてください。私はまだクエリープランに精通しているわけではありませんが、ここではSQLの最適化を行いますが、通常は時間の改善に基づいています。また、結果セットが両方のクエリ(27949行)で同じであることを確認しました。また、テーブル名を隠して簡略化しました。
私の質問は、SQLの左結合は高速ですが、よりリソース集中型であることを意味しますか?もしそうなら、私はまだより速い選択肢を選択すべきですか?
クエリプランは多くの場合統計に基づいていますが、実際のクエリの実行は実際のデータに依存します。あなたのステータスは最新ですか? –
統計情報が最新であることはどういう意味ですか?今すぐクエリプランを実行しました。ここに投稿したI/O番号は最近のものです。 –
データベースは、テーブルに関する統計情報(レコード数など)を定期的に収集し、これらの統計情報を使用してクエリプランを決定します。あなたの統計が期限切れである場合、計画は最適ではないかもしれません。たとえば、新しいテーブルを作成して大量のデータを挿入し、統計情報が収集されない場合、DBはテーブルが空であるかのようにクエリを実行します。これは悪い計画につながる可能性があります。 – nolt2232