自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

让我思考一下

分享数据库等相关内容

  • 博客(165)
  • 资源 (3)
  • 收藏
  • 关注

原创 PostgreSQL源码分析——缓冲区管理器

这里我们分析一下PG数据库缓冲区的代码。缓冲区是十分重要的,对数据库的性能和稳定性有着直接的影响。缓冲区是数据库SQL计算层与外部存储(磁盘)交互的关键。数据页的落盘与读取,都要经过缓冲区。

2024-06-19 13:50:03 1177

原创 PostgreSQL源码分析——数据页校验

我们知道数据库是持久化存储到外存(磁盘)的,而存储介质可能损坏,数据通过IO传输时也有可能传输错误,虽然概率非常低,那么,数据库怎么应对这种情况呢?能否拥有一定的校验能力,检测出这些故障。对此有了数据库数据页校验的能力。

2024-06-19 13:47:47 1128

原创 PostgreSQL源码分析——外存管理

数据库最终都是持久化存储的(除了内存数据库等),持久化就要将数据从内存Buffer落盘到外存。这里分析一下PostgreSQL中外存管理部分的内容。源码在这一部分。

2024-06-19 13:44:25 516

原创 PostgreSQL源码分析——psql

psql是一个PostgreSQL数据库自带的客户端工具,用来与数据库进行交互,当然,你也可以用其他工具。这里,我们简单分析一下psql工具的实现。

2024-06-19 11:06:08 394

原创 PostgreSQL源码分析——pg_archivecleanup

pg_archivecleanup用于清理PostgreSQL WAL归档文件。可参考文档:http://www.postgres.cn/docs/14/pgarchivecleanup.html。

2024-06-19 11:04:35 538

原创 PostgreSQL源码分析——备机回放

前面我们分析了故障恢复的情况,这里,我们分析一下PostgreSQL一主一备,备机回放的流程。主备通过流复制协议进行WAL日志同步,主节点生成WAL日志,通过walwriter写入WAL日志段文件进行持久化保存,然后通知walsender进行发送。walsender将WAL日志通过流复制协议发送到备机,备节点通过walreceiver接收WAL日志,写入备机的pg_wal目录下的WAL日志段文件中,通知startup有新的WAL日志到达,然后startup进程读取WAL日志进行回放。

2024-06-19 10:56:38 497

原创 PostgreSQL源码分析——日志清理

当数据库发生写操作时,会生成WAL日志,比如INSERT操作,那么什么时候会清理日志呢?这里我们分析其删除日志的逻辑。

2024-06-19 10:50:50 512

原创 PostgreSQL源码分析——备份恢复

在上一篇中,我们分析了PG中基础备份的过程以及源码,备份与恢复是不分离的,这里我们继续分析一下,从基础备份中进行恢复的源码。

2024-06-19 10:22:20 422

原创 PostgreSQL源码分析——日志归档

PG中有日志归档功能,主要目的就是备份恢复,PITR,为啥要做日志归档呢?因为在做检查点时会清理WAL日志,清理了之后,就没法实现恢复到任意时刻数据库状态了,而有了日志归档,我们可以保存从数据库初始状态到当前时刻的所有日志,相当于给数据库做了一个备份。当发生故障或者误操作时,可以恢复到指定时刻数据库的状态。

2024-06-19 10:19:39 1103

原创 PostgreSQL源码分析——WAL日志(二)

也就是说,并不是当前事务已写入WAL Buffer就可以直接刷入磁盘了,因为是并发写入WAL Buffer,可能存在其他事务先于本事务预留了空间,也就是前面还有WAL日志没有完成刷入WAL Buffer,此时就不能刷入磁盘,否则会造成WAL日志不完整。日志的写入是并发写入,但是备机进行回放或故障恢复时,是串行回放。到这里,其实并没有真正完成日志的写入,因为只是写入了WAL Buffer中,并没有刷入磁盘中,当事务提交时,需要先调用。一旦事务所占用的空间被预留,则数据复制的过程是可以并发的,通过。

2024-06-19 10:17:36 735

原创 PostgreSQL源码分析——WAL日志(一)

