1
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

に最適化

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

クエリの応答時間が30秒から13秒に改善されました。

  • SQLユニオン=30秒
  • sql left join=13秒

ただし、クエリプランを確認すると、SQLユニオンのI/Oコストは低くなります。以下を参照してください。

  • sql union =ステートメント1(1行目)の推定I / Oコストの合計:6277566。
  • sql left join =ステートメント1(1行目)の推定I / Oコストの合計:10481124。

私はSybase12.5ASEを使用しており、クエリプランはDBArtisan8.5からのものでした。クエリプラン全体をアップロードする必要がある場合はお知らせください。私はまだクエリプランに精通していませんが、あちこちでSQLの最適化を行っています。通常は、時間の改善に基づいています。また、結果セットが両方のクエリで同じであることを確認しました(27949行)。また、テーブル名をマスクして簡略化しました。

私の質問は、SQLの左結合はより高速ですが、より多くのリソースを消費することを意味しますか?もしそうなら、私はまだより速い選択肢を選ぶべきですか?

4

1 に答える 1

2

データベースは内部でキャッシュを実行するため、実行時間が常に最良の指標であるとは限りません。最初のクエリを実行し、その直後に2番目のクエリを実行すると、一部のデータがキャッシュされる可能性があるため、2番目のクエリは不当に有利になります。

すべてのデータベースチューニングの質問と同様に、実際には何も決まっていない。私は個人的にユニオンが好きです。それはもう少し読みやすいと思いますが、厳密にはパフォーマンスの観点から、(キャッシュの影響を最小限に抑えるために)長期間にわたって拡張テストを行い、それらがどのように機能するかを確認します。

これらのテーブルにはどのくらいのデータがありますか?4つのテーブルのid列にインデックスがありますか?そうでない場合は、SQLへの変更をさらに高速化してクエリを高速化します。

于 2012-02-08T03:53:22.960 に答える