2012-08-30 72 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个这样的东西;正确的数字将取决于您的磁盘配置。