【问题标题】:Index behaviour (create and drop) on postgres partitioned tablespostgres 分区表上的索引行为(创建和删除)
【发布时间】:2013-05-30 07:15:29
【问题描述】:

我有一个大的 postgres 表,它是分区的。
该表已编入索引。
为每个分区分别创建索引。
我的问题是:

创建索引时,它们也会在子表上创建。
删除时仅删除 drop 语句中的指定索引。
并显示

WARNING:  Only dropped the index "my_index_name"
HINT:  To drop other indexes on child partitions, drop each one explicitly.
DROP INDEX

如何删除子分区上的索引,而不是一一删除(因为我有 255 个子表)

【问题讨论】:

    标签: postgresql indexing partitioning


    【解决方案1】:

    有点乱,但只要索引没有被任何约束使用,你就可以这样做:

    CREATE OR REPLACE FUNCTION drop_child_indexes(parent text, partial text)
        RETURNS VOID AS
      $$
      DECLARE
        q text;
        x RECORD;
      BEGIN
        q := 'SELECT indexname FROM pg_catalog.pg_indexes WHERE tablename ~ '''
          || partial
          || ''' AND tablename != '''
          || parent || '''';
        FOR x IN EXECUTE q LOOP
          EXECUTE 'DROP INDEX ' || x.indexname;
          RAISE NOTICE 'Dropping index %', x.indexname;
        END LOOP;
      END;
      $$ LANGUAGE plpgsql;
    

    “父”变量是您想要删除索引的任何表,“部分”变量是与您的分区表名称匹配的子字符串(这是假设正常情况分区被命名为“some_common_prefix_2013_04”)。这可能不是你所需要的,但它可能会给你一些想法

    【讨论】:

    • 是的,也是这样做的,运行以下查询并为每个值迭代 DROP INDEX:SELECT {column} FROM pg_indexes WHERE tablename LIKE '{table_name}%%';
    • 很高兴您找到了完成它的方法。这是很多子表索引。我写的函数唯一真正令人讨厌的部分是引号转义......
    猜你喜欢
    • 1970-01-01
    • 2022-08-04
    • 1970-01-01
    • 2020-12-11
    • 2022-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多