postgres分区表上的索引行为(创建和删除)

时间:2013-05-30 07:15:29

标签: postgresql indexing partitioning

我有一个大的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个子表)

1 个答案:

答案 0 :(得分:0)

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

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”。这可能不是您所需要的,但它可能会给您提供想法