SQL联合优化为左连接,速度更快,但查询计划表示会花费更多的I / O.

时间:2012-02-08 02:55:56

标签: sql query-optimization sybase-ase query-performance sql-execution-plan

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 union = 30secs
  • sql left join = 13secs

但是,在检查查询计划时,sql union的I / O开销较低,请参见下文:

  • sql union =语句1的总估计I / O成本(第1行):6277566。
  • sql left join =语句1的总估计I / O成本(第1行):10481124。

我正在使用Sybase 12.5 ASE,查询计划来自DBArtisan 8.5;如果我需要上传整个查询计划,请告诉我。我对查询计划还不是很熟悉,但我在这里和那里做了sql优化,通常我只是基于时间的改进。此外,我确实检查了两个查询(27949行)的结果集是否相同。我也掩盖并简化了表名。

我的问题是,这是否意味着sql left join更快但资源更密集?如果是这样,我还应该选择更快的替代方案吗?

1 个答案:

答案 0 :(得分:2)

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

与所有数据库调优问题一样,没有什么是真正的。我个人喜欢联盟,因为我认为它更具可读性,但从性能角度来看,我会在更长的时间内进行一些扩展测试(以最大限度地减少缓存的影响),看看它们的表现如何。

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

相关问题