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;

我知道这是不正确的,但它会给你我正在尝试做的事情的思考过程。

4

1 回答 1

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'所示。

顺便说一句,我通常发现从数据库外部的脚本中执行此类工作更方便,在该脚本中我可以访问多个连接、线程/多处理等。带有psycopg2Pg 驱动程序的快速 Python 脚本可以让你把这样的事情组合在一起索引是否并行构建,一次说 4 个;正确的数字取决于您的磁盘配置。

于 2012-08-30T23:35:22.260 回答