内存越大,openGauss/MogDB中truncate/drop越慢?

    之前老白写了一篇文章说在PostgreSQL中,当share buffer设置过大时,反而一定程度影响了性能,比如影响了DDL。其实这这一点还是很容易理解的,之前学过Oracle的朋友都知道检查点,truncate/drop table是需要触发检查点的,我们称为mini checkpoint。

     此时触发检查点,就需要进行刷脏处理,进而去扫描LRU,而LRU的长度是跟Buffer cache大小有关的,因此在Oracle数据库中,如果你buffer cache设置过大,那么drop/truncate是要相对慢一些的。实际上10年前我就遇到过类似问题,当时帮一个客户迁移数据,通过impdp导入后,在正式割接之间,需要将schema全部drop,然后重新导入。最后我发现在头一天下午6点跑的drop user 命令,到第二天早上还没完成,虽然说该用户有数十万个对象。最后通过将buffer cache设置为200m,重启数据库,然后继续执行drop user操作,发现5分钟即完成了。从原理上来讲很好理解这个问题。

     说到这个问题,那么就有用户询问,你们的MogDB是否存在这个问题呢?因此这里我想通过测试环境来简单测试并验证一下这个问题。

##share Buffer 1GB

    [omm@mogdb1 ~]$ gsql -c "SHOW shared_buffers"
    shared_buffers
    ----------------
    1GB
    (1 row)
    <br>
    [omm@mogdb1 ~]$ gsql -d enmotech -U enmotech -p26000
    Password for user enmotech:
    gsql ((MogDB 5.0.3 build 86d963ad) compiled at 2023-10-13 09:17:48 commit 0 last mr 1804 )
    Non-SSL connection (SSL connection is recommended when requiring high-security)
    Type "help" for help.
    <br>
    enmotech=> \timing on
    Timing is on.
    enmotech=>
    enmotech=> DO $$
    enmotech$> DECLARE
    enmotech$> counter INT = 1;
    BEGIN
    WHILE counter enmotech$> enmotech$> enmotech$> enmotech$> enmotech$> enmotech$>
    ANONYMOUS BLOCK EXECUTE
    Time: 1970.105 ms
    enmotech=>
    enmotech=> DO $$
    enmotech$> DECLARE
    counter INT = 1;
    tableName TEXT;
    BEGIN
    WHILE counter enmotech$> enmotech$> enmotech$> enmotech$> enmotech$> enmotech$> counter := counter + 1;
    END LOOP;
    END $$;enmotech$> enmotech$>
    ANONYMOUS BLOCK EXECUTE
    Time: 1044.290 ms
    enmotech=>
    enmotech=> DO $$
    enmotech$> DECLARE
    counter INT = 1;
    enmotech$> enmotech$> tableName TEXT;
    enmotech$> BEGIN
    enmotech$> WHILE counter tableName := 'test_table_' || counter;
    enmotech$> EXECUTE 'drop TABLE ' || tableName;
    enmotech$> counter := counter + 1;
    enmotech$> END LOOP;
    enmotech$> END $$;
    ANONYMOUS BLOCK EXECUTE
    Time: 1522.125 ms
    enmotech=>
    enmotech=>