首页 > 数据库 >POSTGRESQL UPDATE 如何提高I/O 能力

POSTGRESQL UPDATE 如何提高I/O 能力

时间:2023-06-19 17:05:31浏览次数:52  
标签:POSTGRESQL MYSQL UPDATE 能力 SERVER 索引 SQL 数据


POSTGRESQL UPDATE 如何提高I/O 能力_数据库

POSTGRESQL 的数据扫描,其实和其他的数据库也无差,无非就是数据块的扫描以及索引的扫描,这里POSTGRESQL 数据扫描也叫 TUPLE SCAN。

在POSTGRESQL 8.3 版本后再HEAP 表的修改中,有一个概念叫 HOT, 通过新的概念提高了堆表的性能,减少了I/O。 早起的POSTGRESQL 更新的方式是修改索引中的数据,主要是由于MVCC 多版本控制中UPDATE 一行数据后,是需要在索引中重新POINT,将原有INDEX的数据废弃,这加大了I/O的操作。

POSTGRESQL UPDATE 如何提高I/O 能力_数据_02

目前的POSTGRESQL 早已放弃这样的操作,当UPDATE 一行,如果可以POSTGRES将在原有的老的数据后添加新的COPY,并且POSTGRESQL 的存储会标记,让索引知晓老数据后是更新的数据。这样POSTGRES 就避免了在更新整个INDEX ,使得UPDATE 后的数据不在修改INDEX,减少I/O。

另外这里可能有同学要问,如果old tuple 被清除了,数据链不就断掉了,事实上是不会的,只需要将页面的HEADER 中的 1 重新定向到 2 即可,最大化的减小I/O 是优化的目的。

POSTGRESQL UPDATE 如何提高I/O 能力_数据_03

但有两种情况下是不能使用 HOT 功能的

1  更新后的数据已经跨页,那是没有办法继续使用刚才的方法,所以乱设计本来 CHAR(10) 可以解决的,非要 CHAR(400) 这就出现问题

2   更新查询的 KEY 值

例如 UPDATE  A SET COL = 'A' WHERE  COL = ‘B’  这也是没有办法使用HOT 功能的,所以在大量更新KEY 本身的时候,速度相对非 KEY 来说,一定会比较慢。当然也有办法,很简单,你一定能想得到。

这里POSTGRESQL 还有一个和其他数据库不大一样的地方,就是如果想使用 符合索引(ORALCE MYSQL) 或者 INCLUDE INDEX (SQL SERVER)方式来不进行 回表访问数据,按照原理,我们只需要将需要访问的数据,包含在INDEX 中即可。

但是在POSTGRESQL 中即使你的索引已经包含了数据,他还有会回表检测数据的可见性(这和他的原理有关,暂且不谈),那这样的设计就有点反人类了,POSTGRESQL 则使用了一个 叫 visibility map 的东西,来避免回表的操作,将数据是否可见直接记录在 visibility map 中,只要记录可见,则索引直接反馈数据,否则还要回表检查。

并且最近对数据库底层的存储了解后,发现每种数据库可能不擅长的场景

例如 在数据库底层上 (SQL SERVER  MYSQL ) 都有聚簇索引的概念,也就是说,如果是RANGE 的提取数据,并且这个表是按照 SQL SERVER MYSQL 底层的存储结构来设计表,则原理上可以比 ORACLE  和  POSTGRESQL (相对来说,POSTGRESQL 的底层设计,在RANGE 上应该也比ORACLE 要强,同时随机的读取的速度也不会慢,) 这样的堆表设计的数据库要更容易提取数据,速度更快(如果你使用 更先进的的SSD 或者 PCI-E 卡)或者你提取的数据不够多,可能并不能有明显的体现。但原理上一次寻道就能获取连续的存储的数据,要比多次寻道,获取散列的数据要好的多。相反 如果提取的数据是无顺序的,则ORACLE 和 PG 效率可能要高过 MYSQL 和 SQL SERVER (相对SQL SERVER 和 MYSQL 也有不同,相对 SQL SERVER 的随机提取数据的能力要好于 MYSQL)。并且在数据表文件的生成上,pg和mysql一个表一个或多个文件,SQL SERVER 和 oracle 多个表占用一个表空间,当然如果你不怕麻烦也可以一个表一个表空间一个表多个文件,但我想没有一个sql server 和 Oracle的DBA会认同你这样的做法,你这样会让这两位彻底的疯掉。

(仅个人观点,欢迎指正)

POSTGRESQL UPDATE 如何提高I/O 能力_SQL_04

