圈子推荐
查看所有吧>>
活跃用户
    ​Where条件中使用Random函数的问题

    背景:pg11.5,navi_xn2为分区表,共500个分区,c1为分区键,值从1至1千万连续。

    问题:使用random()向上取整,查询无数据,或结果集超过一行

    检查执行计划,发现查询时每个分区都被扫描,对c1字段创建btree索引,也仍然使用全表扫描;

    调整enable_partition_pruning、enable_seqscan参数值也无法改变此执行计划

    修改查询句式,原先查询结果集有多行的问题不再出现

    但新句式查询计划依然如故


    总结:random放在filter中,一条查询语句中会多次调用,也不触发btree索引,不利于分区查询


    附测试脚本:

    --建表

    CREATE TABLE navi_xn2(c1 int not null, c2 text,c3 text)partition by range (c1);


    --创建分区

    do language plpgsql $$      

    declare      

      i int;    

    begin      

      for i in 0..499 loop      

        execute 'create table navi_xn2_'||i||' partition of navi_xn2 for values from ('||(i*20000)+1||') to ('||((i+1)*20000)+1||')';      

      end loop; 

    end;      

    $$; 


    --插入数据

    explain  (***yze,timing,costs) insert into navi_xn2 select n,'klk2_'||n,'klk3_'||n from generate_series(1,10000000) n;


    --执行查询

    select * from  navi_xn2 where c1=ceil(random()*10000000);

    explain  (***yze,timing,costs)  select * from  navi_xn2 where c1=ceil(random()*10000000);


    --创建索引

    create index on navi_xn2(c1);


    --执行查询

    select * from  navi_xn2 where c1=ceil(random()*10000000);

    explain  (***yze,timing,costs)  select * from  navi_xn2 where c1=ceil(random()*10000000);


    • 分享到:
    排序方式:回复时间 共有1条评论

    cursen 发表于 2020-03-27 09:13 1 楼

    学习了

    | 回复