全部产品
Search
文档中心

云原生数据库 PolarDB:创建物化视图的跨机并行加速和批量写入

更新时间:Nov 26, 2024

本文介绍创建物化视图的跨机并行加速和批量写入功能。

前提条件

支持的PolarDB PostgreSQL版的版本如下:

  • PostgreSQL 11(内核小版本1.1.22及以上)

  • PostgreSQL 14(内核小版本14.6.6.0及以上)

说明

您可通过如下语句查看PolarDB PostgreSQL版的内核小版本的版本号:

  • PostgreSQL 14

    SELECT version();
  • PostgreSQL 11

    SHOW polar_version;

背景信息

物化视图 (Materialized View)是一个包含查询结果的数据库对象。与普通的视图不同,物化视图不仅保存视图的定义,还保存了创建物化视图时的数据副本。当物化视图的数据与视图定义中的数据不一致时,可以进行物化视图刷新 (Refresh)保持物化视图中的数据与视图定义一致。物化视图本质上是对视图定义中的查询做预计算,以便于在查询时复用。

  • CREATE TABLE AS语法:用于将一个查询所对应的数据构建为一张新的表,其表结构与查询的输出列完全相同。

  • SELECT INTO语法:用于建立一张新表,并将查询所对应的数据写入表中,而不是将查询到的数据返回给客户端。其表结构与查询的输出列完全相同。

原理介绍

对于物化视图的创建和刷新,以及CREATE TABLE AS/SELECT INTO语法,由于在数据库层面需要完成的工作步骤十分相似,因此PostgreSQL内核使用同一套代码逻辑来处理这几种语法。内核执行过程中主要包含以下两个步骤:

  1. 数据扫描:执行视图定义或CREATE TABLE AS/SELECT INTO语法中定义的查询,扫描符合查询条件的数据。

  2. 数据写入:将上一步中扫描到的数据写入到一个新的物化视图或表中。

PolarDB PostgreSQL版对上述两个步骤分别引入了ePQ并行扫描和批量数据写入的优化。当需要扫描或写入的数据量较大时,能够显著提升上述DDL语法的性能,缩短执行时间:

  • ePQ并行扫描:通过ePQ功能,利用多个计算节点的I/O带宽和计算资源并行执行视图定义中的查询,提升计算资源和带宽的利用率。

  • 批量写入:不再将扫描到的每一个元组依次写入表或物化视图,而是在内存中攒够一定数量的元组后,一次性批量写入表或物化视图中,减少记录WAL日志的开销,降低对页面的锁定频率。

使用说明

  • ePQ并行扫描

    通过设置polar_px_enable_create_table_as参数的值,开启或关闭ePQ并行扫描来加速CREATE TABLE AS语法中的查询过程。取值如下:

    • ON(默认):开启ePQ并行扫描来加速CREATE TABLE AS语法中的查询过程。

    • OFF:关闭ePQ并行扫描来加速CREATE TABLE AS语法中的查询过程。

    SET polar_px_enable_create_table_as = ON;
    说明
    • 该参数生效的前提为已开启ePQ功能(即polar_enable_px参数设置为ON)。

    • 由于ePQ功能的限制,该优化不支持CREATE TABLE AS ... WITH OIDS语法。对于该语法的处理流程为回退使用PostgreSQL内置优化器为DDL定义中的查询生成执行计划,并通过PostgreSQL的单机执行器完成查询。

  • 批量写入

    通过设置polar_enable_create_table_as_bulk_insert参数的值,开启或关闭批量写入来加速SELECT INTO语法中的写入过程。取值如下:

    • ON(默认):开启批量写入来加速SELECT INTO语法中的写入过程。

    • OFF:关闭批量写入来加速SELECT INTO语法中的写入过程。

    SET polar_enable_create_table_as_bulk_insert = ON;