iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Fillfactor 参数
  • 562
分享到

Fillfactor 参数

Fillfactor参数 2018-12-31 20:12:25 562人浏览 绘本
摘要

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数据存储结构
您可能感兴趣的文档:

--结束END--

本文标题: Fillfactor 参数

本文链接: https://www.lsjlt.com/news/8197.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么理解PostgreSQL创建数据表时的参数fillfactor
    这篇文章主要讲解了“怎么理解PostgreSQL创建数据表时的参数fillfactor”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解PostgreS...
    99+
    2024-04-02
  • Python中的函数参数(位置参数、默认参数、可变参数)
    目录一、位置参数二、默认参数三、可变参数四、关键字参数五、命名关键字参数六、各种参数之间的组合函数的参数:Python中函数定义非常简单,由于函数参数的存在,使函数变得非常灵活应用广...
    99+
    2024-04-02
  • week04_python函数、参数及参
    函数    数学定义:y = f(x) ,y是x的函数,x是自变量    python函数:        由若干语句组成的语句块、函数名称、参数列表构成,它是组织代码的最小单元;        完成一定的功能;函数的作用:    结构化编...
    99+
    2023-01-31
    函数 参数 week04_python
  • Python 函数 —— 定义,参数,参
    函数函数    数学定义:y = f(x), y是x的函数,x是自变量。 y = f(x0,x1,x2,...,xn)    python函数:        - 由 若干语句组成的语句块、函数名称、参数列表 构成,它是组织代码的最小单元 ...
    99+
    2023-01-31
    函数 定义 参数
  • Ceph参数配置参考
    [global]fsid = 740988c7-045c-455b-9301-cd50f527f2a2mon_host=11.180.137.117#for auth and crcauth_cluster_required = nonea...
    99+
    2023-06-04
  • C#中命名参数和可选参数
    一、简介 设计方法的参数是,可以将部分参数和全部参数分配默认值,然后调用这些方法的时候可以选择不提供部分实参,使用参数定义的默认值,另外,还可以在调用方法的时候通过指定参数名称来传递...
    99+
    2024-04-02
  • C++ 函数的默认参数和命名参数
    在 c++++ 中,函数参数可设置默认值,简化函数调用和提高代码可读性。此外,c++11 引入了命名参数,允许在函数调用时使用参数名称指定参数值,从而增强代码可读性和灵活性:默认参数:使...
    99+
    2024-04-13
    c++ 函数参数 代码可读性
  • Python 关键字参数和可变参数
    关键字参数 如果你有一些具有许多参数的函数,而你又希望只对其中的一些进行指定,那么你可以通过命名它们来给这些参数赋值——这就是python关键字参数(Keyword Arguments)——我们使用命名(关键字)而非位置(一直以来我们所使...
    99+
    2023-01-31
    参数 关键字 Python
  • python函数参数
    #没有参数a = 123 def xy(): print(a) xy() #执行结果123#一个参数 def xy(a): print(a) xy('nihao') #执行结果nihao#多个参数 def xy(a1,a...
    99+
    2023-01-30
    函数 参数 python
  • Golang形参要求详解:参数类型、参数个数及顺序
    Golang形参要求详解:参数类型、参数个数及顺序 在Golang中,函数的形参定义非常灵活,可以传递不同类型的参数及不固定数量的参数。形参主要包括参数类型、参数个数及参数顺序,下面将...
    99+
    2024-03-03
    参数个数 参数顺序 编译错误
  • 函数参数python
    函数中的默认参数,调用的时候可以给参数 赋值,也可以使用默认值 修改add函数如下 add()函数第一个参数没有默认值,第二个函数b默认值是3,在调用函数的时候,只赋予了函数实际参数为2, 也就是说该实际参数是2赋值给a,a+b后函数执行...
    99+
    2023-01-31
    函数 参数 python
  • C#中的out参数、ref参数和params可变参数用法介绍
    out参数: out关键字 通过引用来传递参数,在定义方法和调用方法的时候都必须使用out关键字 简单来讲out可以用来返回多个参数类型。 static void Ma...
    99+
    2024-04-02
  • Pytorch怎么统计参数网络参数数量
    这篇文章主要介绍了Pytorch怎么统计参数网络参数数量的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Pytorch怎么统计参数网络参数数量文章都会有所收获,下面我们一起来看看吧。Pytorch统计参数网络参数...
    99+
    2023-07-05
  • 函数的参数
    一、位置参数 1 def func(a,b,c): 2 print(a) 3 print(b) 4 print(c) 5 func(1,2,3) 6 func(1,2)#报错 7 func(1,2,3,4)#报错...
    99+
    2023-01-30
    函数 参数
  • Pytorch统计参数网络参数数量方式
    目录Pytorch统计参数网络参数数量Pytorch如何计算网络的参数量总结Pytorch统计参数网络参数数量 def get_parameter_number(net): ...
    99+
    2023-02-20
    Pytorch统计参数 Pytorch网络参数数量 Pytorch参数数量统计
  • Python_函数_参数
         def   是函数的关键字,Python解释器一旦执行到def,默认不执行 def li(): n = 8 n +=1 print(n) li() li2 = li li2() 结果: 9 9  ...
    99+
    2023-01-30
    函数 参数
  • VueTreeselect 参数options的数据转换-参数normalizer解析
    目录VueTreeselect 参数options的数据转换-参数normalizerVueTreeselect 参数options的数据转换解析VueTreeselect 参数op...
    99+
    2024-04-02
  • Spring Aop 怎么获取参数名参数值
    本篇内容主要讲解“Spring Aop 怎么获取参数名参数值”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Aop 怎么获取参数名参数值”吧!前言:有时候我们在用Spring Aop...
    99+
    2023-06-20
  • mybatissum(参数)列名作为参数的问题
    目录sum(参数) 列名作为参数注意事项mybatis注解sql sum(参数)传参写法sum(参数) 列名作为参数 项目中有很多个字段,当字段为空的时候,求该列的平均值并赋值给该字...
    99+
    2024-04-02
  • Spring Aop 如何获取参数名参数值
    前言: 有时候我们在用Spring Aop面向切面编程,需要获取连接点(JoinPoint)方法参数名、参数值。 环境: Mac OSX Intellij IDEA...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作