2012-08-30 59 views
2

我正在試圖創建將在數據倉庫中的每一個架構上創建表的索引功能創建索引。這是劇本我到目前爲止:功能使用模式變量

create or replace function dwh.loan_type_id_indexing() 
returns void language plpgsql AS 
$PROC$ 
Declare 
     myschema varchar; 
       sql text;   
Begin 
    for myschema in 
     SELECT nspname 
      FROM pg_catalog.pg_namespace 
     where nspname not in ('information_schema', 'pg_catalog', 'pg_temp_1', 
           'pg_temp_7', 'pg_toast', 'pg_toast_temp_1', 
           'pg_toast_temp_7','public', 'c1', 'dwh', 
           'users', 'c2' 
          ) 
     order by nspname 
    loop   
     sql = 'CREATE INDEX '|| myschema || '_' ||'type_id ON '|| 
     myschema || '.' ||'.fact_tbl USING btree (loan_type_id)'; 

     execute sql; 

    end loop; 
END 
$PROC$ 
volatile; 

我知道這是不是正確的,但它會給你什麼,我試圖做我的思維過程。

+1

首先,這是一個好主意,用'quote_ident()''左右myschema',儘管在這種情況下,你可能知道的名字不需要引用。 –

+1

另外,你在最後的'END;'塊中丟失了一個分號 –

回答

2

而是篩選出的模式,並假定每隔一個有你想要的表格,爲他們查詢information_schema和遍歷結果列表:

select t.table_schema 
from information_schema.tables t inner join information_schema.columns c 
    on (t.table_schema = c.table_schema and t.table_name = c.table_name) 
where t.table_name = 'fact_loan' and c.column_name = 'loan_type_id' 
    and t.table_schema NOT LIKE 'pg_%' 
    and t.table_schema NOT IN ('information_schema', 'ad_delivery', 'dwh', 'users', 'wand'); 

你現在所擁有的一切,你需要創建一個索引通過循環查詢返回的記錄來獲取EXECUTE

你可能想RAISE NOTICE 'Creating index on %s.fact_loan.loan_type_id', table_schema;,讓您跟蹤進度,也爲建立索引可能需要一段時間。

如果你去篩選模式,你最好使用schemaname NOT LIKE 'pg_%' AND lower(shemaname) <> 'information_schema'如上所示。

順便說一句,我通常會發現這種工作更方便,從數據庫之外的腳本可以訪問多個連接,線程/多處理等.Png的psycopg2驅動程序的快速Python腳本可讓您這樣一起指數並列的4個這樣的東西;正確的數字將取決於您的磁盤配置。