自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(171)
  • 收藏
  • 关注

原创 【PGCCC】pg_squeeze 1.8:自动表膨胀清理的扩展

PostgreSQL 扩展可从表中删除未使用的空间,并可选择根据特定索引对元组进行排序(就像CLUSTER命令与常规读取/写入同时执行一样)。事实上,我们尝试替换 pg_repack扩展。虽然 (1) 使配置和使用都更简单(与使用服务器和客户端代码的pg_repack相比 ),但它还允许使用后台工作者相当顺利地实现无人值守处理。至于 (2),一个重要的区别(除了使用后台工作者之外)是我们使用逻辑解码而不是触发器来捕获并发变化。

2025-02-13 10:20:05 751

原创 【PGCCC】commit_delay 对性能的提升:PostgreSQL 基准测试

通过禁用参数可以来调整事务工作负载synchronous_commit。该措施有惊人效果。但在操作系统崩溃期间丢失已提交事务的可能性使其成为许多应用程序无法启动的因素。因此我决定写下来。

2025-02-10 16:03:05 792

原创 【PGCCC】在 PostgreSQL 上使用 pg_hint_plan替换 Oracle Hints 的最佳实践

如果您要从 Oracle 数据库迁移到 PostgreSQL,您可能习惯于使用提示来优化查询。在 Oracle 中,这些是嵌入在 SQL 中的特殊指令(如/*+ INDEX(…) */),用于指导优化器的执行计划。它们可能非常有用,但随着时间的推移也会引入复杂性和“提示债务”。PostgreSQL 采用了一种截然不同的查询优化方法。Postgres 社区历来强调依靠基于成本的规划器来根据统计数据、索引和配置参数选择执行计划,而不是支持内置提示。在实践中,这种方法很多时候都有效,但有时规划器会很固执,不断选择

2025-02-08 10:00:34 753

原创 【PGCCC】表级锁剖析:减少锁定影响

我之前撰写有关的博客。在这篇博客中,我们讨论了数据库系统使用锁定机制的原因以及 Postgres 如何利用 MVCC 来避免大多数并发问题,从而减少锁定的必要性。然后我们讨论了 DDL 锁,并解释了 Postgres 锁队列的工作原理。在这篇后续文章中,我们将讨论锁争用,以探索减少生产系统中锁定影响的方法,以减少与 DDL 更改相关的潜在停机风险。

2025-02-06 15:27:21 685

原创 【PGCCC】用于全文搜索的全新 Postgres 块存储布局

块存储的基本单位是块:8192 字节的块。执行查询时,Postgres 将块读入缓冲区,这些缓冲区存储在 Postgres 的缓冲区缓存中。DML(INSERT、、、 )语句不会修改物理块。相反,UPDATE它们的更改会写入底层缓冲区,这些缓冲区稍后会在从缓冲区缓存中逐出或在检查点期间刷新到磁盘。DELETECOPY如果 Postgres 崩溃,对尚未刷新的缓冲区的修改可能会丢失。为了防止这种情况,对索引的任何更改都必须写入预写日志 (WAL)。

2025-02-05 11:39:50 783

原创 【PGCCC】PostgreSQL 中表级锁的剖析

PostgreSQL 使用多版本并发控制 (MVCC)来避免传统上与数据库相关的许多锁定问题。写入数据的新副本而不是修改行。确保读取不会阻塞写入,并且写入不会阻塞读取。当事务更新数据时,Postgres 会创建行的新版本,同时保留旧版本。

2025-01-21 15:51:16 1134

原创 【PGCCC】空闲事务导致表膨胀?等等,什么?

当未使用或过时的数据(称为死元组)在表和索引中累积时,PostgreSQL中的表就会膨胀。PostgreSQL使用多版本并发控制(MVCC)机制来维护数据一致性。每次更新或删除都会创建一行的新版本,而旧版本则会保留,直到通过自动清理过程或手动清理将其清理干净。当这些死元组堆积起来且未被移除时,膨胀就会成为问题,从而增加表和索引的大小。表越大,查询速度越慢,导致数据库性能下降和存储成本增加。

2025-01-20 13:40:32 685

原创 【PGCCC】PostgreSQL 事务及其使用方法