WAL日志对数据库故障恢复,物理备份,事务处理等至关重要,这里我们分析一下WAL日志的相关内容。如果没有WAL日志文件,那么数据库需要在每次更新页面后,刷盘持久化才能提交,频繁的进行刷盘,并且是随机写,而且是整页的写,代价很大。对此,设计了WAL,每次只将对数据页的修改抽象成WAL日志记录,顺序写入WAL日志文件中,这就将随机写变为了顺序写入,并且文件的大小也有所减少,因为绝大部分情况不用整页写入了,减少了刷盘的代价。

2024-06-19 10:15:43 1089

原创 PostgreSQL源码分析——pg_waldump

PG中有个可以打印WAL日志信息的工具,pg_waldump,对于开发人员来说,掌握该工具是十分有必要的。

2024-06-19 10:10:17 464

原创 PostgreSQL源码分析——pg_control

pg_control是PostgreSQL中一个很重要的文件,我们之前讲到过PostgreSQL的启动过程,启动过程中很重要的一项工作就是故障恢复,启动startup进程,回放WAL日志进行故障恢复,而从哪里开始进行回放呢?这个位置的保存一定是在磁盘中,而不是在内存中,假设数据库因故障崩溃,内存中的数据会丢失,所以,只有checkpointer进程在做checkpoint操作时不断的更新pg_control文件,使之持久化保存,数据库启动进行故障恢复时,读取该文件,获得故障恢复的起始位置。

2024-06-19 10:07:27 830

原创 PostgreSQL源码分析——pg_basebackup

涉及到的代码主要在以及中。其实,pg_basebackup工具就是对底层API的封装,其主要过程是相同的,但具体到代码,并不是直接调用的函数,而是通过一些命令的形式,这些特殊的命令定义在中,后面我们会进行分析。

2024-06-19 09:37:53 547

原创 PostgreSQL源码分析——基础备份

进行基础备份有2中方式,可使用pg_basebackup工具或其他备份工具进行备份,另一种是使用底层命令进行基础备份。pg_basebackup等工具其实是封装了底层命令,所以,为了更好的理解基础备份的过程,这里我们使用底层命令进行备份。并分析其中的源码实现。

2024-06-19 09:25:55 816

原创 PostgreSQL源码分析——CREATE SERVER

PostgreSQL源码分析,外部数据包装器

2024-06-18 21:10:13 499

原创 PostgreSQL源码分析——bgwriter

函数中实现的,让我们看一下这个函数。我们前面讲过,一条插入语句的执行过程,先在Buffer中找到空闲页,在页中插入元组,暂不刷盘,而且先构造WAL日志,将WAL日志刷盘,再由后台进程(bgwriter)刷盘。答案是肯定不行,即使bgwriter不进行刷盘,缓冲区也会进行页淘汰,缓冲区大小是有限的,当缓冲区满了时,又需要从磁盘中读数据页到缓冲区中,就必须将缓冲区中的部分页进行淘汰,目前的算法是时钟扫描算法,如果选择淘汰的页是脏页,则需要将脏页进行刷盘,这会导致查询或者更新需要更长的时间,自然性能降低了。

2024-06-18 20:27:41 730

原创 PostgreSQL源码分析——INSERT

这里我们对INSERT语句进行分析, 只分析其宏观过程,具体细节后续再分析。我们就分析下面的语句的执行过程。

2024-06-18 20:25:03 624

原创 PostgreSQL源码分析——COPY

这里postgres中的代码注释写的很明白,另外一点就是在语法解析,语义分析,执行计划生成这块,批量插入相比单条插入也省了很多时间,不用每条插入都执行解析、执行计划生成,只需一次即可,而copy则连计划生成这步都省了,直接批量构造tuple插入表中。函数,我们进行分析,核心流程如下,可以看到,copy from,就是跳过解析,优化,直接进入执行器,提取文件中的数据,构造tuple,每1000 tuple为一批tuple,然后执行table_multi_insert批量插入。我们来分析一下COPY的实现。

2024-06-18 20:21:19 756

原创 PostgreSQL源码分析——物化视图

我们前面分析完后,这里再继续分析一下物化视图,其实现原理是不相同的,需要注意,物化视图等于是将返回的结果集缓存起来,而视图是查询重写,结果需要重新进行计算。

2024-06-18 20:16:36 570

原创 PostgreSQL源码分析——索引扫描

这里,我们分析一下索引扫描的过程,以最简单的语句为例,分析一下查询的过程。

2024-06-18 20:12:39 589

