摘要:
前言 本篇介绍Postgresql中Hash索引的结构以及应用场景。 什么是Hash? Hash的思想是将一个小数字(从0到N−1,总共N个值)与任何数据类型的值关联起来。这样的关联称为Hash函数。所获得的数字可以用作一个常规数组的索引,其中存储对表行(tid)的引用。这个数组的元素被称为Hash 阅读全文
摘要:
Postgresql在8.3版中引入了HOT特性,以便在Update操作中,当更新的新行和旧行存储在相同的表数据页中时,能有效地使用索引和表的页;同时也减少了Vacuum处理的必要性。 无HOT之前PG-update存在的问题 假设表‘tbl’存在两个列 ‘id’ 和‘data’; ‘id’ 是 ‘ 阅读全文
摘要:
项目现场开发给了个慢SQL寻求优化。T3表结构又全是varchar…已经无力吐槽了,之前的博客已经讲过了在磁盘上varchar几乎等同于实际长度,但是如果放到内存,分配的空间是定义长度,很容易导致内存不足,如果嫌命长,可以多试试。此外不要用UUID做主键,UUID做主键会导致索引结构大,同时UUID 阅读全文
摘要:
B-tree索引类型,实现为“btree”访问方法,适用于可以排序的数据。换句话说,必须为数据类型定义“更大”、“更大或相等”、“更小”、“更小或相等”和“相等”操作符。 在B-tree的数据结构架构图中,B-tree的索引行被存在索引页中。在存储叶子节点的页中,这些行包含建立索引的数据(键)和指向 阅读全文
摘要:
在本章中,总结PostgreSQL的进程架构和内存架构 1. 进程架构 Postgresql是个C/S(client/server)的关系型数据库,具有多进程的架构,运行在一个主机上。 多个进程协同管理一个数据库集群通常被称为“PostgreSQL server”,它包含以下类型的进程: postg 阅读全文
摘要:
背景 前段时间同事在优化一个SQL,优化效果从最开始的200+s通过SQL改写优化到20s,但是依旧不能满足现场需求,于是发给我们瞅瞅。 问题解决 表情况 tab1是一张大表,一年数据量亿级别,已经按年分区存在索引 idx1(time1,colx),id唯一 原始SQL: select count( 阅读全文
摘要:
背景 前段时间在某现场遇到个问题,早上到项目现场,技术支持反映数据库不可查,32个现场的CPU直接全部100%。 为了尽快恢复使用,在得到业务同意情况下,直接重启Postgresql,重启后CPU恢复正常,未出现再持续增长情况。 问题定位 现场已经装了插件pg_stat_statements,直接查 阅读全文
摘要:
很多项目现场由于前期规划问题导致很多表未设置成分区表,下面介绍一种在线迁移的方法。 使用继承表,触发器,异步迁移,交换表名一系列步骤,在线将非分区表,转换为分区表(交换表名是需要短暂的堵塞)。 关键技术: 1、继承表(子分区) 对select, update, delete, truncate, d 阅读全文
摘要:
前言 Postgresql支持“逻辑”和“物理”两种复制方式,逻辑复制是一种基于数据对象的复制标识(通常是主键)复制数据对象及其修改的方法,而后者使用准确的块地址以及逐字节的复制方式(WAL日志),逻辑复制允许数据复制和安全性上更细粒度的控制(可以对特定表进行复制)。逻辑复制采用发布者->订阅者模型 阅读全文
摘要:
在某现场进行优化过程中,开发拿来一个有意思的现象,一个SQL不加order by速度快数倍。查看两者执行计划发现不加order by的SQL走的全表扫描,而加了order by的SQL走的索引,速度反而比前者慢很多。 不带ORDER BY SQL: explain (ANALYZE true,buf 阅读全文