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

标签 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 个子表)

最佳答案

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

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

关于postgresql - postgres 分区表上的索引行为(创建和删除),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16830106/

相关文章:

sql - PostgreSQL:将列提取到单独的表中并使用相关键更新其他列

postgresql - 让 Doctrine 2 ORM 通过针对具有连接的表的自定义查询来混合对象

mysql - 如何进行多列搜索?

apache-spark - 我什么时候应该重新分区 RDD?

postgreSQL 备份表和 View

postgresql - 如何使用 psql\copy 元命令忽略错误

mongodb - MongoDB聚合框架的索引优化

indexing - 使用 Sequelize 在单个迁移中创建表并添加索引

mysql - 对 MySQL 表进行分区后创建索引?

apache-spark - Effect PreservesPartitioning RDD true/false 为 mapPartitions 提供相同的结果