300 倍的性能提升!PieCloudDB Database 优化器「达奇」又出新“招”啦

2023-11-17

随着数字化进程的加快,全球数据量呈指数级增长,对数据库系统的性能提出了巨大的挑战。优化器作为数据库管理系统中的关键技术,对数据库性能和效率具有重要影响,它通过对用户的查询请求进行解析和优化来生成高效的执行计划,进而快速返回查询结果。然而,同一条 SQL 语句在不同的优化决策下可能会产生数量级的性能差异。随着数据规模和查询复杂性的增加,优化器的不断发展和创新将成为数据库系统持续提升性能的重要方向,也是数据库系统的最强有力的竞争力之一。

针对云原生和分布式场景,云原生虚拟数仓 PieCloudDB Database 设计与打造了新一代优化器:「达奇」。这个命名灵感来自于游戏《荒野大镖客》中的一个 NPC 角色,他的口头禅 “I have a plan” 与优化器的功能非常契合。

优化器「达奇」在 PieCloudDB 中实现了许多优化特性,通过生成高质量的查询计划,充当数据库系统的 “智囊团”,确保用户的查询性能和效率。「达奇」通过智能地分析查询语句、优化查询计划以及利用分布式数据存储和计算能力,实现了更快速、更高效的查询处理。

拓数派吉祥物「派派」

1 聚集操作与聚集下推

今天,我们将详细介绍「达奇」的全新功能:聚集下推。在现代的数据库系统中,聚集操作(Aggregate)是非常常见的一种操作类型。通过聚集操作,可以把多行数据合并成一行,并对其进行统计、求和、求均值等计算。

在传统的查询执行过程中,聚合操作通常在查询结果返回后进行,需要将所有数据传输至查询引擎进行聚合计算。然而,对于大规模数据集和复杂查询,这种方式可能导致查询性能低下、计算负载过高和计算成本昂贵等问题。

为了解决这些问题,PieCloudDB 优化器「达奇」打造了聚集下推(Aggregate Pushdown)这一功能,经测试,在很多场景下,聚集下推功能会取得百倍甚至千倍的性能提升。

2 聚集下推原理

聚集下推(Pushdown Aggregation)是一种数据库查询优化技术,通过将聚合操作下推至数据源,减少数据传输和处理的开销,从而提高查询性能和效率。

聚集下推的实现原理是在查询执行过程中尽可能早地进行聚合操作,并将聚合操作下推至数据源进行处理。具体而言,当查询计划生成时,优化器会将聚合操作下推至数据源,以便在数据源处进行聚合计算。这样可以减少数据传输量,减轻查询引擎的负担,并利用数据源的计算能力进行局部聚合。

下面我们用一个简单的图示,来讲解聚集下推的主要实现原理:

有无「聚集下推」对比

上图中,左图是没有聚集下推的执行流程,右图是有聚集下推时的执行流程。在左图没有聚集下推的情况下,表 T1 和 T2 会先做连接操作,并在连接之后的数据集上完成聚集操作。

而在右图有聚集下推的情况下,会在对表 T1 和 T2 进行连接操作之前,先对表 T1 做一次聚集操作。这样可以在某些场景下使得连接操作时表 T1 中参与的数据量极大的减少,从而显著提高查询性能。为了能准确地提高查询效率,以上两种执行方案在「达奇」中都会生成,最后会根据代价模型的估算选择代价较小的执行方案。

当有更多的表参与连接时,「达奇」会尝试把聚集操作下推到不同的连接层,通过代价的比较来选定最优的下推位置。

3 聚集下推演示实例

下面,我们通过一个查询实例来看一下聚集下推的效果。首先,我们通过下面语句来创建测试用表:

CREATE TABLE t (x int, y int);
INSERT INTO t SELECT i % 30, i % 30 FROM generate_series(1, 10240) i;
ANALYZE t;

测试所用的查询如下:

SELECT t1.x, sum(t2.y + t3.y), count(*) FROM t t1 
JOIN t t2 ON t1.x = t2.x JOIN t t3 ON t2.x = t3.x 
GROUP BY t1.x;

当没有聚集下推时,查询计划如下:

EXPLAIN (ANALYZE, COSTS OFF) 
SELECT t1.x, sum(t2.y + t3.y), count(*) FROM t t1 JOIN t t2 ON t1.x = t2.x JOIN t t3 ON t2.x = t3.x GROUP BY t1.x; 

                                                        QUERY PLAN 

--------------------------------------------------------------------------------------------------------------------------- 

Gather Motion 3:1  (slice1; segments: 3) (actual time=153884.859..274102.066 rows=30 loops=1) 
   ->  HashAggregate (actual time=274100.004..274100.011 rows=12 loops=1) 
         Group Key: t1.x 
         Peak Memory Usage: 0 kB 
         ->  Hash Join (actual time=38.717..100579.782 rows=477571187 loops=1) 
               Hash Cond: (t1.x = t3.x) 
               Extra Text: (seg0)   Hash chain length 341.4 avg, 342 max, using 12 of 131072 buckets. 
               ->  Hash Join (actual time=2.088..429.203 rows=1398787 loops=1) 
                     Hash Cond: (t1.x = t2.x) 
                     Extra Text: (seg0)   Hash chain length 341.4 avg, 342 max, using 12 of 131072 buckets. 
                     ->  Redistribute Motion 3:3  (slice2; segments: 3) (actual time=0.044..4.590 rows=4097 loops=1) 
                           Hash Key: t1.x 
                           ->  Seq Scan on t t1 (actual time=1.382..32.683 rows=3496 loops=1) 
                     ->  Hash (actual time=1.760..1.761 rows=4097 loops=1) 
                           Buckets: 131072  Batches: 1  Memory Usage: 1185kB 
                           ->  Redistribute Motion 3:3  (slice3; segments: 3) (actual time=0.049..0.922 rows=4097 loops=1) 
                                 Hash Key: t2.x 
                                 ->  Seq Scan on t t2 (actual time=1.628..32.837 rows=3496 loops=1) 
               ->  Hash (actual time=36.153..36.153 rows=4097 loops=1) 
                     Buckets: 131072  Batches: 1  Memory Usage: 1185kB 
                     ->  Redistribute Motion 3:3  (slice4; segments: 3) (actual time=3.918..35.169 rows=4097 loops=1) 
                           Hash Key: t3.x 
                           ->  Seq Scan on t t3 (actual time=1.380..30.316 rows=3496 loops=1) 

Planning Time: 8.810 ms 
   (slice0) Executor memory: 257K bytes. 
   (slice1) Executor memory: 2484K bytes avg x 3 workers, 2570K bytes max (seg0).  Work_mem: 1185K bytes max. 
   (slice2) Executor memory: 32840K bytes avg x 3 workers, 32841K bytes max (seg0). 
   (slice3) Executor memory: 32860K bytes avg x 3 workers, 32860K bytes max (seg0). 
   (slice4) Executor memory: 32860K bytes avg x 3 workers, 32860K bytes max (seg0). 

Memory used:  128000kB 
Optimizer: Postgres query optimizer 
Execution Time: 274130.589 ms
(32 rows) 

而当有聚集下推时,查询计划如下:

EXPLAIN (ANALYZE, COSTS OFF) 
SELECT t1.x, sum(t2.y + t3.y), count(*) FROM t t1 JOIN t t2 ON t1.x = t2.x JOIN t t3 ON t2.x = t3.x GROUP BY t1.x; 

                                                                      QUERY PLAN 

---------------------------------------------------------------------------------------------------------------------------------------------------------- 

