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左连接= 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 更快但更占用资源?如果是这样,我还应该选择更快的选择吗?

4

1 回答 1

2

数据库将在内部进行一些缓存,因此执行时间并不总是最好的指标。如果您运行第一个查询然后在它之后运行第二个查询,那么第二个查询将处于不公平的优势,因为某些数据可能会被缓存。

像所有数据库调优问题一样,没有什么是一成不变的。我个人喜欢联合,因为我认为它更具可读性,但严格从性能角度来看,我会在更长的时间内进行一些扩展测试(以尽量减少缓存的影响)并查看它们的性能。

这些表中有多少数据?您对四个表中的 id 列有索引吗?如果没有,那将加快您对 sql 的任何更改的查询。

于 2012-02-08T03:53:22.960 回答