暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

等待PostgreSQL V13 –允许vacuum命令并行处理索引

作者:Masahiko Sawada和Amit Kapila 

          Mahendra Singh和Sergei Kornilov


2020年1月20日,阿米特·卡皮拉(Amit Kapila)进行了修补:
允许vacuum命令并行处理索引。
 
此功能允许vacuum利用多个CPU来处理索引。这使我们能够与后台工作人员一起执行索引清理。这会在VACUUM 命令中添加一个PARALLEL选项,用户可以在其中指定可用于执行该命令的工作程序数量,该工作程序数量受表上索引数量的限制。其值为零将禁用并行性。此选项不能与FULL选项一起使用。
 
每个索引最多可以通过一个vacuum进程进行处理。因此,当表具有至少两个索引时,可以使用并行vacuum。
 
并行度可以由用户指定,也可以基于表具有的索引数确定,并进一步受
max_parallel_maintenance_workers 限制。如果索引的大小大于min_parallel_index_scan_size,则该索引可以参与并行vacuum。
 
作者:Masahiko Sawada和Amit Kapila ;Mahendra Singh和Sergei Kornilov
 
讨论:
    https://postgr.es/m/CAD21AoDTPMgzSkV4E3SFo1CH_x50bf5PqZFQf4jmqjk-C03BWg@mail.gmail.com
    https://postgr.es/m/CAA4eK1J-VoR9gzS5E75pcD-OH0mEyCdp8RihcwKrcuw7J-Q0+w@mail.gmail.com

    描述很长,所以让我们看看它是如何工作的。
    首先,需要一张带有几个索引的示例表:
      =$ CREATE TABLE test (
      id INT4 GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
      some_int INT4,
      some_timestamp TIMESTAMPTZ,
      other_int INT4,
      other_timestamp TIMESTAMPTZ);CREATE TABLE

      =$ INSERT INTO test (some_int, some_timestamp, other_int, other_timestamp)SELECT
      random() * 500000000,
      '2000-01-01'::DATE + '20 years'::INTERVAL * random(),
      random() * 500000000,
      '1970-01-01'::DATE + '20 years'::INTERVAL * random()FROM
      generate_series(1,100000000) i;
      INSERT 0 100000000


      好的,我们有一些行数据,如下所示:
        =$ SELECT * FROM test LIMIT 10;
        id | some_int | some_timestamp | other_int | other_timestamp----+-----------+-----------------------------+-----------+-----------------------------
        1 | 179275930 | 2010-01-28 23:02:57.0048+01 | 31223069 | 1975-10-21 03:30:13.536+01
        2 | 119009254 | 2019-05-01 14:40:19.5168+02 | 390536066 | 1974-02-18 16:12:31.7952+01
        3 | 153965899 | 2010-04-26 00:36:46.3968+02 | 109395281 | 1985-10-09 01:30:36.0288+01
        4 | 123106154 | 2006-06-28 18:59:21.0624+02 | 399537003 | 1982-12-08 21:13:32.5056+01
        5 | 338157258 | 2006-11-04 07:21:34.7328+01 | 487378393 | 1975-02-14 05:59:28.7232+01
        6 | 108837322 | 2006-10-10 04:07:35.2704+02 | 53539283 | 1987-05-17 00:59:49.5744+02
        7 | 434671405 | 2011-04-09 00:21:43.4304+02 | 374841058 | 1980-05-13 17:12:37.1808+02
        8 | 407587896 | 2013-08-02 15:26:41.3376+02 | 180180561 | 1985-01-06 04:22:03.6768+01
        9 | 450852732 | 2008-10-27 18:14:00.4992+01 | 81128068 | 1975-06-26 01:55:29.8848+01
        10 | 306987401 | 2013-12-17 08:39:19.1232+01 | 28668776 | 1970-08-01 15:43:29.0208+01
        (10 ROWS)


        现在,让我们添加一些索引:
          =$ CREATE INDEX i1 ON test (some_int);
          CREATE INDEX
          =$ CREATE INDEX i2 ON test (some_timestamp);
          CREATE INDEX
          =$ CREATE INDEX i3 ON test (other_int);
          CREATE INDEX
          =$ CREATE INDEX i4 ON test (other_timestamp);
          CREATE INDEX
          =$ CREATE INDEX i5 ON test (some_int, some_timestamp);
          CREATE INDEX
          =$ CREATE INDEX i6 ON test (other_int, other_timestamp);
          CREATE INDEX


          因此,目前有7个索引以及表本身:
            =$ SELECT c.relname, c.relkind, pg_size_pretty(pg_relation_size(c.oid))
            FROM pg_class c
            WHERE c.relname = 'test' OR
            c.oid IN ( SELECT i.indexrelid FROM pg_index i WHERE i.indrelid = 'test'::regclass );


            relname | relkind | pg_size_pretty
            -----------+---------+----------------
            test | r | 5744 MB
            test_pkey | i | 2142 MB
            i1 | i | 2142 MB
            i2 | i | 2142 MB
            i3 | i | 2142 MB
            i4 | i | 2142 MB
            i5 | i | 3004 MB
            i6 | i | 3004 MB
            (8 ROWS)

            有了这些索引,并禁用了自动vacuum,运行如下指令:
              =$ DELETE FROM test WHERE random() < 0.5;


              这样索引(和表)将需要进行一些清理。


              然后,在没有任何并行化的情况下运行vacuum:
                =$ vacuum (verbose ON, analyze ON, parallel 0) test;


                之后,重新创建了整个内容,然后运行:

                  =$ SET max_parallel_maintenance_workers = 2;
                  =$ vacuum (verbose ON, analyze ON) test;


                  最后,重新创建:

                    =$ SET max_parallel_maintenance_workers = 8;
                    =$ vacuum (verbose ON, analyze ON) test;


                    日志显示,对于连续vacuum:

                      =$ vacuum (verbose ON, analyze ON, parallel 0) test;
                      psql:test1.sql:2: INFO: vacuuming 'public.test'...
                      CPU: USER: 663.45 s, system: 87.05 s, elapsed: 1505.04 s.
                      psql:test1.sql:2: INFO: analyzing 'public.test'
                      psql:test1.sql:2: INFO: 'test': scanned 30000 OF 735295 pages, containing 2040581 live ROWS AND 0 dead ROWS;
                      30000 ROWS IN sample, 50014300 estimated total ROWS
                      VACUUM
                      TIME: 1505238.738 ms (25:05.239)


                      2位工人(进程的形象描述)的vacuum清理工作:

                        =$ SET max_parallel_maintenance_workers = 2;
                        SET
                        =$ vacuum (verbose ON, analyze ON) test;
                        psql:test2.sql:3: INFO: vacuuming 'public.test'
                        psql:test2.sql:3: INFO: launched 2 parallel vacuum workers FOR INDEX vacuuming (planned: 2)...
                        CPU: USER: 119.29 s, system: 43.63 s, elapsed: 694.13 s.
                        psql:test2.sql:3: INFO: analyzing 'public.test'
                        psql:test2.sql:3: INFO: 'test': scanned 30000 OF 735295 pages, containing 2039828 live ROWS AND 0 dead ROWS;
                        30000 ROWS IN sample, 49995844 estimated total ROWS
                        VACUUM
                        TIME: 694336.035 ms (11:34.336)


                        当我选了8个工人时:
                          =$ SET max_parallel_maintenance_workers = 8;
                          SET
                          =$ vacuum (verbose ON, analyze ON) test;
                          psql:test3.sql:3: INFO: vacuuming 'public.test'
                          psql:test3.sql:3: INFO: launched 6 parallel vacuum workers FOR INDEX vacuuming (planned:6)
                          CPU: USER: 134.24 s, system: 51.37 s, elapsed: 776.12 s.
                          psql:test3.sql:3: INFO: analyzing 'public.test'
                          psql:test3.sql:3: INFO: 'test': scanned 30000 OF 735295 pages, containing 2040985 live ROWS AND 0 dead ROWS; 30000 ROWS IN sample, 50024202 estimated total ROWS
                          VACUUM
                          TIME: 776326.118 ms (12:56.326)


                          看起来需要更多的调整才能与更多的工作人员一起运行,但是在我的测试案例中-只有7个索引,因此不会有太大的收获。


                          另外–速度似乎最好由2个工作人员来完成,但这可能与服务器上的一些负载有关。无论如何,并行处理索引时,vacuum都快得多。


                          I Love PG

                          关于我们

                          中国开源软件推进联盟PostgreSQL分会(简称:PG分会)于2017年成立,由国内多家PG生态企业所共同发起,业务上接受工信部产业发展研究院指导。PG分会致力于构建PG产业生态,推动PG产学研用发展,是国内一家PG行业协会组织。



                          欢迎投稿

                          做你的舞台,show出自己的才华 。

                          投稿邮箱:partner@postgresqlchina.com

                                                         

                                                           ——愿能安放你不羁的灵魂


                          技术文章精彩回顾




                          PostgreSQL学习的九层宝塔
                          PostgreSQL职业发展与学习攻略
                          搞懂PostgreSQL数据库透明数据加密之加密算法介绍
                          一文读懂PostgreSQL-12分区表
                          PostgreSQL源码学习之:RegularLock
                          Postgresql源码学习之词法和语法分析
                          PostgreSQL buffer管理
                          最佳实践—PG数据库系统表空间重建
                          PostgreSQL V12中的流复制配置
                          2019,年度数据库舍 PostgreSQL 其谁?
                          PostgreSQL使用分片(sharding)实现水平可扩展性
                          一文搞懂PostgreSQL物化视图
                          PostgreSQL原理解析之:PostgreSQL备机是否做checkpoint
                          PostgreSQL复制技术概述

                          PG活动精彩回顾




                          见证精彩|PostgresConf.CN2019大会盛大开幕
                          PostgresConf.CN2019大会DAY2|三大分论坛,精彩不断
                          PostgresConf.CN2019培训日|爆满!Training Day现场速递!
                          「PCC-Training Day」培训日Day2圆满结束,PCC2019完美收官
                          创建PG全球生态!PostgresConf.CN2019大会盛大召开
                          首站起航!2019“让PG‘象’前行”上海站成功举行
                          走进蓉城丨2019“让PG‘象’前行”成都站成功举行
                          中国PG象牙塔计划发布,首批合作高校授牌仪式在天津举行
                          PostgreSQL实训基地落户沈阳航空航天大学和渤海大学,高校数据库课改正当时
                          群英论道聚北京,共话PostgreSQL
                          相聚巴厘岛| PG Conf.Asia 2019  DAY0、DAY1简报
                          相知巴厘岛| PG Conf.Asia 2019 DAY2简报
                          相惜巴厘岛| PG Conf.Asia 2019 DAY3简报
                          独家|硅谷Postgres大会简报
                          全球规模最大的PostgreSQL会议等你来!

                          PG培训认证精彩回顾




                          关于中国PostgreSQL培训认证,你想知道的都在这里!
                          首批中国PGCA培训圆满结束,首批认证考试将于10月18日和20日举行!
                          中国首批PGCA认证考试圆满结束,203位考生成功获得认证!
                          中国第二批PGCA认证考试圆满结束,115位考生喜获认证!
                          请查收:中国首批PGCA证书!
                          重要通知:三方共建,中国PostgreSQL认证权威升级!
                          一场考试迎新年 | 12月28日,首次PGCE中级认证考试开考!
                          近500人参与!首次PGCE中级、第三批次PGCA初级认证考试落幕!


                          最后修改时间:2020-02-19 09:14:53
                          文章转载自开源软件联盟PostgreSQL分会,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                          评论