简单来说,事务就是对数据库中任何更改的传播。假设您向数据库添加了一个新元素 — 这是事务的一个例子。事务不一定只是单一更改,而是可以包含一个或多个操作。在实际应用中,事务通常是各种数据库操作的组合。关于 PostgreSQL 事务,需要注意的重要一点是它们符合ACID标准。这意味着它们是一致的、原子的、持久的和隔离的。事务是一致的,因为更改会同时传播到整个数据库 - 换句话说,不会有任何差异。它们是任何数据库的最基本单元,因此是原子的。

2025-01-13 10:22:49 642

原创 【PGCCC】PostgreSQL 临时文件的使用

当以temp_tablespaces交互方式设置时,指定不存在的表空间是错误的,指定用户没有 CREATE 权限的表空间也是如此。但是,当使用以前设置的值时,**不存在的表空间将被忽略,用户缺少 CREATE 权限的表空间也将被忽略。但在事务中,连续创建的临时对象将放置在列表中连续的表空间中。当 CREATE 命令未明确指定表空间时,此变量指定在其中创建临时对象(临时表和临时表上的索引)的表空间。此外,您可以将您的指向temp_tablespaces更快的磁盘,例如速度更快的 nvme。

2025-01-13 09:47:40 1291

原创 【PGCCC】PostgreSQL 的一些你可能不知道但应该尝试的功能

PostgreSQL包含许多重要的功能。他们中的许多人都非常知名。其他人可以是非常有用的,但没有广泛赞赏。以下是我们首选的PostgreSQL功能,您可能没有仔细看过,但实际上应该这样做,因为它们可以帮助您更快地将代码投入生产,使操作更轻松,并且通常可以使用更少的代码和劳动来完成任务。

2025-01-09 15:43:28 786

原创 【PGCCC】如何加快 SQL 查询速度的同时保持SQL的简洁?

在本文中,我们介绍了优化 SQL 查询的一些技巧。通常,对查询速度产生最大影响的因素是正确使用索引。希望本文中的内容能帮助到你。#PG证书#PG考试#PostgreSQL培训#PostgreSQL考试#PostgreSQL认证。

2025-01-08 16:08:46 565

原创 【PGCCC】在 PostgreSQL 中,如何优化对于日期范围的查询?

优化 PostgreSQL 中的日期范围查询需要综合考虑多个因素,包括建立合适的索引、选择正确的数据类型、避免函数操作、利用分区表和索引条件下推等技术,并通过 EXPLAIN 命令来评估和调整查询计划。通过合理的优化措施,可以大大提高日期范围查询的性能,满足实际应用的需求。#PG证书#PG考试#PostgreSQL培训#PostgreSQL考试#PostgreSQL认证。

2025-01-07 10:13:09 1025

原创 【PGCCC】PostgreSQL 作为向量数据库:入门和扩展

这篇文章介绍了如何使用 PostgreSQL 作为向量数据库构建生成式 AI 应用程序。从使用 pgvector 扩展启动 PostgreSQL,加载 Airbnb 数据集,到查找相关房源,还提到了扩展性能和可扩展性的方法,如使用专用索引和分布式版本如 YugabyteDB。PostgreSQL 拥有丰富的扩展和解决方案生态系统,使我们能够将该数据库用于通用人工智能应用程序。本指南将引导您完成使用 PostgreSQL 作为向量数据库构建生成式 AI 应用程序所需的步骤。

2024-12-26 10:29:18 890

原创 【PGCCC】解锁 7 大技巧,避免你的 Postgres 挂掉

现在有趣的是:如果另一个事务 C 加入,它不仅需要检查与事务 A 的冲突,还需要检查与事务 B 以及锁队列中其他所有事务的冲突。虽然 VACUUM FULL 有一些有效的使用情况,例如表以前很大,但现在变小了,仍占用大量空间,但这极可能不是你面临的情况。如果添加的列有默认值,PostgreSQL 会重写整个表,为每一行填写默认值,这对大型表来说可能需要数小时。这意味着即使你的 DDL 命令可以非常快速地运行,它也可能在队列中等待很长时间,因为需要等待其他查询完成,并且在它之后启动的查询将会被它阻塞。

2024-12-25 16:30:39 668

原创 【PGCCC】Postgresql Varlena 结构

postgresql 会有一些变长的数据类型,存储都是采用 varlena 格式的(除了 cstring 类型),通过语句 SELECT typname FROM pg_type WHERE typlen = -1就可以看到所有采用 varlena 格式的数据类型,比如常见的 text ,json 类型。

