fill方法_rolling animator参数

fill方法_rolling animator参数介绍Fillfactor前先帮助大家回顾一下,Postgresql数据库的物理结构。 在没有非默认表空间的情况下,Postgresql的每个数据库均存放在一个目录中,以数据库oid命名,该目录中存放…

Fillfactor 参数

介绍Fillfactor前先帮助大家回顾一下,Postgresql数据库的物理结构。
 
在没有非默认表空间的情况下,Postgresql的每个数据库均存放在一个目录中,以数据库oid命名,该目录中存放每个表对应的数据文件,文件名以该数据表对应的relfilenode_oid命名。当表中的数据量足够大,导致表文件的大小大于1GB的时候,Postgresql会自动创建新的数据文件用于存放新插入的数据。新文件的名称为: relfilenode_iod.1, relfilenode_iod.2 等。使用该策略是为了防止在某些文件系统中,最大支持文件尺寸不能大于1GB的情形(–with-segsize=SEGSIZE 可修改数据文件大小)。
 
PostgreSQL将数据文件中的空间从逻辑上划分成一个个页面(数据块)。页面是数据库I/O的基本单位,即只能整页读写数据文件, 页面的大小默认是8K。PostgreSQL中在编译时可通过(–with-blocksize=BLOCKSIZE)来修改页面大小,更大的页面在一些特殊数据库应用中可能会很有用。
 
数据库共享缓存中的空间划分也是按页为基本单位, 一个页的大小与数据文件中页的大小一致, 这样便于整页读取数据文件,并放入到数据库Buffer中, 从Buffer写入数据文件也同理,保证了缓存与数据文件结构和内容上的一致性。
 
在PostgreSQL中,表文件中的tuple之间不进行关联,这样的表文件称为堆文件,每个堆文件都是由多个page组成,PostgreSQL中对数据进行操作一般都是通过追加数据来实现的,例如 insert 时向页中添加一条数据,update 将历史数据标记为删除,然后向页中添加新数据,delete 将历史数据标记为删除,假如存在索引,还涉及到索引的修改。这部分如果不太明白,可以了解一下PostgreSQL的MVCC。
 
在了解了以上概念以及Postgresql数据库的物理结构后,我们可以更好地理解Fillfactor。
 

1. Fillfactor是一个表存储参数,对于性能方面,这是最重要的参数之一。

 
表的Fillfactor是介于10和100之间的百分比。默认值是100。
 
由于默认值为100,这意味着数据库会在页面中写入数据直到它没有剩余空间。因此在执行一个UPDATE时,旧元组将被标记为已删除,并且新元组将插入另一个页面。另外一个影响是,需要修改新记录的相关索引,因为索引必须指向新的位置。
 
还记得前面我们提到过的,对于一个UPDATE实际上有三个操作,首先标记已删除的元组,在新页面中写入新元组,以及索引修改。这不仅仅和UPDATE相关,实际上SELECT查询的性能也会因内部碎片而降低。
 
–查看表或者索引的Fillfactor值
SELECT
pc.relname AS ObjectName,pc.reloptions 
AS ObjectOptions
FROM pg_class AS pc
INNER JOIN pg_namespace AS pns
ON pns.oid = pc.relnamespace
WHERE pns.nspname = "public"
AND pc.relname = "table_name";     --替换为实际表名

如果设置了Fillfactor,你可以找到“{fillfactor = value}”,否则它只是NULL。

默认的Fillfactor是100,这个设置相对来说比较稳妥,但不是在所有情况下都是如此。

当表频繁更新时,你需要更多的CPU和IO用于不同的数据页操作这势必会影响性能。
解决方案是首先测量元组的大小,如果元组大小不是那么大,我们可以减少默认Fillfactor的值。
 

2. 如何衡量PostgreSQL中元组的大小?

 
在更改Fillfactor的默认值之前,我们应该测量表行的大小。如果表行较大,我们不应该更改Fillfactor的默认值。当我们进行性能优化时,知道page和堆表行的大小非常重要,否则我们需要处理高碎片并一次又一次地执行VACUUM FULL或VACUUM。
 
如果总行大小低于8kb,则可以尝试更改表存储参数。
使用下面的SQL查看行大小:
WITH cteTableInfo AS
(
SELECT
COUNT(1) AS ct
,SUM(length(t::text)) AS TextLength  
,"public.table_name"::regclass AS TableName      --替换表名
FROM public.table_name AS t                      --替换表名
)
,cteRowSize AS
(
   SELECT ARRAY [pg_relation_size(TableName)
               , pg_relation_size(TableName, "vm")
               , pg_relation_size(TableName, "fsm")
               , pg_table_size(TableName)
               , pg_indexes_size(TableName)
               , pg_total_relation_size(TableName)
               , TextLength
             ] AS val
        , ARRAY ["Total Relation Size"
               , "Visibility Map"
               , "Free Space Map"
               , "Table Included Toast Size"
               , "Indexes Size"
               , "Total Toast and Indexes Size"
               , "Live Row Byte Size"
             ] AS Name
   FROM cteTableInfo
)
SELECT
unnest(name) AS Description
,unnest(val) AS Bytes
,pg_size_pretty(unnest(val)) AS BytesPretty
,unnest(val) / ct AS bytes_per_row
FROM cteTableInfo, cteRowSize
UNION ALL SELECT "------------------------------", NULL, NULL, NULL
UNION ALL SELECT "TotalRows", ct, NULL, NULL FROM cteTableInfo
UNION ALL SELECT "LiveTuples", pg_stat_get_live_tuples(TableName), NULL, NULL FROM cteTableInfo
UNION ALL SELECT "DeadTuples", pg_stat_get_dead_tuples(TableName), NULL, NULL FROM cteTableInfo;

