PostgreSQLのインデックスの作成ステートメントを表示する方法はありますか


14

インデックスの膨張に悩まされているPostgreSQLでインデックスを再作成する必要があります。作成中にインデックスを使用できるようにする必要があるため、REINDEXを使用できません。新しい名前でインデックスを再作成してから、古いインデックスを削除します。インデックスを作成するために使用されたSQLステートメントを確認して、それをコピーする方法はありますか?



1
コマンドに追加することCONCURRENTLYを忘れないでくださいCREATE INDEX。そうすることで、テーブルを排他的にロックしません。
クレイグリンガー

回答:


26

実際には、pg_indexes次のようにシステムカタログビューをクエリするだけです。

SELECT indexdef FROM pg_indexes WHERE indexname = '...'

そして、それを定義するために使用したSQLステートメントを取得する必要があります。


4
インデックス名はスキーマごとにのみ一意であることに注意してください。追加したいかもしれませんAND schemaname = 'myschema'
Erwin Brandstetter、2015年

0

はい、インデックスを再作成するための完全なSQLステートメントはシステムカタログにあります。私が考えることができる最も簡単な方法は、pg_dump / pg_restoreを使用することです。

$ pg_dump -F c | pg_restore -I <your_index_name>

4
データベースが大きい場合、これはやり過ぎになる可能性があります:) -sデータと、わかっている場合はでテーブル名を除外するために追加することをお勧めし-tます。
dezso、2015年


-1

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句を比較しており、移行スクリプトを生成するときにそれは異なると考えています。これは私たちにとって問題です。


これは質問にまったく答えません。
ローレンツアルベ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.