2024-12-20 10:05:27 860

原创 【PGCCC】Postgres 和 MySQL 应该怎么选?

在此测试场景中,MySQL展示了略高的每秒事务处理能力和较低的延迟,这可能与它的存储引擎和缓存策略有关。PostgreSQL在处理复杂的事务和并发场景时仍然表现良好,但其TPS略低于MySQL。需要注意的是,实际生产环境中的性能会受到具体应用工作负载、数据库调优、硬件性能等多种因素的影响。

2024-12-18 09:52:45 880

原创 【PGCCC】为什么高性能场景选用Postgres SQL 而不是 MySQL

MySQL MySQL声称自己是最流行的开源数据库,它属于最流行的RDBMS (Relational Database Management System,关系数据库管理系统)应用软件之一。LAMP中的M指的就是MySQL。构建在LAMP上的应用都会使用MySQL. MySQL最初是由MySQL AB开发的,然后在2008年以10亿美金的价格卖给了Sun公司,Sun公司又在2010年被Oracle收购。Oracle收购导致MySQL的出现两个版本:商业版和社区版。

2024-12-16 11:02:54 864

原创 【PGCCC】 pg_query 6.0:使用 Postgres 自己的解析器解析、反解析和规范化 SQL 查询的 Ruby 库

您可以在此处找到更多示例和更长的理由:https ://pganalyze.com/blog/parse-postgresql-queries-in-ruby.html。当您构建此扩展时,它会构建 PostgreSQL 服务器源的部分(参见libpg_query),然后将其静态链接到此扩展中。虽然这将重写表名,但它不会正确处理所有 CTE,也不会重写具有明确表名的列。此外,该扩展允许您规范化查询(用 $n 替换常量值)并将这些规范化的查询再次解析为解析树。更有用的是,这可用于重写查询。

2024-12-09 10:33:06 543 1

原创 【PGCCC】DELETE很困难

您的数据库运行良好 - 直到一个简单的 DELETE 操作使其崩溃。哪里出了问题?虽然我们倾向于专注于优化 SELECT 和 INSERT 操作,但我们经常忽略 DELETE 的隐藏复杂性。然而,删除不必要的数据同样重要。过时或不相关的数据会使您的数据库膨胀、降低性能并使维护成为一场噩梦。更糟糕的是,在没有合理理由的情况下保留某些类型的数据甚至可能导致合规性问题。乍一看,DELETE 命令似乎很简单。这些查询可能在您的开发机器上毫不费力地运行,因为那里只有几百条记录。

2024-12-05 10:17:32 961

原创 【PGCCC】为什么 PostgreSQL 主要版本升级很困难

PostgreSQL 主版本之间的升级非常烦人。您不能只安装服务器二进制文件然后重新启动,因为数据目录的格式不兼容。

2024-12-04 16:13:07 885 1

原创 【PGCCC】Postgresql Free Space Map 文件解析

postgresql 的表包含了多种类型的文件,其中 main 类型的文件存储实际的数据,以数据块的格式存储,称为 data block。一个 data block 包含了多条数据,当新建了一个data block 或者原有的数据被删除,那么这个 data block 就会有空闲位置,postgresql 使用 free space map 文件记录了每个 data block 的空闲空间,并且以树的结构组织起来,实现快速的查找。fsm文件同样是以数据块的格式存储,这里称为 fsm block。

2024-11-26 11:06:11 930

原创 【PGCCC】Postgresql BRIN 索引原理

postgresql 提供了块级索引(简称 BRIN),主要适用于类似时序数据之类的,有着天然的顺序,而且都是添加写的场景。相比于 btree 索引,它的体积小得多,非常适用于大数据量的场景。

2024-11-25 14:16:19 989

原创 【PGCCC】B+Tree 的并发优化 BLink-Tree

B+Tree 被数据库普遍使用,作为索引实现的基础。网上的资料也非常多,所以这里也不再详细介绍。但是基于 B+Tree 的并发优化,资料却非常少,所以这篇来讲讲 B+Tree 的一种并发优化,那就是BLink-Tree。为了讲述得更加清楚,我会通过图的形式,来详细阐述每一步骤。

2024-11-22 11:40:34 590

原创 【PGCCC】Postgresql 缓存替换算法

