PG内核分析 Q&A (11)

索引是提高数据库性能的常用方法,
它可以令数据库服务器以更快的速度查找和检索特定的行.不过索引也增加了数据库系统的负荷,因此应该恰当的使用它们.索引的优劣不仅仅与索引的查询效率有关,同时与索引创建速度,更新速度,索引大小等因素有关.

以上分析的几种索引使用环境不同,相同环境下使用的优劣也各不相同.

于是,为了方便用户对特殊数据类型数据的查询,PG中提供了索引模板可方便用户对索引的扩展以支持自定义数据类型上的索引创建和查询.

通过使用索引,能够快速查找数据库中的数据.但在添加索引的同时,会增加数据库系统的负荷;在增删修改数据时,
维护索引的一致性也需要一定的时间和空间.由于索引给查找数据带来的巨大性能提升,因此也得到了广泛的应用.

在实际的使用中, 应该合理权衡使用索引带来的利弊, 恰当地使用索引.

PG的查询编译 查询处理器的职责

查询处理器的职责是数据库管理系统中的一个部件集合,它允许用户使用SQL语言在较高层次上表达查询,
其主要职责是将用户的各种命令转化成数据库上的操作序列并执行.

查询编译的主要职责是什么

查询编译的主要任务是根据用户的查询语句生成数据库中最优的执行计划,在此过程中要考虑视图,规则以及表的连接路径等问题.

5.2 查询分析 查询分析有几个模块

查询分析是查询编译的第一个模块,它包括3个部分:

词法分析

语法分析

语义分析

查询分析的输出结果是什么

它将用户输入的SQL命令转换为查询树(Query结构).

查询分析借助的分析工具是什么

其中词法分析和语法分析分别借助词法分析工具Lex和语法分析工具Yacc来完成各自的工作.

分析树和查询树的生成阶段

用户输入的SQL命令作为字符串传递给查询分析器,
对其进行词法分析和语法分析后生成分析树, 然后进行语义分析得到查询树.

查询分析各个阶段对应的处理入口函数有哪些

对于用户的sQL命令, 统一由exec_simple_query函数处理;

该函数将调用pg_parse_query完成词法和语法分析并产生分析树;

接下来调用pg_analyze_and_rewrite函数逐个对分析树(原始分析树链表raw_parsetree_list
注意: 分析树可能有多个, 原因:用户输入的SQL字符串可能包含多条执行语句,
其对应多个分析树)进行语义分析和重写;

在该函数中又会调用函数parse_analyzer进行语义分析并创建查询树(Query结构),
函数pg_rewrite_query则负责对查询树进行重写.

查询分析的处理过程是怎样的

exec_simple_query调用函数pg_parse_query进入词法和语法分析的主体处理过程,
然后函数pg_parse_query调用词法和语法分析的入口函数raw_parser生成分析树(原始分析树链表raw_parsetree_list).

函数pg_parse_query返回分析树给外部函数 (即: exec_simpe_query)

exec_simple_query接着调用函数pg_analyze_and_rewirte进行语义分析和查询重写.首先调用函数parse_analyze进行语义分析并生成查询树(用Query结构体表示),
之后会将技术要求树传递给函数pg_rewrite_query进行查询重写.

词法和语法分析在哪个函数中执行的, 通过哪个工具实现的?

在raw_parser中, 将通过Lex和Yacc生成的代码来进行词法和语法分析并生成分析树.

Lex和Yacc是词法和语法分析工具,
两者相配合可以生成助于词法和语法分析的C语言源代码.

在raw_parser中,
就是通过调用采用Lex和Yacc预生成的函数base_yyparse来实现词法和语法分析工作.

Lex工具的职责

Lex用来生成扫描器, 其工作是识别一个一个的模式,
比如数字,字符串,特殊符号等,然后将其传给Yacc.

Yacc工具的职责

Yacc则用于生成语法分析器, 它识别模式的组合,即语法.

PG中的词法分析和语法分析是由谁完成的

PG中的词法分析和语法分析是由Lex和Yacc配合完成的.

词法和语法分析和各种文件生成和调用关系

PG内核分析 Q&A

词法和语法分析的入口函数是谁, 返回结果是什么

词法和语法分析的入口函数是raw_parser, 该函数返回List结构用于存储生成的分析树.

什么情况下raw_parsettree_list中会含有多个分析树

在某些情况下,
用户可能在一个命令字符串中执行多个SQL命令,也就是说客户端提交给服务进程的字符串包含多个SQL命令.
如: 用户可能输入:

“create table t(a int); insert into t values(1);select * from t;”

这样一个字符串, 那么PG接收到该字符串之后进行词法和语法分析的结果就是三个分析树:
CreateStmt, InsertStmt和SelectStmt.

在返回的raw_parsettree_list中就有三个ListCell分别包含上述三个分析树.

5.2.3 语义分析 语义分析干什么的

语义分析阶段会检查命令中是否有不符合语义规定的成分.

如: 所使用的表,属性,过程函数等是否存在,聚集函数(如求和函数SUM,
平均函数AVG等)是否可以合法使用等.

其主要作用在于检查该命令是否可以正确执行.

语义分析相比词法和语法分析阶段的更进之处

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zysxsx.html