REINDEX VLABEL과 REINDEX ELABEL#
레이블의 모든 인덱스를 다시 만듭니다. 인덱스를 끄둔 레이블이 그것을 되찾는 방법도 이것입니다.
개요#
REINDEX [ ( option [, ... ] ) ] ELABEL label_name
where option is one of:
CONCURRENTLY [ boolean ]
TABLESPACE new_tablespace
VERBOSE [ boolean ]
굵게 키워드 · 기울임 직접 채우는 자리 · [ ] 생략 가능 · ... 반복 가능. 구문 표기 규약을 참고하십시오.
설명#
REINDEX VLABEL은 정점 레이블의 모든 인덱스를, REINDEX ELABEL은 간선 레이블의 모든 인덱스를 다시
만듭니다. 그 레이블 자신의 인덱스, 거기 걸린 모든 속성 인덱스, 그리고 그 TOAST 관계의 인덱스까지
포함합니다. 다시 만들면 무효 상태였던 인덱스가 다시 유효로 표시되므로, 이 문장이 DISABLE INDEX에
대응하는 것이 됩니다.
ENABLE INDEX는 없습니다. 적재하고 나서 만드는 순서는
ALTER VLABEL <label> DISABLE INDEX, 그다음 적재, 그다음 REINDEX VLABEL <label>입니다.
레이블은
graph_path가 지정한 그래프에서 찾습니다. 그 이름은 수식할 수 없습니다.REINDEX VLABEL rebuildme.movie는 구문 오류입니다.각 문장은 한 종류의 레이블만 받습니다. 간선 레이블에
REINDEX VLABEL을 쓰면REINDEX VLABEL cannot REINDEX edge label로 실패하고, 반대의 경우도 그에 맞는 메시지로 실패합니다.옵션은 레이블 키워드 앞의 괄호 안에 놓습니다.
REINDEX TABLE은 키워드만 쓰는 표기를 받지만, 여기서REINDEX VLABEL CONCURRENTLY movie는 구문 오류입니다.옛 표기인
REINDEX LABEL은 없습니다.LABEL자리에서 구문 오류입니다.
매개변수#
- option
CONCURRENTLY,TABLESPACE,VERBOSE중 하나이며, 괄호 안에 쉼표로 구분해 씁니다.REINDEX에서와 같은 뜻입니다. 쓰기를 잠그지 않고 만들기, 다시 만든 인덱스를 다른 테이블스페이스로 옮기기, 인덱스가 끝날 때마다 보고하기입니다.CONCURRENTLY와VERBOSE는 불리언을 명시적으로 받기도 하므로,(VERBOSE false)는VERBOSE를 쓰지 않은 것과 같습니다.- label_name
인덱스를 다시 만들 레이블이며,
graph_path가 지정한 그래프 안에서 찾습니다.
예제#
예제는 예제 데이터셋을 쓰지 않고 자체 그래프인
rebuildme를 만들고, 끝에서 그것을 지웁니다.
CREATE GRAPH rebuildme;
SET graph_path = rebuildme;
CREATE VLABEL movie;
CREATE ELABEL directed;
CREATE PROPERTY INDEX movie_title_idx ON movie (title);
CREATE (:movie {title: 'Arrival'});
대량 적재 뒤에 레이블의 인덱스 만들기#
인덱스를 끄면 인덱스는 자리에 남되 무효 상태가 되므로, 적재가 그것을 유지하지 않습니다:
ALTER VLABEL movie DISABLE INDEX;
\d rebuildme.movie
Table "rebuildme.movie"
Column | Type | Collation | Nullable | Default
------------+---------+-----------+----------+-----------------------------------------------------------------------------------------------
id | graphid | | not null | graphid(graph_labid('rebuildme.movie'::cstring), nextval('rebuildme.movie_id_seq'::regclass))
properties | jsonb | | not null | jsonb_build_object()
Indexes:
"movie_pkey" PRIMARY KEY, btree (id) INVALID
"movie_title_idx" btree ((properties.'title')) INVALID
Inherits: rebuildme.ag_vertex
두 인덱스 모두 INVALID로 표시됩니다. 레이블의 기본 키와 속성 인덱스 모두입니다. 문장 하나가
그것을 만듭니다:
REINDEX VLABEL movie;
REINDEX
\d rebuildme.movie
Table "rebuildme.movie"
Column | Type | Collation | Nullable | Default
------------+---------+-----------+----------+-----------------------------------------------------------------------------------------------
id | graphid | | not null | graphid(graph_labid('rebuildme.movie'::cstring), nextval('rebuildme.movie_id_seq'::regclass))
properties | jsonb | | not null | jsonb_build_object()
Indexes:
"movie_pkey" PRIMARY KEY, btree (id)
"movie_title_idx" btree ((properties.'title'))
Inherits: rebuildme.ag_vertex
인덱스가 다시 만들어지는 것을 하나씩 보기#
ALTER ELABEL directed DISABLE INDEX;
REINDEX (VERBOSE) ELABEL directed;
INFO: index "pg_toast_60285_index" was reindexed
DETAIL: CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s
INFO: index "directed_id_idx" was reindexed
DETAIL: CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s
INFO: index "directed_start_idx" was reindexed
DETAIL: CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s
INFO: index "directed_end_idx" was reindexed
DETAIL: CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s
REINDEX
간선 레이블의 인덱스 세 개가 모두 다시 만들어지고, 지나치게 큰 속성 맵을 담는 TOAST 관계의 인덱스도 그렇습니다. TOAST 인덱스 이름에는 그 테이블의 OID가 들어가므로 실행마다 달라집니다.
쓰기를 잠그지 않고 다시 만들기#
REINDEX (CONCURRENTLY) VLABEL movie;
REINDEX
REINDEX (TABLESPACE pg_default) VLABEL movie;
REINDEX
알아 둘 만한 거부 사례#
각 문장은 한 종류의 레이블만 받습니다:
REINDEX VLABEL directed;
ERROR: REINDEX VLABEL cannot REINDEX edge label
REINDEX ELABEL movie;
ERROR: REINDEX ELABEL cannot REINDEX vertex label
REINDEX LABEL은 없습니다:
REINDEX LABEL movie;
ERROR: syntax error at or near "LABEL"
LINE 1: REINDEX LABEL movie;
^
그 이름에 그래프를 붙일 수는 없습니다:
REINDEX VLABEL rebuildme.movie;
ERROR: syntax error at or near "."
LINE 1: REINDEX VLABEL rebuildme.movie;
^
그리고 CONCURRENTLY는 괄호 안에 놓입니다:
REINDEX VLABEL CONCURRENTLY movie;
ERROR: syntax error at or near "CONCURRENTLY"
LINE 1: REINDEX VLABEL CONCURRENTLY movie;
^
없는 레이블은 수식된 이름으로 보고됩니다. graph_path가 이미 그것에 적용됐기 때문입니다:
REINDEX VLABEL nosuch;
ERROR: relation "rebuildme.nosuch" does not exist
마지막으로 예제가 만든 그래프를 지웁니다:
DROP GRAPH rebuildme CASCADE;
참고#
레이블의 테이블에 REINDEX TABLE을 쓰면 같은 일을 하고 그러기 위해 어떤 설정도 필요하지 않으므로,
REINDEX TABLE rebuildme.movie도 꺼 둔 레이블의 인덱스를 되살립니다. 그래도 레이블 쪽 표기를 쓰는
편이 낫습니다. 그 레이블이 이름으로 부른 종류가 맞는지 검사하고, 스키마로 수식한 이름이 아니라
graph_path에서 해석한 이름을 받기 때문입니다.
그래프의 스키마에 REINDEX SCHEMA를 쓰면 그 그래프의 모든 인덱스가 다시 만들어지고,
REINDEX INDEX는 이름으로 하나를 다시 만듭니다. 둘 다 평범한 SQL 문장이고 레이블을 아는 형태는
없습니다.
호환성#
ISO/IEC 39075 (GQL)#
GQL에는 인덱스 DDL도, 인덱스를 다시 만드는 것도 없습니다. 표준의 카탈로그 변경 문장은 스키마·그래프·그래프 타입(§12)에 한정되므로, 이 두 표기는 AgensGraph 자신의 것입니다.
PostgreSQL#
REINDEX VLABEL과 REINDEX ELABEL은 대상이 레이블인 REINDEX TABLE입니다. 옵션은 REINDEX 자신의
옵션이고 뜻도 같습니다. 표기에서 두 가지 차이가 중요합니다. 대상 이름은 graph_path에서 해석되며
스키마로 수식할 수 없습니다. 그리고 CONCURRENTLY는 괄호 안의 옵션으로만 받아들여지고, 레이블
키워드 뒤에 키워드만 쓰는 형태로는 결코 받아들여지지 않습니다.