postgresql 使用缓存来作为与磁盘读写的中间层,但是缓存的大小是有限的,当缓存不够用时需要剔除一些不常用的。但是如何高效的选出那些需要剔除的缓存呢,postgresql 针对不同的应用场景,提供了简单高效的不同算法。

2024-11-21 09:51:52 969

原创 【PGCCC】pgvector 0.8.0 发布并可在 Nile 上使用

pgvector 社区发布了备受期待的 0.8.0 版本,该版本在性能和功能方面均有显著改进。我们当然迫不及待地想将它提供给 Nile 用户。

2024-11-20 10:02:55 483

原创 【PGCCC】PostgreSQL 数据库设计中的文本标识符 | 翻译

文本标识符将继续存在,这很棒。它们易于阅读、容易记住,并且可以将大量有意义的上下文打包到一个简单的字符串中。它们使外部交互更加顺畅,无论是客户引用订单号还是支持团队跟踪问题。它们甚至为原本枯燥的标识符增添了一点魅力和个性。然而,控制它们的使用是很重要的。我听说的一条好规则是在外部通信时使用文本标识符- 例如在 URL 或 API 响应中在内部,始终依赖数字 ID - 必要时使用代理键,如 INT 或 BIGINT(如果您追求行星主宰,甚至是UUID),以保持数据库的效率和完整性。

2024-11-19 11:46:01 678

原创 【PGCCC】PostgreSQL中有许多个timeout,逐个弄懂它们的含义和使用

注意如果statement_timeout为非零,设置lock_timeout为相同或更大的值没有意义,因为事务超时将总是第一个被触发。这使得该会话所持有的任何锁被释放,并且其所持有的连接槽可以被重用,它也允许只对这个事务可见的元组被清理。与开放事务的情况不同,没有事务的空闲会话不会给服务器带来很大的成本,因此与idle_in_transaction_session_timeout相比,启用此超时的需求更少。终止任何超过指定的时间的空闲会话(即等待客户端查询),但不是在打开的事务中。

2024-11-15 09:51:50 1044

原创 【PGCCC】Postgresql 存储设计

postgresql 的这种设计应该是基于磁盘考虑的,因为我们大部分的存储介质都是磁盘,磁盘都是由固定大小的扇区组成,一般是512字节。我们还需要一些描述 Buffer 的信息,比如该 Buffer 对应哪个 Page,这里当持久化该 Buffer 的时候,知道存储到磁盘的哪个位置。如果 postgresql 想支持跨平台,那么它不能依靠底层的原子操作,需要自身保证这些数据的正确写入,防止 part-write 问题(也就是当写入一个 Page 时机器断电了,可能造成 Page 只写了一部分)。

2024-11-14 11:12:03 915

原创 【PGCCC】Postgresql 文件存储层

在 postgresql 数据库里,数据都会以表的形式组织起来。表的数据会被持久化到底层的磁盘里。负责与底层的磁盘交互,就是 postgresql 的文件存储层。本篇博客会依次介绍表的文件构成、分片机制和存储接口。下面简单的列表出一些常见的函数// 获取指定segment文件包含的block数目,这里MdfdVec代表着segment文件// 打开segment文件,segno参数代表着segment的编号,// oflags可以指定打开标志,支持o_create,o_rdwr,o_binary等。

2024-11-13 10:00:15 1007

原创 【PGCCC】Postgresql 物理流复制

postgresql 提供了主从复制功能,有基于文件的拷贝和基于 tcp 流的数据传输两种方式。两种方式都是传输 wal 数据,前者是等待生成一个完整的wal文件后,才会触发传输,后者是实时传输的。可以看出来基于文件方式的延迟会比较高,而且wal文件有可能没来得及传输就被损坏了,造成了这块的数据丢失。基于 tcp 流的方式,延迟非常低,是现在最常见的方式,本篇文章也主要讲述这种方式。

2024-11-12 11:17:24 1193

原创 【PGCCC】Postgresql Toast 原理

上篇博客讲述了 postgresql 如何存储变长数据,它的应用主要是在 toast。Toast 在存储大型数据时,会将它存储在单独的表中(称为 toast 表)。因为 postgresql 的 tuple(行数据)是存在在 Page 中的,Page 的大小默认为 8KB。postgresql 不允许 tuple 跨页存储,所以当一行数据的某个列数据过大时,比如 text 类型的数据,超过了单页的大小,那么 postgresql 会将它压缩,切分,并且存储在另外的位置。这种技术就是称为 Toast。

