PostgreSQL系统概述

目录

写在前面

1.简介

1.1何为关系型数据库

1.2何为对象型数据库

2.特性

3.代码结构

3.1数据库集簇

3.2Parser查询分析流程

3.3内部查询树组成部分

3.3.1目标列表

3.4Optimizer查询优化流程

3.4.1查询计划

3.5非计划查询的SQL命令


 写在前面

如有错误请指正,谢谢各位!!

1.简介

PostgreSQL是一种对象 - 关系数据库管理系统(ORDBMS),支持关系型数据库的功能及具备对象数据库的特征。

1.1何为关系型数据库

关系型数据库是指根据关系模型来创建的数据库。关系模型可以看成是一个二维表格模型。

1.2何为对象型数据库

具备类、继承等面向对象程序设计语言的特征。

2.特性

(1)开放特性:有着丰富的数据类型,如任意精度的数值、无限制长度的文本、几何图元、IP地址、数组等;同时还允许用户定义基于正规SQL类型的新类型,让数据库自身理解复杂数据,自定义类型中还可以包含继承关系。用户可以为数据库内几乎所有的对象定义新的类型,如索引、操作符(可重载现有操作符)、聚集函数、数据域、数据类型转换、会话(编码转换)等。

(2)可编程性:提供编程接口,如ODBC、JDBC(Java)、Libpq(C/C++)等。

(3)可定制性:编程语言,包括内置的PL/pgSQL过程语言,PL/Perl、plPHP、PL/Python、PL/Ruby、PL/Tcl等脚本语言,以及Java、C/C++等高级编程语言。

(4)索引手段

  a.自定义索引

  b.内置B-Tree索引、Hash表索引、GiST索引、GIN索引

  c.反向索引检索、表达式索引、部分索引、位图索引扫描

(5)多种身份认证方式:PostgreSQL中可以使用数据库用户/角色、操作系统、PAM、Kerberos等方式,根据主机配置文件(pg_hba.conf)中的设置执行对应的身份认证。 

3.代码结构

  • Bootstrap支持Bootstrap运行模式,该模式主要用于创建初始模板数据库

        本人认为这个模块类似于操作系统的引导块,在初始化数据库时,它相当于一个初始化程序。

  • Initdb:初始化数据库集簇,在指定目录下创建base目录,从而初始化一个新的数据库集簇。
  • Main:主程序模块,负责将控制权转交给Postmaster进程或Posrgres进程。
  • Postmaster:不停循环监听用户端口,fork多个不同的子进程Postgres。
  • LibpqC/C++库函数,处理与Client间的通信。
  • TcopServer进程的主要处理部分,调用ParserOptimizer、ExecutorCommands中的函数执行Client提交的查询。
  • Parser:编译器,SQL查询命令--(词法和语法分析)--> 分析树   --(语义分析)-->内部查询树。
  • Optimizer:优化器,查询树→创建最优查询路径&&查询计划。
  • Executor:执行器,执行Optimizer的查询计划Commands:执行非计划查询的SQL命令。
  • Catalog:系统表操作
  • Storage:管理各种类型的存储系统
  • Access:提供各种存取方法
  • Nodes:定义系统内部的节点、链表结构,及处理函数,等价于一个数据结构
  • Utils:各种支持函数
  • Regex:正则表达式库及其相关函数
  • Rewirte:据规则系统对查询进行重写
  • TSearch:全文检索
  • Psql:数据库交互工具
  • Port:平台兼容性处理相关函数

3.1数据库集簇

        数据库集簇(database cluster)是一组数据库的集合,由一个PostgreSQL服务器管理,其本质上是一个文件目录。

3.2Parser查询分析流程

  1. exec_simple_query函数(在src/backend/tcop/postgres.c下)调用pg_parse_query函数进入词法分析和语法分析的主过程,函数pg_parse_query再调用词法分析和语法分析的入口函数raw_parser生成分析树。
  2. pg_parse_query函数返回分析树(raw_parsetree_list)给exec_simple_query。
  3. exec_simple_query函数调用函数pg_analyze_and_rewrite进行语义分析(调用parse_analyze函数,返回查询树)和查询重写(调用pg_rewrite_query函数)。
  4. 返回查询树链表给exec_simple_query。

3.3内部查询树组成部分

  1. 命令类型:哪种命令(SELECT、INSERT、UPDATE)产生了查询树。
  2. 范围表:被使用在此查询的关系的列表(SELECT语句的范围表为from后给出的关系)。
  3. 结果关系:一个指向范围表的索引,它标识了该查询的结果应该去哪个关系(DELETE、INSERT等命令的结果关系是要进行修改的表或者视图)。
  4. 目标列表:一个表达式的列表,定义了查询的结果。表达式可以是常值、指向范围表中关系的列的变量、参数或者是一个由函数调用、常量、变量、操作符等构成的表达式树。
  5. 条件:表达式,结果值是一个bool值,判断该命令是否执行。(SQL语句中的WHERE子句)
  6. 连接树:多个数据表连接时,执行过程可表示为树形结构。

