Sybase数据库查询耗时差异咨询:27分钟与1.4秒SQL对比
为什么两个Sybase查询耗时差异如此巨大?
咱们先把两个查询的代码贴出来,方便对比:
耗时27分钟的查询
select ATTACHMENT_ID from PES_ESB_ATTACHMENT where ATTACHMENT_ID in( select distinct ATTACHMENT_ID from PES_ESB_ATTACHMENT A left outer join PES_ESB_SHIFTDOCUMENTATION SD on A.MOMENT=SD.ATTACHMENT_MOMENT left outer join PES_ESB_SHIFTTASK T on A.MOMENT=T.ATTACHMENT_MOMENT where SD.ATTACHMENT_MOMENT is null and T.ATTACHMENT_MOMENT is null And ( 163697831 - A.MOMENT ) > 86400 )
耗时1.4秒的查询
select ATTACHMENT_ID from PES_ESB_ATTACHMENT where ATTACHMENT_ID in( select ATTACHMENT_ID from ( select distinct ATTACHMENT_ID, A.MOMENT from PES_ESB_ATTACHMENT A left outer join PES_ESB_SHIFTDOCUMENTATION SD on A.MOMENT=SD.ATTACHMENT_MOMENT left outer join PES_ESB_SHIFTTASK T on A.MOMENT=T.ATTACHMENT_MOMENT where SD.ATTACHMENT_MOMENT is null and T.ATTACHMENT_MOMENT is null )tbl1 ) and ( 163697831 - MOMENT ) > 86400
接下来咱们拆解核心差异和耗时差距的原因:
1. 过滤条件的位置是关键差异
- 第一个查询把时间过滤条件
(163697831 - A.MOMENT) > 86400放在了子查询的WHERE子句里。这意味着数据库得先对PES_ESB_ATTACHMENT和另外两张表做全量左连接,生成所有可能的关联结果,之后才会过滤掉不符合时间条件的数据,最后再去重得到ATTACHMENT_ID列表。哪怕99%的数据都不符合时间要求,数据库也得先处理完所有连接操作,中间会产生海量的临时数据,耗时自然拉满。 - 第二个查询把时间过滤移到了外层主查询,子查询只负责筛选出那些没有关联到
SD和T表的孤立附件记录,而且只保留ATTACHMENT_ID和MOMENT两个必要字段去重,生成的临时表tbl1数据量会小很多。外层主查询只需要在这个精简的候选集里匹配,再做时间过滤,相当于先把范围缩小到“可能符合要求的记录”,再做后续处理,效率自然高。
2. 子查询返回的数据集大小天差地别
- 第一个子查询返回的是所有“无SD/T关联”的
ATTACHMENT_ID,不管时间条件——如果你的PES_ESB_ATTACHMENT表数据量很大,这个列表可能会非常长。之后外层主查询要拿着这个大列表去主表做IN匹配,还要再检查时间条件,相当于做了一次超大范围的检索,慢是必然的。 - 第二个子查询先把符合“无SD/T关联”的记录精简到两个字段,去重后生成的临时表
tbl1数据量小很多。外层主查询基于这个小数据集去匹配主表,还能更好地利用ATTACHMENT_ID的索引快速定位,再结合MOMENT的过滤,整个过程处理的数据量骤减,速度自然飞起。
3. 数据库执行计划的效率差异
Sybase的查询优化器会根据查询结构生成不同的执行计划:
- 第一个查询的执行计划大概率是:全表扫描
PES_ESB_ATTACHMENT,左连接另外两张表,过滤时间条件,去重,最后外层再扫描主表匹配ATTACHMENT_ID(甚至可能重复检查时间条件),整个过程都是在处理全量数据,没有提前缩小范围。 - 第二个查询的执行计划会更高效:先做左连接筛选无关联记录,生成精简的临时表,然后外层主查询利用
ATTACHMENT_ID的索引快速定位目标记录,同时结合MOMENT的过滤,索引利用率高,处理步骤少,耗时自然短。
额外优化建议
如果想让查询速度再上一个台阶,可以考虑给这些字段建索引:
- 给
PES_ESB_ATTACHMENT的MOMENT字段建索引,加速时间过滤。 - 给
PES_ESB_SHIFTDOCUMENTATION和PES_ESB_SHIFTTASK的ATTACHMENT_MOMENT字段建索引,让左连接的速度更快。
内容的提问来源于stack exchange,提问作者Az_Ca
相关产品推荐
相关产品推荐

