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左连接= 13secs
然而,在检查查询计划时,sql union 的 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 left join 更快但更占用资源?如果是这样,我还应该选择更快的选择吗?