3.3.1目标列表

  1. SELECT:目标列表的表达式构建出SELECT查询的最终输出。对应select和from之间的表达式。
  2. UPDATE:目标列表描述要替换旧行的新行。规则器会处理缺失的列,做法是为其插入表达式,作用是把旧行的值复制到新行。
  3. INSERT:目标列表描述了将要进入结果关系的新行。
  4. DELETE:因为不产生任何结果,所以不需要目标列表。

3.4Optimizer查询优化流程

  1. 查询重写:系统会根据一些规则和规范,对查询树进行重写和优化。包括条件推导、子查询转换、逻辑优化等操作,以提高查询的效率和准确性。
  2. 成本估算:根据查询树和统计信息,估计每种可能的执行计划的成本。成本通常衡量了执行时间、磁盘和内存访问等方面的开销。
  3. 执行计划生成:基于估算的成本和可行性,查询优化器会生成多个候选执行计划。
  4. 成本评估和选择:对于每个候选执行计划,查询优化器会再次评估其成本,并选择成本最低的执行计划作为最终的查询计划。
  5. 查询计划执行:最终选择的查询计划会用于执行查询,并返回结果。

3.4.1查询计划

查询计划是数据库引擎根据查询语句和相关信息生成的,指导数据库系统如何处理查询以获取结果,描述了执行查询的具体步骤和顺序,以及涉及的数据访问和操作方式。

  1. 访问方法:描述如何从表中获取需要的数据行,可能包括顺序扫描、索引扫描、位图扫描等。
  2. 连接方法:描述如何进行表之间的连接操作,可能包括嵌套循环连接、哈希连接、排序合并连接等。
  3. 筛选条件:描述在执行过程中需要进行的数据筛选操作。
  4. 排序方式:描述如何对结果进行排序,可能包括使用索引排序、内存排序或外部排序等。
  5. 聚合操作:描述如何进行分组和聚合操作,如计算平均值、求和、最大值等。

3.5非计划查询的SQL命令

非计划查询的 SQL 命令包括不需要生成查询计划的操作或不会被查询优化器优化的操作。需要执行数据库对象的定义、修改和管理操作。

  1. DDL(数据定义语言)命令:DDL 命令用于创建、修改和删除数据库对象,如创建表、修改表结构、创建索引、删除表等。这些操作不涉及实际的数据查询和操作,因此不需要生成查询计划。
  2. 事务控制命令:事务控制命令(如 BEGIN、COMMIT、ROLLBACK)用于管理数据库事务的提交和回滚。这些命令只涉及事务管理,而不是实际的数据查询和操作。
  3. 系统管理命令:系统管理命令(如 SET、SHOW)用于设置和获取数据库系统的配置参数和状态信息。这些命令主要用于管理和监控数据库系统,而不是进行实际的数据查询和操作。
  4. 列值列表(Value List):列值列表语法用于向表中插入特定的值,而不是从表中进行查询。例如,INSERT INTO 表名 VALUES (值1, 值2, ...)。
  5. 视图定义命令:创建视图(CREATE VIEW)或修改视图(ALTER VIEW)的命令不需要进行实际的数据查询计划,而是定义和修改视图的查询逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/54706.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET Core 实现日志打印输出在控制台应用程序中

在本文中,我们将探讨如何在 .NET Core 应用程序中将日志消息输出到控制台,从而更好地了解应用程序的运行状况。 .NET Core 实现日志打印输出在控制台应用程序中 在 .NET Core 中,日志输出打印是使用 Microsoft.Extensions.Logging 命名空间…

【LeetCode-面试经典150题-day14】

