2013-05-30 75 views
1

我有大的postgres表,它是分區的。
該表已建立索引。
分別爲每個分區創建索引。
我的問題是:對postgres分區表的索引行爲(創建和刪除)

當創建索引時,它們也會在子表上創建。
刪除它時,只會刪除drop語句中的指定索引。
並顯示

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

如何砸孩子paritions指標,沒有一個接一個放棄它(因爲我有255個表)

回答

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」的正常情況)。這可能不是正是你需要的,但它可能給你的想法

+0

是做同樣的,運行下面的查詢和迭代DROP INDEX每個值:SELECT {列} FROM pg_indexes WHERE 表名LIKE「{ TABLE_NAME} %%'; –

+0

很高興你找到了一個方法來完成它。這是很多子表索引。關於我寫的函數唯一令人煩惱的部分是引用轉義... – zxq9

相關問題