原创 PostgreSQL源码分析——常量表达式化简

常量表达式可以进行化简,可降低执行器计算表达式的代价。在逻辑优化阶段,会判断是否可以进行常量表达式化简,如果可以,则在执行器执行之前就预先对常量表达式树进行计算,计算出常量后,以新计算出的常量表达式代替原有的表达式。当进入执行器时,此时表达式已被替换为常量,避免了在执行器中频繁的计算表达式。可以看到,在逻辑优化阶段,常量表达式已被化简为常量,进入执行器时,表达式树已被替换为常量。除了常量表达式,常量函数也可以在逻辑优化阶段提前执行,计算得到常量,用常量替换原有的函数表达式。,是常量表达式,可以进行化简。

2024-06-18 19:53:13 493

原创 PostgreSQL源码分析——CREATE SCHEMA

这里我们对创建模式的源码进行分析。创建一个schema,主流程如下,需要注意pg_namespace系统表,所有的schema都可在这个系统表中查到,创建一个新的schema,需要向pg_namespace系统表中插入一个数据。插入模式名以及对应的namespace oid的值。所有的模式名都在pg_namespace系统表中。

2024-06-18 19:48:37 371

原创 PostgreSQL源码分析——CREATE DATABASE

这里我们分析一下在PostgreSQL中创建数据库的源码,在分析源码之前,最好先阅读《PostgreSQL指南内幕探索》的第一章,数据库集簇、数据库和数据表,弄清其空间布局,理解PG中,数据库、表、元组是怎么布局的。通俗一点说,创建一个数据库相当于创建一个数据目录,在这个目录下,存放该数据库中定义的表、索引等对象。

2024-06-18 19:39:01 963

原创 PostgreSQL源码分析——SeqScan

这里,我们分析一下顺序扫描的过程,以最简单的语句为例,分析一下查询的过程。

2024-06-18 19:08:41 566

原创 PostgreSQL源码分析——绑定变量

这里分析一下函数中应用绑定变量的问题,但实际应用场景中,不推荐这么使用。

2024-06-18 18:01:38 361

原创 PostgreSQL源码分析 —— CAST类型转换

我们分析一下PostgreSQL中显式类型转换是如何实现的,在PostgreSQL中,显式类型转换可以用等同于。这里我们以为例进行分析。再结合之前对的分析,基本就弄清了一部分PostgreSQL中数据类型转换问题。当然要完整的理解类型转换还需要完整的理解PostgreSQL中的类型系统,后续还需要我们逐步的深入理解。

2024-06-18 17:56:45 1277

原创 PostgreSQL源码分析 —— 除法运算符

我们分析一下在PostgreSQL数据库中,是如何实现除法操作的。其他的运算符操作与之类似。

2024-06-18 17:53:37 645

原创 PostgreSQL源码分析——CREATE TABLE(series)

这里分析一下建表时含有序列的时候PostgreSQL是如何创建的,比如下面的SQL语句。

2024-06-18 15:21:06 484

原创 PostgreSQL源码分析——创建分区表

分区表,可以认为是逻辑上一张表,但实际上是将逻辑上的一张表,分割为了多个物理表,每个物理表是逻辑表中的一部分,组合起来就是一张表。所以在实现分区表时,实际上是创建了多张物理表,但是逻辑上抽象为了一张表。建表后,我们可通过查看pg_class系统表,与分区表相关的字段。

2024-06-18 15:00:15 833

原创 PostgreSQL源码分析——CTE

Postgres支持使用WITH子句的子查询,那么什么是WITH子句呢?如果在一个SQL语句中多次使用同一个子查询,可以通过WITH子句给子查询指定一个名字,从而可以实现通过名字引用该子查询,而不必每次都完整写出该子查询。这一特性常称为CTE(Common Table Expressions)公共表表达式,常用于复杂查询或递归查询应用场景。

2024-06-18 14:52:11 384

原创 PostgreSQL源码分析——视图查询重写

这里我们分析一下查询重写的过程,主要分析视图的查询重写的过程。

2024-06-18 14:48:48 660

原创 PostgreSQL源码分析——CREATE VIEW

我们知道PostgreSQL中的视图其实就是用规则来实现的。创建一个视图时,会按照视图的定义自动创建一个规则。在对视图进行查询时,则用相应的规则将对视图的查询改写成对基表的查询。下面我们将详细分析一下创建视图的源码。

