pg_prewarm插件
功能描述
pg_prewarm插件允许管理员手动预加载指定的表或索引数据到数据库的共享缓冲区(shared buffers),这个过程也被称为“预热”。预热后,查询可直接从内存中访问数据,有效提高数据库重启后首次查询时的性能。
当前,Vastbase仅实现对pg_prewarm的语法兼容,无法保证预热后对查询性能存在提升效果。
插件提供了不同的预热方法,包括:
- 预读(prefetch)数据但不等待其加载完成;
- 读取(read)数据到操作系统的缓存;
- 直接加载(buffer)数据到Vastbase的共享缓冲区中。
同时,插件支持部分预热:可以指定预热操作的开始区块(first block)和结束区块(last block),这使得针对大表进行部分预热成为可能,有助于节省内存资源并关注于最关键的数据。
注意事项
仅Vastbase G100 V2.2 Build 10(Patch No.17)及以后版本支持此插件。
语法格式
创建插件:
CREATE EXTENSION pg_prewarm;
调用预加热函数:
pg_prewarm(regclass, mode text DEFAULT 'buffer'::text, fork text DEFAULT 'main'::text, first_block bigint DEFAULT NULL::bigint, last_block bigint DEFAULT NULL::bigint)
成功完成预热过程后,函数返回成功预热的表的区块数。
参数说明
regress
需要预热的表名或索引名,text类型。
mode
预热的三种模式,包括prefetch、read、buffer。
- prefetch:预读数据但不等待其加载完成;
- read:读取数据到操作系统的缓存;
- buffer:直接加载数据到Vastbase的共享缓冲区中。
fork
要读取的表的分叉名,text类型。
可选值包括:main、fsm、vm、init。通常使用默认值main,其余三种取值指代的体量极小,不建议使用。
- main表示存储数据元组的主分叉;
- fsm表示存储空闲空间映射;
- vm表示存储可见性映射;
- init表示存储初始化分叉。
first_block
用于限定预热区块范围,标志预热范围的开始区块。
默认值为NULL,表示预热范围从第一个区块开始,至last_block为止。
last_block
用于限定预热区块范围,标志预热范围的结束区块。
默认值为NULL,表示预热范围从first_block开始,至最后一个区块为止。
示例
当前,Vastbase仅实现对pg_prewarm的语法兼容,无法保证预热后对查询性能存在提升效果。示例仅展示pg_prewarm的常规使用流程。
1、创建测试表并插入测试数据。
CREATE TABLE my_table_1199662 (
col1 INT PRIMARY KEY,
col2 VARCHAR(50),
col3 DECIMAL(10, 2)
);
INSERT INTO my_table_1199662 (col1, col2, col3)
SELECT
generate_series(1,1000000) as col1,
md5(random()::text) as col2,
floor(random() * 1000000) as col3;
2、未进行预热,直接查询,记录查询时间。
explain(analyze,buffers) select * from my_table_1199662 where col3 > 50000;
返回结果如下:
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------
Seq Scan on my_table_1199662 (cost=0.00..24265.00 rows=950656 width=43) (actual time=0.058..416.696 rows=949825 loops=1)
Filter: (col3 > 50000::numeric)
Rows Removed by Filter: 50175
(Buffers: shared hit=11765 dirtied=11765)
Total runtime: 488.659 ms
(5 rows)
3、重启数据库。
vb_ctl restart
4、安装pg_prewarm插件。
CREATE EXTENSION pg_prewarm;
5、对测试表进行预热。
select pg_prewarm('my_table_1199662','buffer','main');
返回结果如下:
pg_prewarm
-----------
11765
(1 row)
6、再次执行与步骤2相同的查询。记录查询时间,通过对比表数据的首次查询耗时长短来判断预热是否生效。
explain(analyze,buffers) select * from my_table_1199662 where col3 > 50000;
返回结果如下:
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------
Seq Scan on my_table_1199662 (cost=0.00..24265.00 rows=950656 width=43) (actual time=0.030..307.217 rows=949825 loops=1)
Filter: (col3 > 50000::numeric)
Rows Removed by Filter: 50175
(Buffers: shared hit=11765)
Total runtime: 381.425 ms
(5 rows)
7、清理环境。
DROP TABLE my_table_1199662;
DROP EXTENSION pg_prewarm;