インデックスの膨張に悩まされているPostgreSQLでインデックスを再作成する必要があります。作成中にインデックスを使用できるようにする必要があるため、REINDEXを使用できません。新しい名前でインデックスを再作成してから、古いインデックスを削除します。インデックスを作成するために使用されたSQLステートメントを確認して、それをコピーする方法はありますか?
CONCURRENTLY
を忘れないでくださいCREATE INDEX
。そうすることで、テーブルを排他的にロックしません。
インデックスの膨張に悩まされているPostgreSQLでインデックスを再作成する必要があります。作成中にインデックスを使用できるようにする必要があるため、REINDEXを使用できません。新しい名前でインデックスを再作成してから、古いインデックスを削除します。インデックスを作成するために使用されたSQLステートメントを確認して、それをコピーする方法はありますか?
CONCURRENTLY
を忘れないでくださいCREATE INDEX
。そうすることで、テーブルを排他的にロックしません。
回答:
実際には、pg_indexes
次のようにシステムカタログビューをクエリするだけです。
SELECT indexdef FROM pg_indexes WHERE indexname = '...'
そして、それを定義するために使用したSQLステートメントを取得する必要があります。
AND schemaname = 'myschema'
。
はい、インデックスを再作成するための完全なSQLステートメントはシステムカタログにあります。私が考えることができる最も簡単な方法は、pg_dump / pg_restoreを使用することです。
$ pg_dump -F c | pg_restore -I <your_index_name>
-s
データと、わかっている場合はでテーブル名を除外するために追加することをお勧めし-t
ます。
indexdef
部分インデックスの場合、作成ステートメントと同じではありません。たとえば、次のステートメントでインデックスを作成するとします。
CREATE INDEX item_orgunit_idx ON items (orgunit_id) WHERE type IN ('invoice', 'purchaseorder', 'beanpayment');
postgresは次のindexdefを生成します:
CREATE INDEX item_orgunit_idx ON public.items USING btree (orgunit_id) WHERE ((type)::text = ANY ((ARRAY['invoice'::character varying, 'purchaseorder'::character varying, 'beanpayment'::character varying])::text[]))
postgres indexdefにはすべての推定型があり、おそらくそれよりも優れていますが、ORMは2つのインデックスのwhere句を比較しており、移行スクリプトを生成するときにそれは異なると考えています。これは私たちにとって問題です。