blog icon indicating copy to clipboard operation
blog copied to clipboard

复合查询SQL优化问题 - ( 范围检索 , IN检索加时间倒序)

Open cosionbob opened this issue 7 years ago • 2 comments
trafficstars

如德哥写的**PostgreSQL 一复合查询SQL优化例子 - (多个exists , 范围检索 , IN检索 , 模糊检索 组合)**这篇文章如果条件改成create table test(id int, c1 text, c2 date, c3 text);
select * from test
where
c1 in ('1','2','3')
and c2 between current_date-1 and current_date
oder by c2 desc limit 10; 这样的查询语句创建btree联合索引create index idx_c2_c1_test on test(c2,c1); 使用这个索引只会读取时间范围,而c1的过滤却要回表过滤,而Oracle是会在索引上全部过滤掉的,索引性能pg不如Oracle快。 使用gin索引好像速度也不是很快。 感谢能给出优化方法或思路,万分感谢。

cosionbob avatar Jul 02 '18 01:07 cosionbob

PG高版本支持了增量排序. 你可以再试一试.

digoal avatar Jun 13 '23 09:06 digoal

create table test(id int, c1 text, c2 date, c3 text, c4 float);

create index idx on test (c1,c2,c4 desc)

select * from test where c1 in ('1','2','3') and c2 between current_date-1 and current_date order by c4 desc limit 10;

c1, c2 都是离散值.
c1,c2在输入条件c1 in ('1','2','3') and c2 between current_date-1 and current_date中的所有可能值可以组成一个有限的排列组合.
idx索引的每个c1,c2组合下的所有index tuplec4 desc上是有序的, 所以使用idx索引, 按每个c1,c2组合跳跃查询, 并持续使用merge sort(c4), 即可最高效的返回数据.
每个c1,c2组合跳跃查询可以使用并行进行. 例如每个worker扫描一组c1,c2条件.

digoal avatar Jun 13 '23 09:06 digoal