暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

通过实验理解MogDB5.0.3的SQL Bypass

由迪 2024-01-23
179

原作者:姜殿斌

SQL Bypass 特性描述:

在典型的OLTP(联机事务处理)场景中,简单查询通常占据了很大一部分的比例。这类查询的特点是只涉及单表和简单表达式的查询,不涉及复杂的联接、子查询和聚合操作等。为了加速这类简单查询的执行,5.0增强了SQL Bypass的功能。

SQL Bypass框架的主要思想是在解析(parse)阶段对这类简单查询做简单的模式判断,然后进入到特殊的执行路径中,跳过经典的执行器执行框架,包括算子的初始化与执行、表达式与投影等经典框架。相反,SQL Bypass框架会直接重写一套简洁的执行路径,并直接调用存储接口来执行查询,从而大大加速简单查询的执行速度。

通过使用SQL Bypass框架,可以避免复杂查询的开销,减少不必要的计算和数据传输,在满足简单查询需求的前提下,提高查询的性能和效率。这对于OLTP系统来说尤为重要,因为在该场景中,高并发的查询请求需要快速响应和处理。

实验:

1、开启SQL Bypass功能:

set enable_opfusion = on;
SET enable_bitmapscan to off;

2、创建表,并插入数据:

CREATE TABLE MogDB_sql_bypass_1 (id int, pname name, match text);
INSERT INTO MogDB_sql_bypass_1
 VALUES (
     generate_series(1, 20000),
     'player# ' || generate_series(1, 20000),
     'match# ' || generate_series(1, 11)
   );

3、创建索引:

CREATE index on MogDB_sql_bypass_1(id);

4、执行Explain查看索引扫描查询结果

4.1、简单的索引扫描场景

MogDB=# explain (costs on) select id from MogDB_sql_bypass_1 where id = 1;
               QUERY PLAN
   -----------------------------------------------------------------------------------------------------------

[Bypass]
Index Only Scan using mogdb_sql_bypass_1_id_idx on mogdb_sql_bypass_1 (cost=0.00..48.07 rows=11 width=4)
Index Cond: (id = 1)
(3 rows)
4.2、带过滤条件的索引扫描场景``

MogDB=# explain (costs off) select id, pname, match from MogDB_sql_bypass_1 where id = 1;
               QUERY PLAN
 ------------------------------------------------------------------
 [Bypass]
 Index Scan using mogdb_sql_bypass_1_id_idx on mogdb_sql_bypass_1
  Index Cond: (id = 1)
 (3 rows)
MogDB=# explain (costs off) select id, pname, match from MogDB_sql_bypass_1 where id = 1;
         QUERY PLAN
 ------------------------------------------------------------------
 [Bypass]
 Index Scan using mogdb_sql_bypass_1_id_idx on mogdb_sql_bypass_1
  Index Cond: (id = 1)
 (3 rows)

4.3、PBE场景中的索引扫描

MogDB=# PREPARE p1 AS SELECT id FROM MogDB_sql_bypass_1 WHERE id = $1;
MogDB=# PREPARE p2 AS SELECT id, pname, match FROM MogDB_sql_bypass_1 WHERE id = $1;
MogDB=# PREPARE p3 AS SELECT id, pname, match FROM MogDB_sql_bypass_1 WHERE id = $1 AND match <> $2;
MogDB=# explain(costs OFF)EXECUTE p1(2);
        QUERY PLAN
 -----------------------------------------------------------------------
 [Bypass]
 Index Only Scan using mogdb_sql_bypass_1_id_idx on mogdb_sql_bypass_1
  Index Cond: (id = $1)
 (3 rows)
MogDB=# explain (costs off) EXECUTE p2(2);
        QUERY PLAN
 ------------------------------------------------------------------
 [Bypass]
 Index Scan using mogdb_sql_bypass_1_id_idx on mogdb_sql_bypass_1
  Index Cond: (id = $1)
 (3 rows)
MogDB=# explain (costs off) EXECUTE p3(2, 'match# 7');
         QUERY PLAN
 ------------------------------------------------------------------
 [Bypass]
 Index Scan using mogdb_sql_bypass_1_id_idx on mogdb_sql_bypass_1
  Index Cond: (id = $1)
  Filter: (match <> $2)
 (4 rows)

5、实验环境清理

将参数改回系统默认,删除表和索引:

SET enable_bitmapscan to on;
set enable_opfusion = off;
drop index mogdb_sql_bypass_1_id_idx;
drop table MogDB_sql_bypass_1

6、参考:

sql bypass

https://docs.mogdb.io/zh/mogdb/v5.0/sql-bypass

SQL调优关键参数调整

https://docs.mogdb.io/zh/mogdb/v5.0/resetting-key-parameters-during-sql-tuning

参数说明:

https://docs.mogdb.io/zh/mogdb/v5.0/optimizer-method-configuration#enable_bitmapscan

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论