我查了表的 relvisable 比 relpage 少了 17,您这个脏该怎么理解呢?缓存中的脏数[阿里云PolarDB]

我查了表的 relvisable 比 relpage 少了 17,您这个脏该怎么理解呢?缓存中的脏数据吗?可是我这个表做完了 vacuum 就没干啥事情,这又是怎么发生的呢?

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
=====这是一个广告位,招租中,联系qq 78315851====
6 条回复 A 作者 M 管理员
  1. 在PostgreSQL中,relvisablerelpages都是用于描述表的统计信息的字段。relvisable表示表中可见的页数,而relpages表示表中实际的页数。因此,如果relvisablerelpages少17,说明表中有17页被标记为不可见,即被标记为脏数据。
    relvisablerelpages的值会随着表的更新而变化。例如,如果你删除了表中的数据,那么relvisable就会减少,而relpages可能会减少或保持不变。如果你对表进行了vacuum操作,那么relvisablerelpages的值可能会发生相应的变化。
    至于为什么在vacuum操作之后,表的relvisablerelpages的值没有发生明显的变化,这可能是因为vacuum操作并没有清理掉所有的脏数据。PostgreSQL的vacuum操作会尝试清理掉表中的脏数据,但是并不能保证所有的脏数据都会被清理掉。如果你想要清理掉所有的脏数据,可以使用VACUUM FULL命令,但是这个命令可能会消耗大量的系统资源,所以需要谨慎使用。

  2. 可能是由于以下原因引起的:

    Vacuum 还没有完全清除不可见的行:Vacuum 是 PostgreSQL 中用于清理不可见行的工具。如果表在进行 Vacuum 后,仍然存在一些不可见的行,那么 “relvisable” 可能会小于 “relpage”。

    并发访问和事务活动:如果在执行 Vacuum 的同时,有其他并发的事务在表上执行插入、更新或删除操作,那么可能会导致 “relvisable” 不等于 “relpage”。

    索引或其他附加结构:如果表有索引或其他附加的数据结构,它们可能会占据磁盘上的额外空间,但不会计入 “relvisable”。

  3. 楼主你好,relvisable 和 relpages 是 PostgreSQL 系统表 pg_class 中的两个字段,分别表示该表中可见的页面数量和实际占用的页面数量。通常情况下,relvisable 的值应该小于或等于 relpages 的值,因为其中可能有一些页面是被隐藏的或者没有使用的。

    如果在阿里云中查询表的 relvisable 值比 relpages 少了 17,可能是由于缓存中的脏数据导致的。缓存中的数据可能已经过时,或者是之前操作中出现了错误,导致 relvisable 和 relpages 的值不一致。

    您说这个表做完了 vacuum 就没干啥事情,如果您是说这个表已经进行了 VACUUM 操作,但是 relvisable 和 relpages 的值还是不一致,那么有可能是 Vacuum 操作没有完全清除所有的无用数据,导致表中还有一些隐藏的页面或者没有完全整合的页面。

    为了解决这个问题,建议您重新执行 VACUUM FULL 操作,该操作会彻底清空所有的无用数据,并且重新整合表的页面,使得 relvisable 和 relpages 的值保持一致。 如果重新执行 VACUUM FULL 后,还是存在问题,那就需要进一步检查是否有其他问题导致的。

  4. 在PostgreSQL中,”脏页”指的是那些被修改过的页面,但还没有被写回到磁盘。这是因为PostgreSQL会在内存中对数据进行修改,但在实际将修改后的数据写回磁盘之前,可能会发生一些情况导致数据丢失,比如数据库崩溃或者硬件故障。

    在这个例子中,”relvisable”比”relpage”少了17,意味着有17个页面只被标记为脏,但实际上并没有被写回磁盘。这可能是由多种原因导致的,比如后台的VACUUM进程正在处理这些页面,或者数据库发生了崩溃,导致部分更改没有被保存。

    至于为什么做了Vacuum之后仍然存在这种情况,可能是因为你的数据库中有大量的修改操作,导致大量的脏页。Vacuum只是一个后台进程,它会周期性的检查数据库,找出需要整理的页面,并尝试将它们写回到磁盘。但是,如果数据库的负载非常高,或者硬件出现问题,Vacuum可能无法及时完成它的任务,导致脏页的数量持续增加。

  5. 根据您提供的信息,”relvisable”比”relpage”少了17,这可能表示存在一些脏数据或者其他异常情况。下面是对可能原因的一些解释:

    1. 脏数据:在数据库中,脏数据一般指未提交或未完全写入到磁盘的数据。如果某些操作遇到错误或异常,可能导致部分数据未能正确写入磁盘,从而引起数据不一致。这样的情况下,查询到的记录数量可能与预期不符。

    2. 并发操作:如果多个用户同时访问数据库并进行写操作(例如插入、更新、删除等),可能会发生并发冲突。这种情况下,可能会导致某些数据操作未能正确同步或提交,进而出现数据不一致问题。

    3. 数据库故障:数据库可能遭遇一些故障,例如崩溃、断电或物理损坏等,可能导致数据写入失败或丢失。即使您执行了vacuum命令来整理表,但如果数据库底层存在问题,可能无法完全修复数据一致性。

    4. 缓存问题:如果您的应用程序使用了缓存机制,并且缓存中的数据与真实数据库中的数据不一致,可能会导致查询结果与预期不符。

    针对这些情况,您可以尝试以下解决方法:

    • 检查并修复数据库相关的错误日志,以了解是否有任何异常或故障发生。
    • 进行更详细的数据一致性检查,例如比对表中的记录数量、特定字段值等。
  6. vacuum verbose {tableName}; 看一下, 可能因为长事务等因素,有 dead tuple 没有立马清理掉,这种场景下, index only scan 的heap fetch 就少不了了

    此答案来自钉钉群“PG|POLARDB技术进阶”

  7. 根据您提供的信息,”relvisable”比”relpage”少了17,这可能表示存在一些脏数据或者其他异常情况。下面是对可能原因的一些解释:

    1. 脏数据:在数据库中,脏数据是指未提交或未完全写入到磁盘的数据。如果某些操作遇到错误或异常,可能导致部分数据未能正确写入磁盘,从而引起数据不一致。这样的情况下,查询到的记录数量可能与预期不符。

    2. 并发操作:如果这个表上有多个并发的操作(例如同时进行的插入、更新、删除等),可能会导致数据的不一致性。在某些情况下,一些操作可能会锁定数据,导致其他操作无法完成或出现异常,进而影响数据的完整性。

    3. 数据库故障:数据库可能遇到一些故障,例如崩溃或断电,导致数据损坏或丢失。这种情况下,可能需要执行一些修复操作,例如运行vacuum命令来恢复数据。

    4. 其他问题:还有其他一些可能的原因,例如配置错误、软件缺陷等,可能会导致数据不一致或异常。

    首先,建议您检查数据库是否处于正常状态,包括硬件设备和数据库软件本身。然后,您可以尝试执行一些修复操作,例如运行vacuum命令来重新整理表并恢复数据。