PolarDB PostgreSQL版(兼容Oracle)集群支持创建/刷新物化视图的批量写入。
前提条件
支持的PolarDB PostgreSQL版(兼容Oracle)的版本如下:
Oracle 2.0(内核小版本2.0.14.15.0及以上)
您可通过如下语句查看PolarDB PostgreSQL版(兼容Oracle)的内核小版本的版本号:
SHOW polar_version;
背景信息
物化视图 (Materialized View)是一个包含查询结果的数据库对象。与普通的视图不同,物化视图不仅保存视图的定义,还保存了创建物化视图时的数据副本。当物化视图的数据与视图定义中的数据不一致时,可以进行物化视图刷新 (Refresh)保持物化视图中的数据与视图定义一致。物化视图本质上是对视图定义中的查询做预计算,以便于在查询时复用。
CREATE TABLE AS语法用于将一个查询所对应的数据构建为一张新的表,其表结构与查询的输出列完全相同。
SELECT INTO语法用于建立一张新表,并将查询所对应的数据写入表中,而不是将查询到的数据返回给客户端。其表结构与查询的输出列完全相同。
原理介绍
对于物化视图的创建(CREATE MATERIALIZED VIEW
)和刷新(REFRESH MATERIALIZED VIEW
),以及CREATE TABLE AS
/SELECT INTO
语法,由于在数据库层面需要完成的工作步骤十分相似,因此PostgreSQL内核使用同一套代码逻辑来处理这几种语法。内核执行过程中主要包含以下两个步骤:
数据扫描:执行视图定义或
CREATE TABLE AS
/SELECT INTO
语法中定义的查询,扫描符合查询条件的数据。数据写入:将上一步中扫描到的数据写入到一个新的物化视图或表中。
PolarDB PostgreSQL版(兼容Oracle)对数据写入步骤引入了批量写入的优化。当需要写入的数据量较大时,不再每次扫描一个元组就立刻写入表或物化视图中,而是在内存中攒够一定数量的元组后,一次性批量写入表或物化视图中,从而能够减少记录WAL日志和查询页面空闲空间映射的开销,降低对页面的锁定频率,显著缩短上述DDL的执行时间。
使用说明
将参数polar_enable_create_table_as_bulk_insert
设置为ON
即可启用该功能,默认值为ON
。
SET polar_enable_create_table_as_bulk_insert TO ON;