PostgreSQL에서 색인에 대한 생성 문을 표시하는 방법이 있습니까


14

인덱스 팽창이 발생한 PostgreSQL에서 인덱스를 다시 만들어야합니다. 인덱스가 생성되는 동안 사용할 수 있어야하므로 REINDEX를 사용할 수 없습니다. 새 이름으로 색인을 다시 만든 다음 이전 이름을 삭제합니다. 인덱스를 만드는 데 사용 된 SQL 문을보고 복사 할 수있는 방법이 있습니까?



1
명령 을 추가 CONCURRENTLY해야 CREATE INDEX테이블에 배타적 잠금이 적용되지 않습니다.
Craig Ringer

답변:


26

실제로 pg_indexes다음과 같이 시스템 카탈로그 뷰를 쿼리하면 됩니다.

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

이를 정의하는 데 사용 된 SQL 문을 다시 가져와야합니다.


4
인덱스 이름은 스키마마다 고유 합니다. 을 추가 할 수 있습니다 AND schemaname = 'myschema'.
Erwin Brandstetter

0

예, 인덱스를 다시 작성하기위한 전체 SQL 문은 시스템 카탈로그에 있습니다. 내가 생각할 수있는 가장 간단한 방법은 pg_dump / pg_restore를 사용하는 것입니다.

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

4
데이터베이스가 크면 과잉 일 수 있습니다.) -s데이터를 제외하고 알려진 경우 테이블 이름을 제외 하도록 추가 할 수 있습니다 -t.
dezso

-1

더 간단하게 모든 것을 원한다면 (모든 인덱스) ...

=# SELECT indexdef FROM pg_indexes;

-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은 두 인덱스의 where 절을 비교하고 마이그레이션 스크립트를 생성 할 때 다른 것으로 생각합니다. 그것은 우리에게 문제입니다.


이것은 전혀 질문에 대답하지 않습니다.
Laurenz Albe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.