2024-11-12 09:53:52 823

原创 【PGCCC】Postgresql 编写自定义 C 函数

postgresql 支持自定义函数,并且还支持多种语言进行编写, 极大的提高了可扩展性。postgresql 支持使用 pgSQL(postgresql提供的类sql语言),python 和 c 语言来编写函数,本篇主要讲解 c 语言,因为它的性能是最好的。

2024-11-11 11:17:08 1155

原创 【PGCCC】postgresql 缓存池并发设计

postgresql 对于缓存池的并发控制,比较复杂。下面通过一步步的优化,来讲述 postgresql 的设计思路。它为了提升锁的性能,大量使用了 CAS 操作,只有在操作比较慢的时候,才会加入读写锁。在继续阅读之前,需要熟悉它的存储设计,可以参考这篇文章 {% post_link postgresql-storage-architecture postgresql 存储设计 %}。postgresql 对于缓存并发控制是非常精细的,它尽量将耗时的操作放在锁外面执行,很大的提高了并发性。

2024-11-08 12:04:28 905

原创 【PGCCC】优化 Postgres 表布局以实现最高效率

在对 Postgres 数据库进行建模时,您可能不会过多考虑表中列的顺序。毕竟,这似乎是不会影响存储或性能的事情。但如果我告诉您,只需重新排列列就可以将表和索引的大小减少 20%,您会怎么想?这不是什么晦涩难懂的数据库技巧——这是 Postgres 如何对齐磁盘上数据的直接结果。在这篇文章中,我将探讨 Postgres 中的列对齐工作原理、它的重要性以及如何优化表以提高效率。通过几个真实示例,您将看到即使列顺序的微小变化也能带来可衡量的改进。

2024-11-07 10:41:35 1264

原创 【PGCCC】Postgresql LWLock 原理

postgresql 的架构是基于多进程的,进程之间往往存在着数据共享,比如缓存读写。这时 postgresql 需要提高一种锁机制来支持并发访问,但是 linux 只实现了线程间的读写锁,所以 postgresql 自己实现进程间的读写锁,它主要利用了信号量和自旋锁来实现。

2024-11-07 10:00:25 846

原创 【PGCCC】Postgresql slru 缓存和存储

简单的 lru 缓存管理(简称 slru),用于持久化数据并且提供 lru 算法来缓存。slru 在 postgresql 存在着多处使用,比如存储事务状态的 clog 日志,就是使用 slru 来管理的。

2024-11-06 09:56:29 1153

原创 【PGCCC】在 Postgres 中创建日期箱的 4 种方法:interval、date_trunc、extract 和 to_char

在这篇文章中,我将介绍一些按日期查询数据的关键函数。有关在 Postgres 中存储日期和时间的最佳方法的摘要。

2024-11-05 15:05:29 944

原创 【PGCCC】Postgresql 缓存池原理

postgresql 为了提高响应速度,在存储层上面添加了一层缓存,这样对于数据的查询和修改,都会先在缓存中操作,后面才会同步到磁盘。这样对于一些热点数据,性能提高非常明显。缓存的基本单位对应文件的一个 block,本篇主要介绍缓存池的原理和使用。

2024-11-04 10:07:25 1179

原创 【PGCCC】Postgresql 动态哈希表实现

postgresql 在设计扩容时是很精妙的,只是使用了 high_mask 和 low_mask 两个数字进行 & 操作,就可以快速的找到对应的 bucket。还有设计了空闲列表,针对并发环境,还设置了多个空闲列表,增大并发性能。同样引入分区锁,来细化锁粒度,这些都是值得学习的知识点。作者:zhmin链接:https://zhmin.github.io/posts/postgresql-dynamic-hash/

2024-11-01 14:12:54 1037

原创 【PGCCC】Postgresql BgWriter 原理

postgresql 有一个后台进程 bgwriter,它会定时刷新缓存到文件系统中。这种机制提高了缓存的替换速度,因为在寻找空闲缓存时,有时需要将脏页刷新到文件中,而刷新操作是比较耗时的。同样它也提高了执行 checkpoint 的完成速度,因为 checkpoint 需要刷新所有的脏页。

2024-10-31 10:06:51 1036

空空如也

空空如也

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

TA关注的人

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