庖丁解牛——从 BRIN Index 到 PostgreSQL AM
第一次用“庖丁解牛”作为标题,多少还是有些不自量力的,尽管我对 PostgreSQL 的理解仍然只是停留在一个非常浅显的阶段,但是我想尽我所能的把一件事情讲清楚,并且完成从“明白”到“理解”的进步。BRIN Index 是 PostgreSQL 中非常年轻的索引,索引原理和具体实现都不复杂,是着手 PostgreSQL AM 一个非常好的切入点。 »
第一次用“庖丁解牛”作为标题,多少还是有些不自量力的,尽管我对 PostgreSQL 的理解仍然只是停留在一个非常浅显的阶段,但是我想尽我所能的把一件事情讲清楚,并且完成从“明白”到“理解”的进步。BRIN Index 是 PostgreSQL 中非常年轻的索引,索引原理和具体实现都不复杂,是着手 PostgreSQL AM 一个非常好的切入点。 »
在 PostgreSQL 中,使用 EXPLAIN ANALYZE 不仅能够打印查询优化模块的估算代价,同时也会打印出语句执行时的实际代价,当我们遇到一个 Slow Query 时,就可以使用 EXPLAIN ANALYZE 对结果进行分析。但是 Greenplum 是一个分布式数据库,每一个节点的执行时间以及处理的 tuple 数量都可能不同,那么此时 EXPLAIN ANALYZ 的结果到底表示什么? »
当我们进行数据库等复杂应用系统时,如果出现了问题需要进行 debug 的话,gdb 就是第一选择。但是对于类似于内存等复杂问题来说,使用 gdb 进行调试颇为不便: gdb 无法“回滚”我们的操作,也就是说,当我们使用断点错过了一个非常重要的操作的话,一切就得重新开始。此时我们就可以选择 rr 这个支持反向调试的工具,一次复现,N 次调试。 »
在 PostgreSQL 的旧版本中,常常需要处理大量以指针传值的查询,因而存在着内存泄露的问题,直到查询结束时才能将内存收回。尤其是在处理 TOAST 数据时,需要使用大量的内存,因而使得内存泄露的问题更加明显。为此,PostgreSQL 在 7.1 版本开始实现了内存上下文管理机制。 »
在数据的并发读写过程中,由于写入并不是原子性的,因此当一个线程正在写时,如果另一个线程进行读操作的话就很有可能产生数据不一致的问题。 比如数据的前半部分写入了,但是后半部分尚未写入,那么在读取时就会取到中间值,也就是脏数据,典型案例就是 64 位整型的写入将会分为两次写入。 »