目录 19.删除链表的倒数第N个结点 82.删除排序链表中的重复元素Ⅱ 61. 旋转链表 86.分隔链表 146.LRU缓存 19.删除链表的倒数第N个结点 题意: 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 【输入样例】head [1,2,3,4,5…

图形的透视矫正

概述 透视矫正是一种图像处理技术,用于将拍摄或者扫描得到的图像进行透视变换,以矫正不正确的形状和视角,从而得到正确的矩形形状。这一过程需要使用透视变换算法和线性插值技术。 在透视矫正的应用场景中,机器学习、深度学习等…

element-ui里el-table表格操作列多横线怎么解决

错误展示 错误原因 在vue中封装了element-ui表格,然后使用插槽,fixed定位等,导致样式出现了错乱 解决方案 1、线没有对齐 /* Element-UI 的table 组件出现表格线条不对齐的问题 */ body .el-table th.gutter {display: table-cell !impor…

基于MATLAB开发AUTOSAR软件应用层Code mapping专题-part 5 Signal/States标签页介绍

这一篇我们说下signals和State这两个怎么搞做映射,那首先我们要知道什么是Signal和state,我们看下模型, 在原来的模型里我增加了标红的圆圈处delay模块,这个delay模块就是一个state模块,表示离散的一个状态,这个是个模型的基本概念,后续我有个专栏交接simulink建模,那…

专题:平面、空间直线参数方程下的切线斜率问题

本文研究平面、空间直线在参数方程形式下,切线斜率(即导数)如何表示的问题。 如上图所示。 设 y f ( x ) , x φ ( t ) , y ψ ( t ) 当 t t 0 时, x x 0 , y y 0 ,即点 A 坐…

为Claude的分析内容做准备:提取PDF页面内容的简易应用程序

由于Claude虽然可以分析整个文件,但是对文件的大小以及字数是有限制的,为了将pdf文件分批传入Claude人工智能分析和总结文章内容,才有了这篇博客: 在本篇博客中,我们将介绍一个基于 wxPython 和 PyMuPDF 库编写的简易的…

【电路设计】单节锂电池使用

前言 最近在研究如何利用单节锂电池给3.3V单片机供电。 找到两个比较好的教程 单节锂电池如何转3.3V?升压还是降压? 锂电池接了保护板,就可以用五伏电压直接充电了吗? 其中上面提到的LDO,这里有一个型号&#xff1…

【校招VIP】测试专业课之TCP/IP模型

考点介绍: 大厂测试校招面试里经常会出现TCP/IP模型的考察,TCP/IP协议是网络基础知识,但是在校招面试中很多同学在基础回答中不到位,或者倒在引申问题里,就丢分了。 『测试专业课之TCP/IP模型』相关题目及解析内容可点…

git基本使用

1、创建仓库,提交代码 Git 全局设置: git config --global user.name "许歌" //全局绑定用户名 git config --global user.email "12075507xu-ge111user.noreply.gitee.com" //全局绑定邮箱创建 git 仓库: mkdir t…

TypeScript数组和对象的操作

TypeScript数组和对象的操作 一、数组的声明二、数组初始化三、数组元素赋值、添加、更改四、删除五、合并、断开数组六、查找数组元素位置七、连接数组元素八、排序、反序数组九、遍历请看这里 一、数组的声明 let arr1: Array<number>; let arr2: number[];二、数组初…

Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required

项目场景&#xff1a; 最近因为公司业务需要在搭一个新架构&#xff0c;用的springboot3和jdk17,在整合mybatis多数据源的时候报错 &#xff08;引用的mybatisplus 和 mybatisplusjion的是最新的包-2023-08-26&#xff09; Error creating bean with name ‘XXXServiceImpl’:…

有限与无限游戏 | 真北荐书

2023佛山敏捷之旅暨DevOps Meetup志愿者为进行大会的组织与准备&#xff0c;每周三晚有一个例会。 例会前等人的时间&#xff0c;涌现出一个小的分享环节。今天分享这本书&#xff1a;《有限与无限游戏》。 大家选择成为志愿者&#xff0c;是一个无限游戏。而组织活动和完成各种…

一文讲清楚c/c++中的宏

一文讲清楚c/c中的宏 文章目录 一文讲清楚c/c中的宏一、如何理解这个“宏”字面的意思呢&#xff1f;二、c/c中的宏详解三、宏的使用场景 一、如何理解这个“宏”字面的意思呢&#xff1f; 在刚开始学习C语言的时候&#xff0c;始终有点分不清楚"宏"这个字面上的意思…

设计模式-责任链模式

原理和实现 将这些接收对象串成一条链&#xff0c;并沿着这条链传递这个请求&#xff0c;直到链上的某个接收 对象能够处理它为止&#xff0c;实时上&#xff0c;在常见的使用场景中&#xff0c;我们的责任链并不是和概念中的完全一样 ● 原始概念中&#xff0c;是直到链上的某…

Python|OpenCV-读取视频,显示视频并保存视频(3)

前言 本文是该专栏的第3篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 在使用OpenCV处理视频的时候,不论是摄像头画面还是视频文件,通常情况下都要使用VideoCapture类来进行每一帧图像的处理。对于OpenCV而言,只要使用视频文件作为参数,它就可以打开视频文件…

在前端开发中,什么叫移动设备上的视口?如何通过header标签中的meta属性设置页面的视口。

移动设备上的视口&#xff08;Viewport&#xff09;是指在移动设备上可见的网页区域。由于移动设备的屏幕尺寸和分辨率各不相同&#xff0c;为了确保网页在各种设备上都能正确显示和交互&#xff0c;需要通过视口设置来适配不同的屏幕尺寸。 在移动设备上&#xff0c;网页通常…

Qt XML文件解析 QDomDocument

QtXml模块提供了一个读写XML文件的流&#xff0c;解析方法包含DOM和SAX,两者的区别是什么呢&#xff1f; DOM&#xff08;Document Object Model&#xff09;&#xff1a;将XML文件保存为树的形式&#xff0c;操作简单&#xff0c;便于访问。 SAX&#xff08;Simple API for …

SpringBoot2.0集成WebSocket

<!-- websocket --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency> 新建配置类 import org.springframework.boot.autoconfigure.condition.Cond…

视频监控/视频集中存储/云存储平台AI智能分析网关V3——功能简介

安防监控/视频集中存储/云存储平台AI智能分析网关V3内置了20多种AI算法&#xff0c;可针对安全生产、通用园区、智慧食安、石油化工等场景&#xff0c;提供基于视频智能检测技术的个性化行业解决方案。今天来具体介绍下v3版本的智能分析网关有哪些算法功能配置。 一、硬件 安防…