更新时间:2024-11-12 GMT+08:00
分享

指定是否使用Partition-wise Scan优化的hint

在SMP场景下,对于分区表的并发扫描方式分为两种:

  • 每个线程会遍历所有分区,但是只读取分区的一部分数据,线程之间读取的数据没有交集,所有线程读取的数据合并后是分区的全部数据。
  • 每个线程只和一部分分区绑定,线程之间绑定的分区没有交集,线程读取绑定分区的所有数据,该方式称为Partition-wise Scan。

在一些场景下,Partition-wise Scan能够更均匀地读取数据,具有更高的并发读取性能。

开启Partition-wise Scan的方式有如下两种:

  • 设置GUC参数force_smp_partitionwise_scan。
  • 设置partitionwisescan的hint。

功能描述

在SMP场景下,指定语句是否对分区表使用Partition-wise Scan。

语法格式

[no] partitionwisescan[(@tablename)]

参数说明

  • no

    不使用Partition-wise Scan查询改写。

  • @tablename

    进行Partition-wise Scan的分区表,不可省略。

  • partitionwisescan

    使用Partition-wise Scan对分区表进行并发扫描。

    partitionwisescan只支持SMP场景下的分区表的扫描,支持SeqScan、IndexScan、IndexonlyScan、ImcvScan。

示例

--创建分区表。
gaussdb=# CREATE TABLE HASH_PART
(
    a INTEGER,
    b INTEGER,
    c INTEGER
) PARTITION BY HASH(a) (
    PARTITION p1,
    PARTITION p2,
    PARTITION p3
);
CREATE TABLE

--开启SMP和Partition-wise Join。
gaussdb=# SET query_dop = 5;
SET
gaussdb=# SET enable_smp_partitionwise = on;
SET
gaussdb=# SET enable_force_smp = on;
SET

--使用partitionwisescan的hint。
gaussdb=# EXPLAIN (COSTS OFF) SELECT /*+ partitionwisescan(HASH_PART)*/ count(*) FROM HASH_PART;
                        QUERY PLAN                         
-----------------------------------------------------------
 Aggregate
   ->  Streaming(type: LOCAL GATHER dop: 1/5)
         ->  Aggregate
               ->  Partition Iterator
                     Iterations: 3
                     ->  Partitioned Seq Scan on hash_part
                           Selected Partitions:  1..3
(7 rows)

-- 删除分区表
gaussdb=# DROP TABLE HASH_PART;

相关文档