1、PostgreSQL PostgreSQL 全表全表 countcountIvorySQL 2025IvorySQL 2025生态大会生态大会暨暨PostgreSQLPostgreSQL高峰论坛高峰论坛SeqScan SeqScan 现状现状heapam heapam 改进改进全表计数目录CONTENTSIvorySQL 2025IvorySQL 2025生态大会生态大会暨暨PostgreSQLPostgreSQL高峰论坛高峰论坛SeqScan SeqScan 现状现状IvorySQL 2025IvorySQL 2025生态大会生态大会暨暨PostgreSQLPostgreSQL高峰论坛高峰论
2、坛1 千万记录,2.63 GB,34.5 万块postgres=#SELECT pg_relation_size(c1);pg_relation_size-2824830976(1 row)postgres=#SELECT pg_relation_size(c1)/8192;?column?-344828(1 row)IvorySQL 2025IvorySQL 2025生态大会生态大会暨暨PostgreSQLPostgreSQL高峰论坛高峰论坛postgres=#EXPLAIN ANALYZE SELECT*FROM c1;QUERY PLAN -Seq Scan on c1 (cost=0.
3、00.444828.00 rows=10000000 width=223)(actual time=0.027.2373.527 rows=10000000.00 loops=1)Planning:Buffers:shared hit=59 read=10 Planning Time:1.539 ms Execution Time:3249.865 mspostgres=#EXPLAIN ANALYZE SELECT count(*)FROM c1;QUERY PLAN -Aggregate (cost=469828.00.469828.01 rows=1 width=8)(actual ti
4、me=3974.700.3974.702 rows=1.00 loops=1)-Seq Scan on c1 (cost=0.00.444828.00 rows=10000000 width=0)(actual time=0.038.2315.244 rows=10000000.00 loops=1)Planning Time:0.157 ms Execution Time:3974.804 msIvorySQL 2025IvorySQL 2025生态大会生态大会暨暨PostgreSQLPostgreSQL高峰论坛高峰论坛火山模型每次都是计算一个 tuple(Tuple-at-a-time),
5、这样会造成多次调用 next,也就是造成大量的虚函数调用,这样会造成 CPU 的利用率不高。某商业产品顺序扫描快 2 倍以上IvorySQL 2025IvorySQL 2025生态大会生态大会暨暨PostgreSQLPostgreSQL高峰论坛高峰论坛heapam heapam 改进改进IvorySQL 2025IvorySQL 2025生态大会生态大会暨暨PostgreSQLPostgreSQL高峰论坛高峰论坛IvorySQL 2025IvorySQL 2025生态大会生态大会暨暨PostgreSQLPostgreSQL高峰论坛高峰论坛all_visible=PageIsAllVisible
6、(page)&!snapshot-takenDuringRecovery;for(lineoff=FirstOffsetNumber;lineoff rs_base.rs_rd,&loctup,buffer,snapshot);if(valid)scan-rs_vistuplesntup+=lineoff;IvorySQL 2025IvorySQL 2025生态大会生态大会暨暨PostgreSQLPostgreSQL高峰论坛高峰论坛CheckForSerializableConflictOut()略 if(!SerializationNeededForRead(relation,snapsho