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。
- Libpq:C/C++库函数,处理与Client间的通信。
- Tcop:Server进程的主要处理部分,调用Parser、Optimizer、Executor和Commands中的函数执行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查询分析流程
- exec_simple_query函数(在src/backend/tcop/postgres.c下)调用pg_parse_query函数进入词法分析和语法分析的主过程,函数pg_parse_query再调用词法分析和语法分析的入口函数raw_parser生成分析树。
- pg_parse_query函数返回分析树(raw_parsetree_list)给exec_simple_query。
- exec_simple_query函数调用函数pg_analyze_and_rewrite进行语义分析(调用parse_analyze函数,返回查询树)和查询重写(调用pg_rewrite_query函数)。
- 返回查询树链表给exec_simple_query。
3.3内部查询树组成部分
- 命令类型:哪种命令(SELECT、INSERT、UPDATE)产生了查询树。
- 范围表:被使用在此查询的关系的列表(SELECT语句的范围表为from后给出的关系)。
- 结果关系:一个指向范围表的索引,它标识了该查询的结果应该去哪个关系(DELETE、INSERT等命令的结果关系是要进行修改的表或者视图)。
- 目标列表:一个表达式的列表,定义了查询的结果。表达式可以是常值、指向范围表中关系的列的变量、参数或者是一个由函数调用、常量、变量、操作符等构成的表达式树。
- 条件:表达式,结果值是一个bool值,判断该命令是否执行。(SQL语句中的WHERE子句)
- 连接树:多个数据表连接时,执行过程可表示为树形结构。
3.3.1目标列表
- SELECT:目标列表的表达式构建出SELECT查询的最终输出。对应select和from之间的表达式。
- UPDATE:目标列表描述要替换旧行的新行。规则器会处理缺失的列,做法是为其插入表达式,作用是把旧行的值复制到新行。
- INSERT:目标列表描述了将要进入结果关系的新行。
- DELETE:因为不产生任何结果,所以不需要目标列表。
3.4Optimizer查询优化流程
- 查询重写:系统会根据一些规则和规范,对查询树进行重写和优化。包括条件推导、子查询转换、逻辑优化等操作,以提高查询的效率和准确性。
- 成本估算:根据查询树和统计信息,估计每种可能的执行计划的成本。成本通常衡量了执行时间、磁盘和内存访问等方面的开销。
- 执行计划生成:基于估算的成本和可行性,查询优化器会生成多个候选执行计划。
- 成本评估和选择:对于每个候选执行计划,查询优化器会再次评估其成本,并选择成本最低的执行计划作为最终的查询计划。
- 查询计划执行:最终选择的查询计划会用于执行查询,并返回结果。
3.4.1查询计划
查询计划是数据库引擎根据查询语句和相关信息生成的,指导数据库系统如何处理查询以获取结果,描述了执行查询的具体步骤和顺序,以及涉及的数据访问和操作方式。
- 访问方法:描述如何从表中获取需要的数据行,可能包括顺序扫描、索引扫描、位图扫描等。
- 连接方法:描述如何进行表之间的连接操作,可能包括嵌套循环连接、哈希连接、排序合并连接等。
- 筛选条件:描述在执行过程中需要进行的数据筛选操作。
- 排序方式:描述如何对结果进行排序,可能包括使用索引排序、内存排序或外部排序等。
- 聚合操作:描述如何进行分组和聚合操作,如计算平均值、求和、最大值等。
3.5非计划查询的SQL命令
非计划查询的 SQL 命令包括不需要生成查询计划的操作或不会被查询优化器优化的操作。需要执行数据库对象的定义、修改和管理操作。
- DDL(数据定义语言)命令:DDL 命令用于创建、修改和删除数据库对象,如创建表、修改表结构、创建索引、删除表等。这些操作不涉及实际的数据查询和操作,因此不需要生成查询计划。
- 事务控制命令:事务控制命令(如 BEGIN、COMMIT、ROLLBACK)用于管理数据库事务的提交和回滚。这些命令只涉及事务管理,而不是实际的数据查询和操作。
- 系统管理命令:系统管理命令(如 SET、SHOW)用于设置和获取数据库系统的配置参数和状态信息。这些命令主要用于管理和监控数据库系统,而不是进行实际的数据查询和操作。
- 列值列表(Value List):列值列表语法用于向表中插入特定的值,而不是从表中进行查询。例如,INSERT INTO 表名 VALUES (值1, 值2, ...)。
- 视图定义命令:创建视图(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命令 写在前面 如有错误请指正…...
掌握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集成文档具有功能丰富、及时更新、整合简单,内嵌于应用的特点。 由于后台管理和前台接口均需要接口文档,所以在工具包构建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驱动的大数据创新:探索软件开发中的机会和挑战
文章目录 机会数据驱动的决策自动化和效率提升智能预测和优化个性化体验 挑战数据隐私与安全技术复杂性数据质量和清洗伦理和社会问题 案例:智能代码生成工具总结 🎈个人主页:程序员 小侯 🎐CSDN新晋作者 🎉欢迎 &…...
国产化-银河麒麟V10系统及docker的安装
一、最近在研究国产化操作系统,“银河麒麟V10”, 在我电脑本机vmware 15的虚拟机中进行安装测试; 1.点击这里提交产品试用申请,不过只需要随便输入,手机号验证码验证后方可跳转至下载地址产品试用申请国产操作系统、银…...
计算机毕设 基于机器视觉的二维码识别检测 - opencv 二维码 识别检测 机器视觉
文章目录 0 简介1 二维码检测2 算法实现流程3 特征提取4 特征分类5 后处理6 代码实现5 最后 0 简介 今天学长向大家介绍一个机器视觉的毕设项目,二维码 / 条形码检测与识别 基于机器学习的二维码识别检测 - opencv 二维码 识别检测 机器视觉 1 二维码检测 物体检…...
Redis原理剖析
一、Redis简介 Redis是一个开源的,基于网络的,高性能的key-value数据库,弥补了memcached这类key-value存储的不足,在部分场合可以对关系数据库起到很好的补充作用,满足实时的高并发需求。 Redis跟memcached类似&#…...
【送书活动】AI时代,程序员需要焦虑吗?
前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄,vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄ÿ…...
什么是 JSON:理解和运用 JSON 的基本概念
现在程序员还有谁不知道 JSON 吗?无论对于前端还是后端,JSON 都是一种常见的数据格式。那么 JSON 到底是什么呢? JSON 的定义 JSON (JavaScript Object Notation) ,是一种轻量级的数据交换格式。它的使用…...
CSDN每日一练 |『异或和』『生命进化书』『熊孩子拜访』2023-08-27
CSDN每日一练 |『异或和』『生命进化书』『熊孩子拜访』2023-08-27 一、题目名称:异或和二、题目名称:生命进化书三、题目名称:熊孩子拜访 一、题目名称:异或和 时间限制:1000ms内存限制:256M 题目描述&…...
整数拆分乘积最大
将一个整数拆分为若干个自然数的和,如果要使这些数的乘积最大,应该尽可能的拆分出3。 任意一个数字可以由多个3的n次方的和(差)表示。 import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改public class M…...
浅谈 Linux 下 vim 的使用
Vim 是从 vi 发展出来的一个文本编辑器,其代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。 Vi 是老式的字处理器,功能虽然已经很齐全了,但还有可以进步的地方。Vim 可以说是程序开发者的一项很好用的工…...
leetcode:只出现一次的数字Ⅲ(详解)
题目: 给你一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。 你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。 示例 1&…...
【vue3.0 使用组合式定义组件】
Vue3.0 中通过使用 setup 函数来定义组件。setup 函数接收两个参数,第一个参数是组件的 props,第二个参数是一个上下文对象,可以通过它访问到与组件相关的数据和方法。在 setup 函数中,我们可以使用 Vue3.0 提供的新特性 — 组合式…...
Tensor-动手学深度学习-李沐_笔记
介绍 Tensor,又称"张量",其实就是n维度数组。不同维度的Tensor示意图如下: 关于Tensor.reshape reshape函数可以处理总元素个数相同的任何新形状,【3,2,5】->【3,10】->【5&a…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...
链式法则中 复合函数的推导路径 多变量“信息传递路径”
非常好,我们将之前关于偏导数链式法则中不能“约掉”偏导符号的问题,统一使用 二重复合函数: z f ( u ( x , y ) , v ( x , y ) ) \boxed{z f(u(x,y),\ v(x,y))} zf(u(x,y), v(x,y)) 来全面说明。我们会展示其全微分形式(偏导…...
