diff --git a/content/zh/post/kangyang/figures/zh-cn_image_0262916291.png b/content/zh/post/kangyang/figures/zh-cn_image_0262916291.png new file mode 100644 index 0000000000000000000000000000000000000000..81ed323affb7e2ecc818c9b253022ddc740248b0 Binary files /dev/null and b/content/zh/post/kangyang/figures/zh-cn_image_0262916291.png differ diff --git a/content/zh/post/kangyang/figures/zh-cn_image_0262916293.png b/content/zh/post/kangyang/figures/zh-cn_image_0262916293.png new file mode 100644 index 0000000000000000000000000000000000000000..7beeb008b4263def35de9376975b2f3b68fb1c82 Binary files /dev/null and b/content/zh/post/kangyang/figures/zh-cn_image_0262916293.png differ diff --git a/content/zh/post/kangyang/figures/zh-cn_image_0262916295.png b/content/zh/post/kangyang/figures/zh-cn_image_0262916295.png new file mode 100644 index 0000000000000000000000000000000000000000..6b007e0d722e4da925e337b6efe500f242e3f647 Binary files /dev/null and b/content/zh/post/kangyang/figures/zh-cn_image_0262916295.png differ diff --git a/content/zh/post/kangyang/figures/zh-cn_image_0263539505.png b/content/zh/post/kangyang/figures/zh-cn_image_0263539505.png new file mode 100644 index 0000000000000000000000000000000000000000..55bdd668f076ed5998b3e9d3093fde9450ce2b0d Binary files /dev/null and b/content/zh/post/kangyang/figures/zh-cn_image_0263539505.png differ diff --git a/content/zh/post/kangyang/opengauss-sql-1-update.md b/content/zh/post/kangyang/opengauss-sql-1-update.md new file mode 100644 index 0000000000000000000000000000000000000000..d4865389206c07dd4c213ccf6c793ab033eba60c --- /dev/null +++ b/content/zh/post/kangyang/opengauss-sql-1-update.md @@ -0,0 +1,336 @@ ++++ +title = "openGauss数据库核心技术-SQL引擎(1)" +date = "2020-07-22" +tags = ["openGauss数据库核心技术"] +archives = "2020-07" +author = "kangyang" +summary = "陆续介绍openGauss数据库的各项核心技术,包括SQL引擎、优化器、存储引擎、事务处理、数据库安全等。本期介绍openGauss SQL引擎技术" +img = "/zh/post/kangyang/title/title.jpg" +times = "10:30" + ++++ + +### 前言 + + openGauss是高斯数据库系列产品之一,其开源版本已在今年6月30日推出。接下来将陆续向大家介绍openGauss数据库的各项核心技术,包括SQL引擎、优化器、存储引擎、事务处理、数据库安全等。本期开始介绍openGauss SQL引擎技术。 + + 数据库的SQL引擎是数据库重要的子系统之一,它对上负责承接应用程序发送过来的SQL语句,对下则负责指挥执行器运行执行计划。其中优化器作为SQL引擎中最重要、最复杂的模块,被称为数据库的“大脑”,优化器产生的执行计划的优劣直接决定数据库的性能。本文将从SQL语句进入数据库开始,对SQL引擎的各个模块进行全面的说明。 +### SQL引擎概览 + +--- + +SQL引擎是数据库系统重要组成部分,它的主要职责是负责将应用程序输入的SQL在当前负载场景下生成高效的执行计划,在SQL的高效执行上扮演重要角色。SQL在SQL引擎里执行过程,如图1所示。 + +**图1 SQL执行流程** + + + + +从图1中可以看出,应用程序的SQL需要经过SQL解析生成逻辑执行计划、经过查询优化生成物理执行计划,然后将物理执行计划转交给查询执行引擎做物理算子的执行操作。 + +SQL解析通常包含词法分析、语法分析、语义分析几个子模块。SQL语言是介于关系演算和关系代数之间一种描述性语言,它吸取了关系代数中一部分逻辑算子的描述,而放弃了关系代数中“过程化”的部分,SQL解析主要的作用就是将一个SQL语句编译成为一个由关系算子组成的逻辑执行计划。 + +描述语言的特点是规定了需要获取的“WHAT”,而不关心“HOW”,也就是只关注结果而不关注过程,因此SQL语言描述性的特点导致查询优化在数据库管理系统中具有非常重要的作用。 + +查询重写则是在逻辑执行计划的基础上进行等价的关系代数变换,这种优化也可以称为代数优化,虽然两个关系代数式获得的结果完全相同,但是它们的执行代价却可能有很大的差异,这就构成了查询重写优化的基础。 + +在早期的数据库管理系统中,通常采用基于启发式规则的方法来生成最优的物理执行计划,但是这种基于规则的优化的灵活度不够,常常导致产生一些次优的执行计划,而代价估算的引入,则从根本上解决了基于规则优化的不足。 + +基于代价的优化器一方面生成“候选”的物理执行路径,另一方面对这些执行路径计算它们的执行代价,这样就建立了执行路径的筛选标准,从而能够通过比较代价而获得最优的物理执行计划。 + +### SQL解析 + +SQL语句在数据库管理系统中的编译过程符合编译器实现的常规过程,需要进行词法分析、语法分析和语义分析。 + +- 词法分析:从查询语句中识别出系统支持的关键字、标识符、操作符、终结符等,每个词确定自己固有的词性。 +- 语法分析:根据SQL语言的标准定义语法规则,使用词法分析中产生的词去匹配语法规则,如果一个SQL语句能够匹配一个语法规则,则生成对应的抽象语法树(Abstract Syntax Tree,AST)。 +- 语义分析:对语法树(AST)进行有效性检查,检查语法树中对应的表、列、函数、表达式是否有对应的元数据,将抽象语法树转换为逻辑执行计划(关系代数表达式)。 + +在SQL语言标准中,确定了SQL语言的关键字以及语法规则信息,SQL解析器在做词法分析的过程中会将一个SQL语句根据关键字信息以及间隔信息划分为独立的原子单位,每个单位以一个词的方式展现,例如如下SQL语句: + +```sql +SELECT w_name FROM warehouse WHERE w_no = 1; +``` + +可以划分的关键字、标识符、操作符、常量等原子单位,如表1所示。 + +**表1 词法分析的特征** + +
+ | ++ | +
---|---|
+ | ++ | +
+ | ++ | +
+ | ++ | +
+ | ++ | +