当前位置: 首页 > news >正文

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)的命令不需要进行实际的数据查询计划,而是定义和修改视图的查询逻辑。

相关文章:

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命令 写在前面 如有错误请指正&#xf…...

掌握AI助手的魔法工具:解密Prompt(提示)在AIGC时代的应用「中篇」

文章目录 掌握AI助手的魔法工具:解密Prompt(提示)在AIGC时代的应用「中篇」一、指南原则1: 使用明确和具体的指令原则2: 给模型思考的时间 二、迭代三、总结与提取四、局限与改善五、总结 掌握AI助手的魔法工具:解密Prompt&#x…...

git svn:使用 git 命令来管理 svn 仓库

git-svn 使用教程 参考以下: https://cloud.tencent.com/developer/article/1415892 # 在SVN仓库上使用Git 源 https://blog.csdn.net/jiejie11080/article/details/106917116 # git svn clone速度慢的解决办法 http://blog.chinaunix.net/uid-11639156-id-30774…...

软考高级系统架构设计师系列论文九十一:论分布式数据库的设计与实现

软考高级系统架构设计师系列论文九十一:论分布式数据库的设计与实现 一、分布式数据库相关知识点二、摘要三、正文四、总结一、分布式数据库相关知识点 软考高级系统架构设计师系列之:分布式存储技术...

GeoHash之存储篇

前言: 在上一篇文章GeoHash——滴滴打车如何找出方圆一千米内的乘客主要介绍了GeoHash的应用是如何的,本篇文章我想要带大家探索一下使用什么样的数据结构去存储这些Base32编码的经纬度能够节省内存并且提高查询的效率。 前缀树、跳表介绍: …...

后端项目开发:集成接口文档(swagger-ui)

swagger集成文档具有功能丰富、及时更新、整合简单&#xff0c;内嵌于应用的特点。 由于后台管理和前台接口均需要接口文档&#xff0c;所以在工具包构建BaseSwaggerConfig基类。 1.引入依赖 <dependency><groupId>io.springfox</groupId><artifactId>…...

代码随想录训练营29天|●* 491.递增子序列 * 46.全排列 * 47.全排列 II

class Solution {vector<vector<int>>res;vector<int>vec;void backing(vector<int>& nums,int index){if(vec.size()>2&&is(vec)){res.push_back(vec);}unordered_set<int> uset; // 使用set对本层元素进行去重for(int iindex;i…...

uniapp日期选择组件优化

<uni-forms-item label="出生年月" name="birthDate"><view style="display: flex;flex-direction: row;align-items: center;height: 100%;"><view class="" v-...

AI驱动的大数据创新:探索软件开发中的机会和挑战

文章目录 机会数据驱动的决策自动化和效率提升智能预测和优化个性化体验 挑战数据隐私与安全技术复杂性数据质量和清洗伦理和社会问题 案例&#xff1a;智能代码生成工具总结 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &…...

国产化-银河麒麟V10系统及docker的安装

一、最近在研究国产化操作系统&#xff0c;“银河麒麟V10”&#xff0c; 在我电脑本机vmware 15的虚拟机中进行安装测试&#xff1b; 1.点击这里提交产品试用申请&#xff0c;不过只需要随便输入&#xff0c;手机号验证码验证后方可跳转至下载地址产品试用申请国产操作系统、银…...

计算机毕设 基于机器视觉的二维码识别检测 - opencv 二维码 识别检测 机器视觉

文章目录 0 简介1 二维码检测2 算法实现流程3 特征提取4 特征分类5 后处理6 代码实现5 最后 0 简介 今天学长向大家介绍一个机器视觉的毕设项目&#xff0c;二维码 / 条形码检测与识别 基于机器学习的二维码识别检测 - opencv 二维码 识别检测 机器视觉 1 二维码检测 物体检…...

Redis原理剖析

一、Redis简介 Redis是一个开源的&#xff0c;基于网络的&#xff0c;高性能的key-value数据库&#xff0c;弥补了memcached这类key-value存储的不足&#xff0c;在部分场合可以对关系数据库起到很好的补充作用&#xff0c;满足实时的高并发需求。 Redis跟memcached类似&#…...

【送书活动】AI时代,程序员需要焦虑吗?

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…...

什么是 JSON:理解和运用 JSON 的基本概念

现在程序员还有谁不知道 JSON 吗&#xff1f;无论对于前端还是后端&#xff0c;JSON 都是一种常见的数据格式。那么 JSON 到底是什么呢&#xff1f; JSON 的定义 JSON &#xff08;JavaScript Object Notation&#xff09; &#xff0c;是一种轻量级的数据交换格式。它的使用…...

CSDN每日一练 |『异或和』『生命进化书』『熊孩子拜访』2023-08-27

CSDN每日一练 |『异或和』『生命进化书』『熊孩子拜访』2023-08-27 一、题目名称&#xff1a;异或和二、题目名称&#xff1a;生命进化书三、题目名称&#xff1a;熊孩子拜访 一、题目名称&#xff1a;异或和 时间限制&#xff1a;1000ms内存限制&#xff1a;256M 题目描述&…...

整数拆分乘积最大

将一个整数拆分为若干个自然数的和&#xff0c;如果要使这些数的乘积最大&#xff0c;应该尽可能的拆分出3。 任意一个数字可以由多个3的n次方的和&#xff08;差&#xff09;表示。 import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改public class M…...

浅谈 Linux 下 vim 的使用

Vim 是从 vi 发展出来的一个文本编辑器&#xff0c;其代码补全、编译及错误跳转等方便编程的功能特别丰富&#xff0c;在程序员中被广泛使用。 Vi 是老式的字处理器&#xff0c;功能虽然已经很齐全了&#xff0c;但还有可以进步的地方。Vim 可以说是程序开发者的一项很好用的工…...

leetcode:只出现一次的数字Ⅲ(详解)

题目&#xff1a; 给你一个整数数组 nums&#xff0c;其中恰好有两个元素只出现一次&#xff0c;其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。 你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。 示例 1&…...

【vue3.0 使用组合式定义组件】

Vue3.0 中通过使用 setup 函数来定义组件。setup 函数接收两个参数&#xff0c;第一个参数是组件的 props&#xff0c;第二个参数是一个上下文对象&#xff0c;可以通过它访问到与组件相关的数据和方法。在 setup 函数中&#xff0c;我们可以使用 Vue3.0 提供的新特性 — 组合式…...

Tensor-动手学深度学习-李沐_笔记

介绍 Tensor&#xff0c;又称"张量"&#xff0c;其实就是n维度数组。不同维度的Tensor示意图如下&#xff1a; 关于Tensor.reshape reshape函数可以处理总元素个数相同的任何新形状&#xff0c;【3&#xff0c;2&#xff0c;5】->【3&#xff0c;10】->【5&a…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...

Java并发编程实战 Day 11:并发设计模式

【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天&#xff0c;今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案&#xff0c;它们不仅提供了优雅的设计思路&#xff0c;还能显著提升系统的性能…...