循序渐进|Mogdb性能增强之并行索引扫描

前言

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

openGauss只支持并行的segscan,通过在优化器中根据并行度直接计算每个线程要访问的页面号码,然后每个线程直接扫描对应的页面。在包含约束条件的扫描中,只能用并行segscan然后进行条件过滤或者是单线程的索引扫描,性能很低。

MogDB通过将查询任务分解为多个并行的子任务,同时扫描多个索引,可以避免扫描全部数据文件,提高查询效率,加快数据访问速度。使用并行索引扫描特性可以预计获得大约25%左右的性能提升,而对于整体执行来说,预计可以获得大约10%左右的性能提升。

image.png
索引并行扫描原理:

  • 1.多个线程同步对btree进行扫描,根据约束条件找到起始付置,各线程交替进行indexpage的获取和读取;
  • 2.各线程根据获得的indextuple来进行数据tuple的获取,各线程不需要同步,并行执行,加快数据访问速度。

测试验证

  • 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)

-- 7.开启enable_bitmapscan
MogDB=# set enable_bitmapscan=on;
SET

--8.说明支持bitmapscan索引并行扫描。
MogDB=# 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 Bitmap Heap Scan on parallel_partition_index_01
               Recheck Cond: (c1 < 1000)
               ->  Partitioned Bitmap Index Scan on index_parallel_partition_index_01
                     Index Cond: (c1 < 1000)

--9.开启indexonlyscan扫描类型
SET enable_seqscan = OFF;
SET enable_bitmapscan = OFF;
set enable_indexscan=off;
SET enable_indexonlyscan = on;

--10.说明支持indexonlyscan索引并行扫描。
MogDB=# EXPLAIN (COSTS OFF) SELECT c1 FROM parallel_partition_index_01 ;
                                                   QUERY PLAN                                                   
----------------------------------------------------------------------------------------------------------------
 Streaming(type: LOCAL GATHER dop: 1/2)
   ->  Partition Iterator
         Iterations: 4
         Selected Partitions:  1..4
         ->  Partitioned Index Only Scan using index_parallel_partition_index_01 on parallel_partition_index_01
(5 rows)

知识总结

主要包含三种方式:indexscan、indexonlyscan以及bitmapscan。

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

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

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

技术限制

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

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

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

参考文档

https://docs.mogdb.io/zh/mogdb/v5.0/parallel-index-scan#%E7%89%B9%E6%80%A7%E6%8F%8F%E8%BF%B0
https://docs.mogdb.io/zh/mogdb/v5.0/optimizer-cost-constants

本文由mdnice多平台发布

在这里插入图片描述

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《循序渐进学Spark》是一本介绍Spark的入门教材,主要涵盖了Spark的架构和集群环境的相关知识。 Spark是一种基于内存的分布式计算框架,它的架构包括了Spark Core、Spark SQL、Spark Streaming、MLlib和GraphX等模块。Spark Core是Spark的核心模块,提供了分布式任务调度、内存管理、容错机制等基础功能。Spark SQL是Spark的SQL查询模块,支持SQL查询和DataFrame API。Spark Streaming是Spark的流处理模块,支持实时数据处理。MLlib是Spark的机器学习模块,提供了常见的机器学习算法和工具。GraphX是Spark的图计算模块,支持图计算和图分析。 在集群环境中,Spark可以运行在多台计算机上,通过分布式计算来提高计算效率。Spark集群环境包括了Master节点和Worker节点。Master节点负责任务调度和资源管理,Worker节点负责实际的计算任务。Spark集群环境的搭建需要考虑到网络、存储、内存等方面的因素,以保证集群的稳定性和性能。 总之,《循序渐进学Spark》是一本非常实用的Spark入门教材,对于想要学习Spark的人来说是一本不可多得的好书。 ### 回答2: Spark是一种用于大规模数据处理的开源计算框架,具有高效的内存计算能力和丰富的API支持。它提供了一个分布式计算引擎,可以在集群环境中快速处理大规模数据。 Spark架构是以主节点和多个工作节点组成的分布式集群环境。主节点负责协调整个集群的工作,并提供了集群管理和资源调度的功能。每个工作节点负责实际的计算任务,通过与主节点通信来接收任务和返回结果。 在Spark集群环境中,所有的数据都存储在分布式文件系统(如HDFS)中,这样可以确保数据的高可用性和容错性。Spark的计算任务被切分成多个小任务,并在集群中的各个工作节点上并行执行,从而实现了高效的计算。Spark还使用了内存计算技术,将数据存储在内存中,大大提高了计算速度。 Spark的核心组件是Spark Core,它提供了任务调度、资源管理和分布式通信等基础功能。除了Spark Core外,Spark还提供了其他组件,如Spark SQL、Spark Streaming、MLlib和GraphX等,用于不同的数据处理需求。这些组件可以与Spark Core无缝集成,共同构建一个完整的Spark生态系统。 总之,Spark架构与集群环境是为了满足大规模数据处理的需求而设计的。通过分布式计算和内存计算技术,Spark能够处理海量的数据,并在集群环境中实现高效的并行计算。这使得Spark成为了现代大数据处理的重要工具之一。 ### 回答3: Spark是一个开源的分布式计算系统,旨在提供高效的大数据处理能力。它的架构由以下几个关键组件组成:集群管理器、计算引擎、分布式文件系统和应用程序。 集群管理器是Spark架构的核心,负责管理整个集群的资源分配和任务调度。常见的集群管理器包括Apache Mesos、Hadoop YARN和独立模式。集群管理器将集群划分为多个计算节点,根据各个节点的资源状况分配任务,并监控任务的执行情况。 计算引擎是Spark的核心模块,实现了分布式计算和数据处理功能。它提供了基于内存的计算能力,可以在计算节点上并行执行任务,大大提高了计算效率。计算引擎的主要组件包括Spark Core、Spark SQL、Spark Streaming、Spark MLlib和Spark GraphX。每个组件都提供了不同的数据处理和计算功能,可以根据具体的需求选择使用。 分布式文件系统是Spark架构的一部分,用于存储和管理大数据集。常见的分布式文件系统包括Hadoop Distributed File System(HDFS)和Amazon S3。Spark可以直接从这些文件系统中读取和写入数据,实现数据的高效存取。 应用程序是Spark架构中的最上层组件,由开发者编写和提交给 Spark 集群进行执行。开发者可以使用多种编程语言(如Scala、Java和Python)编写 Spark 应用程序,并在执行过程中使用 Spark 提供的 API 来实现数据处理和分析的功能。 总体而言,Spark架构与集群环境紧密结合,通过集群管理器实现资源调度和任务执行,通过计算引擎实现分布式计算和数据处理,通过分布式文件系统实现数据存储和管理,通过开发者编写的应用程序实现具体的数据处理和分析任务。这种架构和环境使得 Spark 能够处理大规模的数据,并在分布式环境下实现高效的数据处理和计算能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值