Gather Motion 3:1  (slice1; segments: 3) (actual time=835.755..836.406 rows=30 loops=1) 
   ->  Finalize GroupAggregate (actual time=834.227..835.432 rows=12 loops=1) 
         Group Key: t1.x 
         ->  Sort (actual time=834.031..834.441 rows=4097 loops=1) 
               Sort Key: t1.x 
               Sort Method:  quicksort  Memory: 1266kB 
               ->  Redistribute Motion 3:3  (slice2; segments: 3) (actual time=812.139..830.706 rows=4097 loops=1) 
                     Hash Key: t1.x 
                     ->  Hash Join (actual time=810.536..828.097 rows=3496 loops=1) 
                           Hash Cond: (t1.x = t2.x) 
                           Extra Text: (seg0)   Hash chain length 1.0 avg, 1 max, using 30 of 131072 buckets. 
                           ->  Seq Scan on t t1 (actual time=1.689..16.674 rows=3496 loops=1) 
                           ->  Hash (actual time=808.497..808.498 rows=30 loops=1) 
                                 Buckets: 131072  Batches: 1  Memory Usage: 1026kB 
                                 ->  Broadcast Motion 3:3  (slice3; segments: 3) (actual time=461.065..808.466 rows=30 loops=1) 
                                       ->  Partial HashAggregate (actual time=810.026..810.033 rows=12 loops=1) 
                                             Group Key: t2.x 
                                             Peak Memory Usage: 0 kB 
                                             ->  Hash Join (actual time=28.070..331.181 rows=1398787 loops=1) 
                                                   Hash Cond: (t2.x = t3.x) 
                                                   Extra Text: (seg0)   Hash chain length 341.4 avg, 342 max, using 12 of 262144 buckets. 
                                                   ->  Redistribute Motion 3:3  (slice4; segments: 3) (actual time=0.040..1.270 rows=4097 loops=1) 
                                                         Hash Key: t2.x 
                                                         ->  Seq Scan on t t2 (actual time=1.449..19.963 rows=3496 loops=1) 
                                                   ->  Hash (actual time=27.834..27.835 rows=4097 loops=1) 
                                                         Buckets: 262144  Batches: 1  Memory Usage: 2209kB 
                                                         ->  Redistribute Motion 3:3  (slice5; segments: 3) (actual time=3.836..27.025 rows=4097 loops=1) 
                                                               Hash Key: t3.x 
                                                               ->  Seq Scan on t t3 (actual time=1.537..23.654 rows=3496 loops=1) 

Planning Time: 14.425 ms 
   (slice0)    Executor memory: 328K bytes. 
   (slice1)    Executor memory: 408K bytes avg x 3 workers, 514K bytes max (seg0).  Work_mem: 450K bytes max. 
   (slice2)    Executor memory: 33951K bytes avg x 3 workers, 33952K bytes max (seg0).  Work_mem: 1026K bytes max. 
   (slice3)    Executor memory: 2298K bytes avg x 3 workers, 2341K bytes max (seg0).  Work_mem: 2209K bytes max. 
   (slice4)    Executor memory: 32860K bytes avg x 3 workers, 32860K bytes max (seg0). 
   (slice5)    Executor memory: 32860K bytes avg x 3 workers, 32860K bytes max (seg0). 

Memory used:  128000kB 
Optimizer: Postgres query optimizer 
Execution Time: 865.305 ms 
(39 rows) 

通过两个查询计划的对比,可以看到,当没有聚集下推时(查询计划 1),需要先完成所有的连接操作,再在连接的数据集上进行聚集操作。而聚集下推(查询计划 2)可以把聚集操作下推到最优的连接层,从而减少后续连接操作的数据量,可以显著地提升性能。

在这个例子中,「达奇」把聚集操作下推到了 t2 和 t3 连接之后,与 t1 连接之前。通过对比这两个执行时间,我们可以看到执行时间从之前的 274130.589 ms 降低到了 865.305 ms ,实现三百多倍的性能提升。当数据量进一步增大,或是查询涉及的表进一步增多时,聚集下推的性能提升会更加明显。

无聚集下推 VS 有聚集下推对比

PieCloudDB 的全新优化器「达奇」为用户提供了一系列全面的逻辑优化功能,包括谓词下推、子查询子连接提升和外连接消除等。作为一款面向在线分析处理(OLAP)场景的数据库,优化器「达奇」不仅支持聚集下推功能,还具备 Data Skipping、预计算等高级特性,以满足各种复杂查询的需求。在未来的文章中,我们将逐一介绍这些功能,为您带来更深入的了解。敬请关注!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

