摘要:
PostgreSQL对大列使用了一种很好的,非标准的TOAST机制,可以将其与Oracle中的扩展数据类型进行比较(顺便说一下,TOAST行可能更大)。 不过,传统的大对象,仍然被许多客户使用。 如果你不熟悉PostgreSQL中的大对象,请阅读此处(https://www.postgresql.o 阅读全文
随笔分类 - postgres
PostgreSQL的WAL(4)--WAL创建和调优
2020-09-21 21:43 by abce, 4062 阅读, 收藏, 编辑
摘要:
我们熟悉了buffer cache的结构,在此情况下得出的结论是,如果所有RAM内容由于故障而丢失,则需要恢复预写日志(WAL)。由于不时地执行检查点,因此所需的WAL文件的大小和恢复时间受到限制。 在前面的文章中,我们已经回顾了许多与WAL相关的重要设置。在本文(本系列的最后一篇)中,我们将讨论尚 阅读全文
PostgreSQL的WAL(3)--Checkpoint
2020-09-19 11:26 by abce, 1462 阅读, 收藏, 编辑
摘要:
我们已经熟悉了buffer cache的结构(共享内存的主要对象之一),并得出结论,要在所有RAM内容丢失后发生故障后恢复,必须保留预写日志(WAL)。 我们上次中断的地方尚未解决的问题是,我们不知道在恢复期间从哪里开始播放WAL记录。从头开始,这是不可行的:不可能从服务器启动时保留所有WAL记录- 阅读全文
PostgreSQL的WAL(2)--Write-Ahead Log
2020-09-19 11:21 by abce, 639 阅读, 收藏, 编辑
摘要:
丢失RAM中的数据的风险是我们需要在故障后恢复数据的技术的主要原因。现在我们来讨论这些技术。 日志 为了避免RAM中数据丢失,必须将所有必需的东西妥善保存到磁盘(或其他非易失性介质)中。为此,做了以下的操作。在更改数据时,还维护了这些更改的日志。当我们更改buffer cache中页面上的某些内容时 阅读全文
PostgreSQL的WAL(1)--Buffer Cache
2020-09-17 12:05 by abce, 977 阅读, 收藏, 编辑
摘要:
为什么需要提前写日志 DBMS处理的数据部分存储在RAM中,并异步写入磁盘(或其他非易失性存储)中。即写延迟了一段时间。这种情况发生的频率越低,输入/输出越少,系统运行越快。 但是,如果发生故障(例如断电或DBMS或操作系统的代码错误),会发生什么? RAM的所有内容都会丢失,只有写入磁盘的数据才能 阅读全文
pg_waldump工具
2020-09-15 15:23 by abce, 1090 阅读, 收藏, 编辑
摘要:
pg_waldump显示WAL,将WAL以人可以读的格式输出。主要用于调试或教育目的。这个实用程序只能由安装的用户运行,因为它需要对数据目录进行只读访问。 语法 pg_waldump [option...] [startseg [endseg] ] 参数 $ pg_waldump --help pg 阅读全文
PostgreSQL的MVCC(8)--Freezing
2020-09-13 20:27 by abce, 645 阅读, 收藏, 编辑
摘要:
事务ID包装 PostgreSQL使用32位事务ID。 这是一个相当大的数字(大约40亿),但是随着服务器的大量工作,这个数字并不是不可能被耗尽。例如:每秒处理1000次事务,这种情况最少要在一个半月的连续工作中发生。 但是我们已经提到,多版本并发控制依赖于顺序编号,这意味着在两个事务中,数值较小的 阅读全文
PostgreSQL的MVCC(7)--Autovacuum
2020-09-13 18:48 by abce, 905 阅读, 收藏, 编辑
摘要:
我们已经提到过,通常(当没什么应用长时间持有事务时)VACUUM会执行其工作。问题是多久调用一次。 如果我们很少对不断修改的表执行vacuum,那么表的大小将超出预期。此外,如果进行了太多更改,则下一个vacuum操作可能需要多次操作索引。 如果我们过于频繁地对表执行vacuum,服务器将不断进行维 阅读全文
PostgreSQL的MVCC(6)--Vacuum
2020-09-12 14:05 by abce, 660 阅读, 收藏, 编辑
摘要:
In-page vacuum工作速度很快,但仅释放了一部分空间。它在一个表页内工作,并且不涉及索引。 常规的vacuum操作是使用VACUUM命令完成的。 因此,vaccum是对整个表操作。它不仅清除死元组,而且清除所有索引中对死元组的引用。 vacuum与系统中的其他活动同时进行。表和索引可以按常 阅读全文
postgresql中null对!=的影响
2020-09-07 22:23 by abce, 897 阅读, 收藏, 编辑
摘要:
今天开发问我,为什么!=操作不能获取值为null记录: abce=# select id, abce-# a_no, abce-# a_code, abce-# a_number, abce-# date_receive, abce-# bank_a, abce-# status abce-# fr 阅读全文
NULLs和empty strings在不同数据库的中特点
2020-09-07 21:52 by abce, 285 阅读, 收藏, 编辑
摘要:
1.以oracle为例 SQL> create table test(id int primary key,content varchar(20)); SQL> INSERT INTO test (id, content) VALUES (1, NULL); SQL> INSERT INTO tes 阅读全文
PostgreSQL的MVCC(5)--In-page vacuum and HOT updates
2020-09-06 08:53 by abce, 385 阅读, 收藏, 编辑
摘要:
in-page vacuum和HOT更新,两种技术都可以称为优化。它们很重要,但实际上并未包含在文档中。 在常规更新期间执行in-page vacuum 当因为读取或更新访问页面时,如果PostgreSQL知道该页面空间不足,则可以执行一次快速的in-page vacuum。发生在以下两种情况下: 阅读全文
PostgreSQL的MVCC(4)--Snapshots
2020-08-27 16:09 by abce, 1754 阅读, 收藏, 编辑
摘要:
在讨论了隔离问题并离题讨论了底层数据结构之后,上次我们研究了行版本,并观察了不同的操作如何改变元组头字段。 现在我们来看看如何从元组中获得一致性数据快照。 什么是数据快照 数据页实际上可以包含同一行的多个版本。但是每个事务只能看到每一行的一个(或没有)版本,以便它们在特定时间点上构成数据的一致视图( 阅读全文
PostgreSQL的MVCC(3)--Row Versions
2020-08-26 16:58 by abce, 549 阅读, 收藏, 编辑
摘要:
我们已经讨论过隔离,并且对底层数据结构做了介绍。现在介绍一下行版本(元组)。 Tuple header 如前所述,数据库中同一行记录在同一时刻可以有多个版本可用。我们需要以某种方式将一个版本与另一个版本区分开。为此,每个版本都标有有效的“time”(xmin)和到期的”time”(xmax)。引号表 阅读全文
PostgreSQL的MVCC(2)--Forks, files, pages
2020-08-24 12:00 by abce, 619 阅读, 收藏, 编辑
摘要:
上次我们讨论了数据一致性,从用户的角度分析了事务隔离级别之间的差异,并指出了了解这些的重要性。现在我们开始探索PostgreSQL如何实现快照隔离和多版本并发。 在本文中,我们将了解数据是如何在文件和页面中进行物理布局的。这使我们脱离了孤立的讨论,但这样的离题对于理解接下来的内容是必要的。我们需要弄 阅读全文
PostgreSQL的MVCC(1)--隔离
2020-08-23 17:24 by abce, 496 阅读, 收藏, 编辑
摘要:
什么是隔离以及隔离为何重要 可能每个人至少都知道事务的存在,遇到过ACID,并且听说过隔离级别。但是我们仍可能认为这与理论有关,这在实践中是不必要的。因此,我将花一些时间来解释为什么这确实很重要。 如果应用程序从数据库中获取了不正确的数据,或者应用程序将错误的数据写入了数据库,你肯定会不高兴。 但是 阅读全文
PostgreSQL中的索引(四) --Btree
2020-08-15 12:36 by abce, 1182 阅读, 收藏, 编辑
摘要:
我们已经讨论了PostgreSQL的索引引擎和访问方法的接口,以及哈希索引。现在我们将考虑b树,最传统和最广泛使用的索引。本文篇幅很大,请耐心等待。 Btree的结构 B-tree索引类型,以«btree»访问方法实现的,适合于可排序的数据。换句话说,必须为数据类型定义«greater»、«grea 阅读全文
PostgreSQL中的索引(九)--BRIN
2020-08-14 16:42 by abce, 1284 阅读, 收藏, 编辑
摘要:
在之前的文章中,我们讨论了PostgreSQL索引引擎、访问方法的接口以及以下方法:hash索引、b-tree、GiST、SP-GiST、GIN和RUM。本文的主题是BRIN(Block Range Index)。 与我们已经熟悉的索引不同,BRIN的想法是避免查找绝对不合适的行,而不是快速找到匹配 阅读全文
PostgreSQL中的索引(十)--Bloom
2020-08-13 16:23 by abce, 1339 阅读, 收藏, 编辑
摘要:
在之前的文章中,我们讨论了PostgreSQL索引引擎和访问方法的接口,以及哈希索引、b-tree、GiST、SP-GiST、GIN、RUM和BRIN。现在我们来看看Bloom索引。 典型的布隆过滤器是一种数据结构,使我们能够快速检查集合中元素的成员关系。过滤器是非常紧凑,但允许存在错误:it ca 阅读全文
PostgreSQL中的索引(八)--RUM
2020-08-12 21:45 by abce, 1433 阅读, 收藏, 编辑
摘要:
我们已经讨论了PostgreSQL索引引擎,访问方法的接口,以及主要的访问方法,如:hash indexes、B-trees、GiST、SP-GiST和GIN。在这篇文章中,我们将观察gin是如何变成rum的。 RUM 尽管作者声称GIN是一个强大的精灵,但比较的最终结果证明:GIN的下一代被称作R 阅读全文