HypoPG는 가상 지수에 대한 지원을 추가하는 PostgreSQL 확장자입니다.
가설 적 - 또는 가상 - 색인은 실제로 존재하지 않으므로 CPU, 디스크 또는 리소스를 작성하는 데 비용이 들지 않는 인덱스입니다. PostgreSQL이 이러한 인덱스를 사용할 수 있는지 여부를 알 수 있기 때문에 특정 인덱스가 문제가있는 쿼리의 성능을 향상시킬 수 있는지 아는 데 유용합니다.
자세한 정보는 공식 문서를 참조하십시오.
다른 일반 정보는이 블로그 게시물을 참조 할 수도 있습니다.
sudo make installCREATE EXTENSION hypopg; HypoPG는 생성 된 객체에 저장된 데이터가 없기 때문에 확장 업그레이드 스크립트를 제공하지 않습니다. 따라서 먼저 확장자를 삭제 한 다음 새 버전을 얻으려면 다시 만들어야합니다.
참고 : 가상 지수는 단일 백엔드에 포함되어 있습니다. 따라서 여러 가상의 지수를 추가하면 EXPLAIN 하는 동시 연결은 가상의 지수에 의해 방해받지 않습니다.
간단한 테스트 사례를 가정합니다.
rjuju=# CREATE TABLE hypo AS SELECT id, 'line ' || id AS val FROM generate_series(1,10000) id;
rjuju=# EXPLAIN SELECT * FROM hypo WHERE id = 1;
QUERY PLAN
-------------------------------------------------------
Seq Scan on hypo (cost=0.00..180.00 rows=1 width=13)
Filter: (id = 1)
(2 rows)
가상 색인을 생성하는 가장 쉬운 방법은 hypopg_create_index 함수를 Arg와 같은 정기적으로 CREATE INDEX 문으로 사용하는 것입니다.
예를 들어:
rjuju=# SELECT * FROM hypopg_create_index('CREATE INDEX ON hypo (id)');
참고 : CREATE INDEX 문의 일부 정보는 제공된 경우 인덱스 이름과 같은 무시됩니다. 무시 된 정보 중 일부는 향후 릴리스에서 처리됩니다.
자신의 백엔드에서 사용 가능한 가상 지수를 확인할 수 있습니다.
rjuju=# SELECT * FROM hypopg_list_indexes ;
indexrelid | index_name | schema_name | table_name | am_name
------------+-------------------------------+-------------+------------+---------
50573 | <50573>btree_hypo_id | public | hypo | btree
사용하려는 CREATE INDEX 명령도 인용 해야하는 경우 달러 인용문을 사용하여 권장됩니다. 예를 들어:
rjuju=# SELECT * FROM hypopg_create_index($$CREATE INDEX ON hypo (id) WHERE val = 'line 1'$$);
가상 지수에 대한 더 많은 기술 정보가 필요한 경우 hypopg() 함수는 pg_index 시스템 카탈로그와 유사한 방식으로 가상 색인을 반환합니다.
그리고 지금, 이전의 EXPLAIN 진술이 그러한 색인을 사용할 것인지 살펴 보겠습니다.
rjuju=# EXPLAIN SELECT * FROM hypo WHERE id = 1;
QUERY PLAN
------------------------------------------------------------------------------------
Index Scan using <41072>hypo_btree_hypo_id on hypo (cost=0.29..8.30 rows=1 width=13)
Index Cond: (id = 1)
(2 rows)
물론 ANALYZE 없이만 EXPLAIN 가상의 지수를 사용합니다.
rjuju=# EXPLAIN ANALYZE SELECT * FROM hypo WHERE id = 1;
QUERY PLAN
-------------------------------------------------------------------------------------------------
Seq Scan on hypo (cost=0.00..180.00 rows=1 width=13) (actual time=0.036..6.072 rows=1 loops=1)
Filter: (id = 1)
Rows Removed by Filter: 9999
Planning time: 0.109 ms
Execution time: 6.113 ms
(5 rows)
백엔드의 가상 색인을 제거하려면 hypopg_list_indexes view hypopg_reset() 호출하여 한 번에 모두 제거하거나 현재 연결을 닫는 OID와 함께 hypopg_drop_index(indexrelid) 함수를 사용할 수 있습니다.
위의 사례를 계속하면 hide existing indexes 수 있지만 hypopg_reset() 사용하여 처음에는 다른 인덱스의 이전 효과를 지우려면됩니다.
두 가지 실제 인덱스를 만들고 EXPLAIN 실행하십시오.
rjuju=# SELECT hypopg_reset();
rjuju=# CREATE INDEX ON hypo(id);
rjuju=# CREATE INDEX ON hypo(id, val);
rjuju=# EXPLAIN SELECT * FROM hypo WHERE id = 1;
QUERY PLAN
----------------------------------------------------------------------------------
Index Only Scan using hypo_id_val_idx on hypo (cost=0.29..8.30 rows=1 width=13)
Index Cond: (id = 1)
(2 rows)
쿼리 계획은 hypo_id_val_idx 인덱스를 사용하고 있습니다. hypopg_hide_index(oid) 사용하여 인덱스 중 하나를 숨기십시오.
rjuju=# SELECT hypopg_hide_index('hypo_id_val_idx'::REGCLASS);
rjuju=# EXPLAIN SELECT * FROM hypo WHERE id = 1;
QUERY PLAN
-------------------------------------------------------------------------
Index Scan using hypo_id_idx on hypo (cost=0.29..8.30 rows=1 width=13)
Index Cond: (id = 1)
(2 rows)
쿼리 계획은 다른 색인 hypo_id_idx 사용하고 있습니다. hypopg_hide_index(oid) 사용하여 숨기십시오.
rjuju=# SELECT hypopg_hide_index('hypo_id_idx'::REGCLASS);
rjuju=# EXPLAIN SELECT * FROM hypo WHERE id = 1;
QUERY PLAN
-------------------------------------------------------
Seq Scan on hypo (cost=0.00..180.00 rows=1 width=13)
Filter: (id = 1)
(2 rows)
이제 쿼리 계획이 Seq Scan 으로 다시 변경됩니다. hypopg_unhide_index(oid) 사용하여 색인을 복원하십시오.
rjuju=# SELECT hypopg_unhide_index('hypo_id_idx'::regclass);
rjuju=# EXPLAIN SELECT * FROM hypo WHERE id = 1;
QUERY PLAN
-------------------------------------------------------------------------
Index Scan using hypo_id_idx on hypo (cost=0.29..8.30 rows=1 width=13)
Index Cond: (id = 1)
(2 rows)
물론 가상의 지수를 숨길 수도 있습니다.
rjuju=# SELECT hypopg_create_index('CREATE INDEX ON hypo(id)');
rjuju=# EXPLAIN SELECT * FROM hypo WHERE id = 1;
QUERY PLAN
------------------------------------------------------------------------------------
Index Scan using "<12659>btree_hypo_id" on hypo (cost=0.04..8.05 rows=1 width=13)
Index Cond: (id = 1)
(2 rows)
rjuju=# SELECT hypopg_hide_index(12659);
rjuju=# EXPLAIN SELECT * FROM hypo WHERE id = 1;
QUERY PLAN
-------------------------------------------------------
Seq Scan on hypo (cost=0.00..180.00 rows=1 width=13)
Filter: (id = 1)
(2 rows)
hypopg_hidden_indexes() 또는 hypopg_hidden_indexes 보기를 사용하여 어떤 인덱스가 숨겨져 있는지 확인할 수 있습니다.
rjuju=# SELECT * FROM hypopg_hidden_indexes();
indexid
---------
526604
526603
12659
(3 rows)
rjuju=# SELECT * FROM hypopg_hidden_indexes;
indexrelid | index_name | schema_name | table_name | am_name | is_hypo
------------+----------------------+-------------+------------+---------+---------
12659 | <12659>btree_hypo_id | public | hypo | btree | t
526603 | hypo_id_idx | public | hypo | btree | f
526604 | hypo_id_val_idx | public | hypo | btree | f
(3 rows)
기존의 모든 인덱스를 복원하려면 hypopg_unhide_all_indexes() 함수를 사용할 수 있습니다. 기존 인덱스를 숨기는 기능은 현재 세션의 설명 명령에만 적용되며 다른 세션에는 영향을 미치지 않습니다.