300 倍的性能提升!PieCloudDB Database 优化器「达奇」又出新“招”啦 的相关文章

  • 【计算机开题报告】 网上茶叶销售平台设计与开发

    一 选题依据 简述国内外研究现状 生产需求状况 说明选题目的 意义 列出主要参考文献 1 研究背景 随着社会经济的迅速发展和科学技术的全面进步 以计算机与网络技术为基础的信息系统正处于蓬勃发展的时期 随着经济文化水平的提高 近年来 随着科学
  • 性能分析与调优: Linux 内存观测工具

    目录 一 实验 1 环境 2 vmstat 3 PSI 4 swapon 5 sar 6 slabtop 7 numstat 8 ps 9 top 10 pmap 11 perf 12 bpftrace 二 问题 1 接口读写报错 2 sl
  • Qt源码分析:Qt程序是怎么运行起来的?

    一 从 exec 谈起 一个标准的Qt gui程序 在启动时我们会coding如下几行简洁的代码 include widget h include
  • 内网穿透的应用-使用Net2FTP轻松部署本地Web网站并公网访问管理内网资源

    文章目录 1 前言 2 Net2FTP网站搭建 2 1 Net2FTP下载和安装 2 2 Net2FTP网页测试 3 cpolar内网穿透 3 1 Cpolar云端设置 3 2 Cpolar本地设置
  • 软件开发和网络安全哪个更好找工作?

    为什么今年应届毕业生找工作这么难 有时间去看看张雪峰今年为什么这么火就明白了 这么多年人才供给和需求错配的问题 在经济下行的今年 集中爆发 供给端 大学生越来越多 需求端 低端工作大家不愿去 高端岗位又太少 很多基础行业 比如机械 土木 所
  • AntDB内存管理之内存上下文之如何使用内存上下文

    5 如何使用内存上下文 使用内存上下文之前 我们需要先对其进行创建 AntDB启动时已经创建并初始化好了部分内存上下文 例如 TopMemoryContext 这个TopMemoryContext是所有内存上下文的父节点或者祖先节点 一般我
  • 【计算机毕业设计】病房管理系统

    当下 如果还依然使用纸质文档来记录并且管理相关信息 可能会出现很多问题 比如原始文件的丢失 因为采用纸质文档 很容易受潮或者怕火 不容易备份 需要花费大量的人员和资金来管理用纸质文档存储的信息 最重要的是数据出现问题寻找起来很麻烦 并且修改
  • 【计算机毕业设计】实验室预约管理

    身处网络时代 随着网络系统体系发展的不断成熟和完善 人们的生活也随之发生了很大的变化 人们在追求较高物质生活的同时 也在想着如何使自身的精神内涵得到提升 而读书就是人们获得精神享受非常重要的途径 为了满足人们随时随地只要有网络就可以看书的要
  • APP端网络测试与弱网模拟

    当前APP网络环境比较复杂 网络制式有2G 3G 4G网络 还有越来越多的公共Wi Fi 不同的网络环境和网络制式的差异 都会对用户使用app造成一定影响 另外 当前app使用场景多变 如进地铁 上公交 进电梯等 使得弱网测试显得尤为重要
  • python超详细基础文件操作【建议收藏】

    文章目录 前言 发现宝藏 1 文件操作 1 1 文件打开与关闭 1 1 1 打开文件 1 1 2 关闭文件 1 2 访问模式及说明 2 文件读写 2 1 写数据 write 2 2 读数据 read 2 3 读数据 readlines 2
  • 基于java的学生宿舍管理系统设计与实现

    基于java的学生宿舍管理系统设计与实现 I 引言 A 研究背景和动机 基于Java的学生宿舍管理系统设计与实现的研究背景和动机 在数字化时代的推动下 学生宿舍管理系统已经成为了管理学生宿舍的重要工具 学生宿舍管理系统能够帮助管理者更好地管
  • 电商数据api接口商品评论接口接入代码演示案例

    电商数据API接口商品评论 接口接入入口 提高用户体验 通过获取用户对商品的评论 商家可以了解用户对商品的满意度和需求 从而优化商品和服务 提高用户体验 提升销售业绩 用户在购买商品前通常会查看其他用户的评论 以了解商品的实际效果和质量 商
  • 深入了解 Python MongoDB 操作:排序、删除、更新、结果限制全面解析

    Python MongoDB 排序 对结果进行排序 使用 sort 方法对结果进行升序或降序排序 sort 方法接受一个参数用于 字段名 一个参数用于 方向 升序是默认方向 示例 按名称按字母顺序对结果进行排序 import pymongo
  • 【计算机毕业设计】二手家电管理平台

    时代在飞速进步 每个行业都在努力发展现在先进技术 通过这些先进的技术来提高自己的水平和优势 二手家电管理平台当然不能排除在外 二手家电管理平台是在实际应用和软件工程的开发原理之上 运用java语言以及前台VUE框架 后台SpringBoot
  • 【计算机毕业设计】springbootstone音乐播放器的设计与实现

    随着我国经济的高速发展与人们生活水平的日益提高 人们对生活质量的追求也多种多样 尤其在人们生活节奏不断加快的当下 人们更趋向于足不出户解决生活上的问题 stone音乐播放器展现了其蓬勃生命力和广阔的前景 与此同时 为解决用户需求 stone
  • 【计算机毕业设计】OA公文发文管理系统_xtv98

    近年来 人们的生活方式以网络为主题不断进化 OA公文发文管理就是其中的一部分 现在 无论是大型的还是小型的网站 都随处可见 不知不觉中已经成为我们生活中不可或缺的存在 随着社会的发展 除了对系统的需求外 我们还要促进经济发展 提高工作效率
  • Redis分布式锁--java实现

    文章目录 Redis分布式锁 方案 SETNX EXPIRE 基本原理 比较好的实现 会产生四个问题 几种解决原子性的方案
  • 温室气体排放更敏感的模型(即更高的平衡气候敏感性(ECS))在数年到数十年时间尺度上也具有更高的温度变化(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Python代码 数据
  • 每日变更的最佳实践

    在优维公司内部 我们采用发布单的方式进行每天的应用变更管理 这里给各位介绍优维的最佳实践 变更是需要多角色合作的 而且他是整体研发流程的一部分 在优维内部 我们坚持每日变更 打通开发环节到最终发布上线的全过程 在保证质量的前提下 尽可能提升
  • Python 使用 NoSQL 数据库的优选方案

    NoSQL 数据库因其高性能 可扩展性和灵活性而风靡一时 然而 对于 Python 程序员而言 选择合适的 NoSQL 数据库可能会令人困惑 因为有多种选择可供选择 那么 哪种 NoSQL 数据库最适合 Python 呢 2 解决方案 根据

随机推荐

  • 920. 最优乘车(BFS 流式输入)

    H城是一个旅游胜地 每年都有成千上万的人前来观光 为方便游客 巴士公司在各个旅游景点及宾馆 饭店等地都设置了巴士站并开通了一些单程巴士线路 每条单程巴士线路从某个巴士站出发 依次途经若干个巴士站 最终到达终点巴士站 一名旅客最近到H城旅游
  • 移远EC20模组MQTT连接阿里云平台

    一 实现原理 在开始操作前说一下MQTT的实现的原理 MQTT协议 Message Queuing Telemetry Transport 消息队列遥测传输 是IBM开发的一个即时通讯协议 是为大量计算能力有限 且工作在低带宽 不可靠的网络
  • 使用 gvm 来快速安装或者升级 golang 版本

    gvm 是 golang 的版本管理工具 有点类似于 python 的 pyenv 一 安装 gvm bash lt lt curl s S L https raw githubusercontent com moovweb gvm mas
  • 自然对数e的来历

    e是自然对数的底数 是一个无限不循环小数 其值是2 71828 是这样定义的 当n gt 时 1 1 n n的极限 注 x y表示x的y次方 随着n的增大 底数越来越接近1 而指数趋向无穷大 那结果到底是趋向于1还是无穷大呢 其实 是趋向于
  • win10与Linux虚拟机进行文件共享

    由于工作需要使用到linux虚拟机 为了实现win10与Linux虚拟机进行文件共享 分享教程如下 1 在windows系统中设置文件共享 设置过程参考我之前的文章 局域网内共享文件夹 2 虚拟机设置共享文件夹 1 设置 gt 共享文件夹
  • openGLAPI之glPolygonOffset

    openGL系列文章目录 文章目录 openGL系列文章目录 前言 一 glPolygonOffset官方文档 二 翻译 前言 openGLAPI之glPolygonOffset函数详解 一 glPolygonOffset官方文档 glPo
  • Android Dalvik VM GC options 命令控制参数

    else if strncmp argv i Xgc 5 0 In VM thread there is a register map for marking each stack item s status whether it is a
  • YOLOv3的交通灯检测,ROS下实现交通灯检测一样只需要相应文件夹下面修改之后编译即可

    YOLOv3的交通灯检测 效果 只是需要修改源码image c即可修改如下 这里的0和9就是只检测行人和交通灯 对应的数字设置自己想检测的类型 可以查看coco names文件下 完成修改之后 make clean make j 重新编译即
  • MySQL常用的数据类型

    MySQL的常用数据类型包括 整型 Int TINYINT SMALLINT MEDIUMINT INT BIGINT 浮点型 Float FLOAT DOUBLE DECIMAL 字符串类型 String CHAR VARCHAR TEX
  • SpringBoot项目用 jQuery webcam plugin实现调用摄像头拍照并保存图片

    参考博客 http www voidcn com article p oigngyvb kv html 自定义样式
  • visual studio附加选项/Tc、/Tp、/TC、/TP(指定源文件类型)

    Tc 选项指定 filename 为 C 源文件 即使它没有 c 扩展名 Tp 选项指定 filename 为 C 源文件 即使它没有 cpp 或 cxx 扩展名 选项和 filename 之间的空格是可选的 每个选项指定一个文件 若要指定
  • 多元函数可微性知识点总结

    这节的知识点也挺多 主要就是可微和偏导数存在的关系 偏导数 z f x y z对x或者y的偏导数就是把另一个当做常数求导 还算简单 判断可微性 必要条件 可以写成偏导数都存在 且可以写成 d z f x d
  • 【Matlab】simlink自动生成嵌入式代码配置教程

    1 简介 最近在学习模型开发 相较于普通嵌入式代码开发来说 其能够进行仿真 并且能够使各模块之间的逻辑更加清晰 simlink自动生成代码过程较多 因此记录下来 方便日后参考 2 搭建simlink相关模块 3 进行求解器等相关配置 配置求
  • C++的四种强制转换

    1 static cast 基本等价于隐式转换的一种类型转换运算符 以前是编译器自动隐式转换 static cast可使用于需要明确隐式转换的地方 c 中用static cast用来表示明确的转换 可以用于低风险的转换 整型和浮点型 字符与
  • 量化交易的历史

    学习目标 了解量化交易的发展历史 量化交易全球的发展历史 量化投资的产生 60年代 1969年 爱德华 索普利用他发明的 科学股票市场系统 实际上是一种股票权证定价模型 成立了第一个量化投资基金 索普也被称之为量化投资的鼻祖 量化投资的兴起
  • bWAPP通关记录(A1)

    安装 这里使用的是phpstudy进行搭建的 先下载bWAPP 打开解压之后bWAPP目录下的admin中的settings php 将数据库连接名和密码改为与phpmyadmin相同的 保存 浏览器访问 点击here 点击Login 默认
  • kuka机器人焊接编程入门教程_焊接机器人操作编程与应用教学.pptx

    ABB MOTOMAN FANUC KUKA OTC机器人 第1章 机器人基础知识 第1章 机器人基础知识 第1章 机器人基础知识 第1章 机器人基础知识 第1章 机器人基础知识 第1章 机器人基础知识 第1章 机器人基础知识 第1章 机器
  • 小程序的文件结构

    小程序的文件结构 我们利用微信开发者工具创建一个新的小程序 会有包含一个描述整体程序的app和多个描述各自页面的page 一个小程序的主体部分由三个文件组成 必须放在项目的根目录 gt app js 小程序的主要逻辑判断 gt gt app
  • 重新学防抖debounce和节流throttle,及react hook模式中防抖节流的实现方式和注意事项

    重学节流和防抖 防抖 概念理解 防抖就是指触发事件后在 n 秒内函数只能执行一次 如果在 n 秒内又触发了事件 则会重新计算函数执行时间 举例说明 坐电梯的时候 如果电梯检测到有人进来 触发事件 就会多等待 10 秒 此时如果又有人进来 1
  • 300 倍的性能提升!PieCloudDB Database 优化器「达奇」又出新“招”啦

    随着数字化进程的加快 全球数据量呈指数级增长 对数据库系统的性能提出了巨大的挑战 优化器作为数据库管理系统中的关键技术 对数据库性能和效率具有重要影响 它通过对用户的查询请求进行解析和优化来生成高效的执行计划 进而快速返回查询结果 然而 同