3. 如何在PostgreSQL中更改Table Fillfactor的当前值?

ALTER TABLE table_name SET ( fillfactor = 50);
VACUUM FULL table_name;


 

请注意:
更改Fillfactor的值后,只在特定表上执行VACUUM FULL。
更改Fillfactor的值后,它仅适用于新元组。
当我们减少Fillfactor的默认值时,每个页面都有一些空闲空间,UPDATE生成的新元组可以存储在同一页面上,索引页面就不需要任何修改,但是这也会导致数据文件比正常情况要更大,当做全表扫描时会导致访问更多的page,这些就需要运维人员进行性能测试,自行判断是否应该修改该参数。
 
参考文献:
 
http://www.postgres.cn/news/viewone/1/220                                                 数据库系统概念笔记之存储和文件系统及PostgreSQL实现
https://blog.csdn.net/weixin_39747511/article/details/112923862                 pg数据库表存放在哪里_超详细的PG数据存储结构

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/6408.html

(0)
上一篇 2023-04-10
下一篇 2023-04-10

相关推荐

  • 以Python Twisted为核心的网络编程

    以Python Twisted为核心的网络编程在现代的互联网世界中,网络编程是最基本的技能之一。Python是一种强大的编程语言,以简洁、清晰、优雅的代码而著称。而Twisted作为Python中最为流行的网络编程框架之一,能够帮助开发人员快速实现复杂的网络应用程序。

    2024-05-07
    70
  • 详解mycat+haproxy+keepalived搭建高可用负载均衡mysql集群

    详解mycat+haproxy+keepalived搭建高可用负载均衡mysql集群概述 目前业界对数据库性能优化普遍采用集群方式,而oracle集群软硬件投入昂贵,mysql则比较推荐用mycat去搭建数据库集群,下面介绍一下怎么用mycat+haproxy+keepalived…

    2023-01-24
    154
  • 以Pi为中心的探究

    以Pi为中心的探究树莓派是一款小型的计算机,由英国的Raspberry Pi基金会设计制造。该计算机的目标就是推广基于计算机科学的教育以及在发展中国家改善计算机技术的教育和应用。由于树莓派小巧便宜,所以它在教育领域和开源领域拥有广泛的应用。

    2024-06-06
    48
  • MySQL事务隔离级别中可重复读与幻读「建议收藏」

    MySQL事务隔离级别中可重复读与幻读「建议收藏」每次谈到数据库的事务隔离级别,大家一定会看到这张表. 其中,可重复读这个隔离级别,有效地防止了脏读和不可重复读,但仍然可能发生幻读,可能发生幻读就表示可重复读这个隔离级别防不住幻读吗? 我不管从数据…

    2023-03-13
    156
  • PyCharm自动导入包教程

    PyCharm自动导入包教程在进行Python编程的过程中,我们都会遇到包导入的问题。对于一些较为简单的项目,我们可以手动导入需要的包,但是在大型的项目中,手动导入包会变得十分繁琐。而PyCharm提供了自动导入包的功能,可以在代码中自动添加缺失的导入语句,提高了代码的可读性和可维护性。

    2024-04-29
    96
  • 强大的正则表达式:让Python轻松实现文本处理和匹配

    强大的正则表达式:让Python轻松实现文本处理和匹配a href=”https://beian.miit.gov.cn/”苏ICP备2023018380号-1/a Copyright www.python100.com .Some Rights Reserved.

    2023-12-11
    116
  • Python编程,无所不能

    Python编程,无所不能Python是一种面向对象、解释型的高级编程语言,由Guido van Rossum于1989年底在荷兰创造。它具有简单明了、易读易学、代码量少、可移植性强等特点,并且可以用于各种编程领域。

    2024-04-29
    69
  • 如何创建和使用 sql 游标文件_游标的几种调用方式

    如何创建和使用 sql 游标文件_游标的几种调用方式本文介绍什么是 SQL 游标,为什么使用游标,如何使用游标。你使用的 DBMS 可能会提供某种形式的游标,以及这里没有提及的功能。更详细的内容请参阅具体的 DBMS 文档。 一、游标 SQL 检索操作

    2023-05-17
    348

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注