文档中心MogDBMogDB StackUqbar
v5.0

文档:v5.0

支持的版本:

其他版本:

并行索引扫描

可获得性

本特性自MogDB 3.1.0版本开始引入。5.0版本的并行索引扫描支持了分区表,提升了部分场景的性能。

特性简介

并行索引扫描是一种可大幅提升数据访问速度的数据库查询特性。通过将查询任务分解为多个并行的子任务,同时扫描多个索引,可以避免扫描全部数据文件,提高查询效率,加快数据访问速度。

客户价值

使用并行索引扫描特性可以预计获得大约25%左右的性能提升,而对于整体执行来说,预计可以获得大约10%左右的性能提升。

特性描述

本特性支持对普通表和分区表进行并行索引扫描,主要包含三种方式:indexscan、indexonlyscan以及bitmapscan。

  • indexscan:在对数据表进行范围查询时,可以通过索引定位到起始和结束位置,先扫描索引数据,再根据扫描结果对数据文件进行并行扫描,提升查询效率。

  • indexonlyscan:在进行表扫描时,当目标列都包含在索引中时,可以仅扫描索引数据,减少需要扫描的文件,同时可根据约束条件来对确定范围的索引数据进行并行扫描。

  • bitmapscan:在进行表扫描时,将索引扫描分为两个阶段。先并行扫描索引文件,获取要扫描的所有数据文件页;然后再并行扫描数据文件页,这样可以减少数据文件的随机访问和读取次数。

特性增强

特性约束

  • 使用该功能需要打开并行开关,即设置query_dop的值大于1。

  • 并行索引扫描仅支持BTree索引。

  • 支持astore存储类型,不支持ustore、cstore存储类型。

示例

分区表索引分为LOCAL索引与GLOBAL索引,一个LOCAL索引对应一个具体分区,而GLOBAL索引则对应整个分区表。下面以分区表为例介绍并行索引扫描。

  • GLOBAL索引

    -- 1. 创建分区表,并插入数据。
    CREATE TABLE parallel_partition_index_01
    (
        c1 int,
        c2 int,
        c3 int
    )
    PARTITION BY RANGE(c1)
    (
        PARTITION P1 VALUES LESS THAN(2000),
        PARTITION P2 VALUES LESS THAN(4000),
        PARTITION P3 VALUES LESS THAN(6000),
        PARTITION P4 VALUES LESS THAN(MAXVALUE)
    )enable row movement;
    INSERT INTO parallel_partition_index_01 VALUES (generate_series(1, 10000), generate_series(1,10000), generate_series(1, 10000));
    
    -- 2. 创建索引。
    CREATE INDEX index_parallel_partition_index_01 on parallel_partition_index_01(c1) GLOBAL;
    
    -- 3. 关闭其他扫描类型,如seqscan、bitmapscan、indexonlyscan等。
    SET enable_seqscan = OFF;
    SET enable_bitmapscan = OFF;
    SET enable_indexonlyscan = OFF;
    
    -- 4. 打开并行开关,设置线程之间通信同步代价(smp_thread_cost)。
    -- 说明: smp_thread_cost参数值调低可以促使优化器优先选择并行。
    SET query_dop = 2;
    SET smp_thread_cost = 0;
    
    -- 5. 执行查询操作。
    SELECT * FROM parallel_partition_index_01 WHERE c1=100;
     c1  | c2  | c3  
    -----+-----+-----
     100 | 100 | 100
    (1 row)
    
    -- 6. 执行EXPLAIN语句查看执行计划信息。
    EXPLAIN (COSTS OFF) SELECT * FROM parallel_partition_index_01 WHERE c1<1000;
                                           QUERY PLAN                                        
    -----------------------------------------------------------------------------------------
     Streaming(type: LOCAL GATHER dop: 1/2)
       ->  Index Scan using index_parallel_partition_index_01 on parallel_partition_index_01
             Index Cond: (c1 < 1000)
    (3 rows)
  • LOCAL索引

    -- 1. 创建分区表,并插入数据。
    CREATE TABLE parallel_partition_index_01
    (
        c1 int,
        c2 int,
        c3 int
    )
    PARTITION BY RANGE(c1)
    (
        PARTITION P1 VALUES LESS THAN(2000),
        PARTITION P2 VALUES LESS THAN(4000),
        PARTITION P3 VALUES LESS THAN(6000),
        PARTITION P4 VALUES LESS THAN(MAXVALUE)
    )enable row movement;
    INSERT INTO parallel_partition_index_01 VALUES (generate_series(1, 10000), generate_series(1,10000), generate_series(1, 10000));
    
    -- 2. 创建索引。
    CREATE INDEX index_parallel_partition_index_01 on parallel_partition_index_01(c1) LOCAL;
    
    -- 3. 关闭其他扫描类型,如seqscan、bitmapscan、indexonlyscan等。
    SET enable_seqscan = OFF;
    SET enable_bitmapscan = OFF;
    SET enable_indexonlyscan = OFF;
    
    -- 4. 打开并行开关,设置线程之间通信同步代价(smp_thread_cost)。
    --说明:smp_thread_cost参数值调低可以促使优化器优先选择并行。
    SET query_dop = 2;
    SET smp_thread_cost = 0;
    
    -- 5. 执行查询操作。
    SELECT * FROM parallel_partition_index_01 WHERE c1=100;
     c1  | c2  | c3  
    -----+-----+-----
     100 | 100 | 100
    (1 row)
    
    -- 6. 执行EXPLAIN语句查看执行计划信息。
    EXPLAIN (COSTS OFF) SELECT * FROM parallel_partition_index_01 WHERE c1<1000;
                                            QUERY PLAN                                                 
    -----------------------------------------------------------------------------------------
     Streaming(type: LOCAL GATHER dop: 1/2)
       -> Partition Iterator
            Iterations: 1
            Selected Partitions:  1
            ->  Partitioned Index Scan using index_parallel_partition_index_01 on parallel_partition_index_01
                   Index Cond: (c1 < 1000)
    (6 rows)

相关页面

smp_thread_cost

Copyright © 2011-2024 www.enmotech.com All rights reserved.