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'、上記のように使用することをお勧めします。

ところで、私は通常、この種のジョブは、複数の接続、スレッド化/マルチプロセッシングなどにアクセスできるデータベース外のスクリプトから行う方が便利だと思いますpsycopg2.Pgのドライバーを備えた簡単なPythonスクリプトを使用すると、このようなことを一緒に行うことができます.これにより、インデックスは一度に 4 つと並行して構築されます。適切な数は、ディスク構成によって異なります。

于 2012-08-30T23:35:22.260 に答える