记一次对postgresql中的null排序索引的优化

本文深入解析了一条执行缓慢的SQL语句,通过分析执行计划,发现全表扫描问题,并逐步优化索引,最终解决了性能瓶颈。关键在于理解和调整ORDER BY与NULLS LAST的索引一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

待优化的SQL

SELECT
 jcaj.c_id,
 jcaj.c_ajbh,
 jcaj.c_ajmc,
 jcaj.c_jyaq,
 jcaj.c_ajlb,
 jcaj.c_zbdw,
 jcaj.c_zbdwmc,
 jcaj.d_lasj,
 jcaj.c_zbr,
 jcaj.c_zbrmc,
 jcaj.c_ajzt
FROM  db_yw.t_aj jcaj
LEFT JOIN db_yw.t_dqdw_mapping mapp ON mapp.c_corp_id = jcaj.c_zbdw
WHERE mapp.c_district_code = '6'
ORDER BY jcaj.d_lasj desc nulls last ,jcaj.c_id desc  
LIMIT 10 OFFSET 0

数据量大小db_yw.t_aj为60万,t_dqdw_mapping为一千多,这条SQL为什么执行的时间非常慢。

查看执行计划:发现没有任何索引走的是全表扫描,所以第一想法是加索引。

第一次加索引 create index index_a on db_yw.t_aj(d_lasj,c_id),发现索引不走。通过查阅资料发现,

asc|desc 和nulls last | nulls first的默认关系,所以第一个索引等同于

create index index_a on db_yw.t_aj(d_lasj asc nulls last,c_id asc nulls last),

此索引的顺序与我们SQL语句中的order by 的顺序不一致,所以导致索引不走。

改进后:

create index index_a on db_yw.t_aj(d_lasj desc nulls last,c_id desc);

总结:当order by和nulls first|last一同出现时,建立的索引要和SQL语句中的条件保持一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值