标签:POSTGRESQL,MYSQL,UPDATE,能力,SERVER,索引,SQL,数据
From: https://blog.51cto.com/u_14150796/6515996

相关文章

  • POSTGRESQL RC事务处理与ORACLE MYSQL 的区别 --对PGFANS 群里面的问题的分解
    有一个同学在PGFANS群里面提了一个问题,在他实验的某个操作中发现PG和ORACLE使用同样的操作流程后,得到的结果不一致。所以下面准备验证并找到一些可以解释的原因。测试库名test测试表test测试数据id  age 1   202   223   24首先我们要确认 PG的隔离 RC......
  • POSTGRESQL analyze table 到底做了什么与扩展统计
    PostgreSQL 中对表的状态是有单独的命令来进行状态的收集的,到底怎么对表来进行状态的收集,并且都做了什么,我们怎么来依靠这些信息来对查询进行有益的帮助。这些都将在这篇文章里面探讨。首先我们对PG12中,关于Analyze 的注释来仔细的阅读一遍ANALYZE collectsstatisticsabout......
  • POSTGRESQL PG_REWIND 从源代码看功能
    PG_REWIND是PG9.6开始提供的功能,主要的作用在于通过PG_REWIND让PG复制中的数据库快速的与预定的“主库”进行数据同步,而复制的方式是是文件块的方式,并且可以避过重复的数据块。所以复制的速度是快的,在不少的高可用方式中都被作为主库失败后的快速的将主库加入原有集群并作为从......
  • 分布式两大流派 POSTGRESQL -XC 了解一下
    分布式数据库有两大流派,NEWSQLVS POSTGRESQL-XC,NEWSQL的分布式主流的理论来源自GOOGLE的分布式数据库spanner,以及相关理论的白皮书,而令一派的分布式数据库来自于POSTGRESQL-XC,今天我们看看到底POSTGRESQL-XC这个流派的方式是什么,有什么特点,当下那些分布式数据库采用了......
  • POSTGRESQL Postgres-XL 了解一下
    上次分析的POSTGRES-XC的结构, 实际上POSTGRES-X系列一直在发展, POSTGRES除了XC还有XL的高可用的结构.Postgres-XL是一款Postgres-XC升级的产品,如果说PGXC是在PG添加了集群的功能主打OLTP的功能为卖点,PGXL是一款基于PGXC添加了OLAP功能的支持MPP架构的,但不是简单的PO......
  • POSTGRESQL 创建一个表到底有什么说的? 可说的挺多的
    创建一张表,到底有什么说的, 下面是POSTGRESQL创建数据表的官方文档的内容截图. 那我们就往下看,到底我们可以说点什么建表的开头是关于临时表的问题,其中临时表的global和local,在目前的V12的版本中并没有具体的含义,问题1,POSTGRESQL怎么创建一个看似global的temparytab......
  • POSTGRESQL 主节点失败后, 在多变的情况下重新让他融入复制中
    POSTGRESQL 在主从流复制中,在主库失败切换后,从库变为主库后,如果主库不是因为硬件的原因,想继续拉起来,并且加入到新的复制关系中,一般都会通过pg_rewind的程序来进行拉起来.但不少问题反馈对pg_rewind在重新拉起旧主库出现问题,到底有什么情况下pg_rewind对你的数据库重新建立......
  • POSTGRESQL 设置hugepage 可以让系统使用内存更有效率,防止OOM
    https://www.percona.com/blog/why-linux-hugepages-are-super-important-for-database-servers-a-case-with-postgresql/https://bbs.huaweicloud.com/blogs/detail/156799Hugepage是什么,基于LINUX系统,大页面对虚拟内存管理是有必要的。除标准的4KB页面之外,还进行内存中的大页面......
  • POSTGRESQL 怎么通过explain 来分析SQL查询性能
    Explain命令是大多数数据库常用的一种展示SQL执行计划和cost的一种方式。在POSTGRESQL中EXPLAIN命令展示的信息比较详细,并且附带explain有不少的附加的命令来进行更多的展示。从命令来命令和功能来划分explainselecta.first_name,a.last_name,a.last_update,fa.film_idfrom......
  • POSTGRESQL 高可用 Patroni VS Repmgr 到底哪家强(1)
    在众多postgresql高可用模式中,主要的参与者有两位,PatroniVSrepmgr基于这二者的功能优点以及缺点相信大部分人都不是太明确,下面将根据两篇翻译的文字合并,来对两个高可用的程序来做一个比较,consandpros。 1 Repmgr是一款开源的基于postgres复制基础上的高可用软件,他基于2......