2024-06-18 14:46:19 472

原创 PostgreSQL内核开发——添加内核函数

在PostgreSQL内核的学习过程中,可以尝试向内核中添加一些函数,扩展PostgreSQL的功能。同时可以增加自己对PG内核的理解。这里我们以简单的添加一个helloworld函数为例,分析一下这个过程中涉及到的相关源码。

2024-06-18 14:38:07 883

原创 PostgreSQL源码分析——子连接优化

子查询的逻辑优化内容很多,这里不打算在一篇内容中全部叙述清楚,我们先以这条SQL语句为例分析PostgreSQL对子连接的逻辑优化过程。在往下讲之前,先区别一下子连接与子查询,因为代码中分别会对子连接和子查询进行上拉操作。怎么区别呢?通常,以范围表的方式存在的称为子查询,以表达式的方式存在的称为子连接。实际上也可以通过子句所处的位置来区分子连接和子查询,出现在FROM关键字之后的子句时子查询语句,出现在WHERE等约束条件中的是子连接。我们先通过执行计划进行观察分析,数据库通过对子连接进行了逻辑优化。

2024-06-18 14:33:05 802

原创 PostgreSQL源码分析——表名,列名的长度限制实现

在PostgreSQL中,表名,列名长度是有限制的,不能任由客户端定义无限长的名称,这个长度限制被限制在63字符长度,超过的部分会被truncate掉,只保留63个字符长度。我们看一下其源码是怎么实现的。如果是你自己实现这个限制,你会怎么做呢?肯定是先想好限制的长度,然后定义一个常量,在某个地方进行判断,超过这个常量的长度就进行截断处理。是的,这个思路没有错,PostgreSQL是在中定义了标识符的最大命名长度64,因为包含一个\0,所以,实际上的最大长度是63。64下一个问题就是,在哪里做这个判断呢?

2024-06-18 14:28:42 506

原创 PostgreSQL源码分析——CREATE CAST

语句自定义一个类型转换,数据库肯定有个地方将这个转换的信息存起来,这个地方就是pg_cast系统表。pg_cast系统表存在数据类型转换路径,包括内建和用户自定义的。函数的主要内容就是将用户自定义的类型转换信息插入到pg_cast系统表中。下面我们主要分析一下其源码,看一下是如何实现的。我们首先分析一下其语法解析部分,这部分比较简单,核心是。如何使用以及用法请参考PostgreSQL文档中。后续会重点分析一下这个函数。—— 定义一个用户自定义的类型转换。非常容易理解,下面我们重点分析一下。

2024-06-18 14:25:36 457

原创 PostgreSQL源码分析——CREATE TYPE

定义一个复合类型某种程度上就是定义一张新的表,表的rowtype就是复合类型。会看到创建一个复合类型的同时会创建一个同名的表。这个表可以在pg_class系统表中查到,但是通过\d等却查不到,也不能想表中插入数据,因为它并不是真正意义上的表,只是用表实现复合类型。这部分因为不是可优化语句,没有什么处理。这部分因为是Utility语句,没有什么处理的。创建复合类型,我们分析一下其源码实现。

2024-06-18 14:22:44 484

原创 PostgreSQL源码分析——基础备份

进行基础备份有2中方式,可使用pg_basebackup工具或其他备份工具进行备份,另一种是使用底层命令进行基础备份。pg_basebackup等工具其实是封装了底层命令,所以,为了更好的理解基础备份的过程,这里我们使用底层命令进行备份。并分析其中的源码实现。

2024-06-18 14:15:03 591

原创 PostgreSQL源码分析 —— 范围表

这里单独分析一下Postgres中的范围表。当我们需要到数据库中查询某些数据时,一般需要通过查一张表,然后返回表中的数据,比如,这里的表t1就可以理解为范围表。除了可以从表中返回数据,我们还可以是从子查询,函数,Values等返回查询数据。

2024-06-18 12:18:12 644

PCB走线策略,适合大学同学参考学习使用。

PCB走线策略,非常适合刚开始画板子的同学学习一下,会非常有收获。

2016-07-17

直方图均衡化

直方图均衡化代码

2016-07-15

基于DSP的人眼定位系统

基于DSP的人眼定位系统。有详细代码设计及详细的说明文档及关键算法说明

2016-07-15

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除