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