0

PostgreSQL 9 데이터베이스에는 PK (oid enabled) 및 기타 필드 인 직렬 필드 X가 포함 된 테이블이 있습니다.postgresql - pk 대 고유 인덱스

postgres의 pgadmin을 해당 테이블과 함께 사용하면 쿼리에 30 초가 걸립니다.

동일한 필드 X에 고유 색인을 추가하면 pgadmin의 동일한 쿼리에 3 초가 걸립니다. http://www.postgresql.org/docs/current/static/indexes-unique.html

이 왜 명시 적 인덱스 변화를 않습니다

PK와 암시 적으로 인덱스입니까?

이것은 pgadmin 문제입니까?

PK 필드에 대해 명시 적 색인이 필요합니까, 아니요?

+1

어떤 차이 PRIMARY하지 않습니다 안 KEY는 고유 인덱스와 not null 제약 조건으로 구현됩니다. 기본 키가 정의되어 있습니까 (직렬 키가 자동으로 기본 키가 아닌지)? DDL 문을 게시 할 수 있습니까? – Eelke

+2

버전 9가 존재하지 않습니다. 9.0, 9.1 및 9.2의 매우 다른 버전의 PostgreSQL이 있습니다. oid는 버전 8.1 (2005 년 출시)부터 사용되지 않으므로 왜 필요합니까? –

+0

'\ d my_table'의 출력을 psql 프롬프트에 게시하십시오. –

답변

1

여기 차이 (페이지 9.1.2), 나는 그것이 유물 (스키마, 대소 무의미?)

DROP SCHEMA tmp CASCADE; 
CREATE SCHEMA tmp ; 
SET search_path=tmp; 

CREATE TABLE lutser 
     (id INTEGER NOT NULL PRIMARY KEY 
     , val INTEGER NOT NULL 
     ); 
INSERT INTO lutser(id,val) 
SELECT g, g %31 
FROM generate_series(1,100000) g 
     ; 

DELETE FROM lutser WHERE random() < .5; 

VACUUM ANALYZE lutser; 

EXPLAIN ANALYZE 
SELECT COUNT(*) FROM lutser 
WHERE id >= 1000 AND id < 2000 
     ; 

CREATE INDEX lutser_id ON lutser(id); 

VACUUM ANALYZE lutser; 

EXPLAIN ANALYZE 
SELECT COUNT(*) FROM lutser 
WHERE id >= 1000 AND id < 2000 
     ; 

결과라고 생각합니다 :

NOTICE: drop cascades to table tmp.lutser 
DROP SCHEMA 
CREATE SCHEMA 
SET 
NOTICE: CREATE TABLE/PRIMARY KEY will create implicit index "lutser_pkey" for table "lutser" 
CREATE TABLE 
INSERT 0 100000 
DELETE 50051 
VACUUM 
                  QUERY PLAN 
------------------------------------------------------------------------------------------------------------------------------- 
Aggregate (cost=20.28..20.29 rows=1 width=0) (actual time=0.294..0.295 rows=1 loops=1) 
    -> Index Scan using lutser_pkey on lutser (cost=0.00..19.03 rows=499 width=0) (actual time=0.015..0.216 rows=487 loops=1) 
     Index Cond: ((id >= 1000) AND (id < 2000)) 
Total runtime: 0.343 ms 
(4 rows) 

CREATE INDEX 
VACUUM 
                 QUERY PLAN 
----------------------------------------------------------------------------------------------------------------------------- 
Aggregate (cost=19.03..19.04 rows=1 width=0) (actual time=0.232..0.232 rows=1 loops=1) 
    -> Index Scan using lutser_id on lutser (cost=0.00..17.79 rows=497 width=0) (actual time=0.033..0.185 rows=487 loops=1) 
     Index Cond: ((id >= 1000) AND (id < 2000)) 
Total runtime: 0.266 ms 
(4 rows) 
1

쿼리 계획 (pgAdmin에서 올바르게 기억하는 경우 쿼리 창에서 EXPLAIN 옵션을 선택할 수 있음)을 살펴보면 자세한 내용을 확인할 수 있습니다. 두 번째 쿼리와 함께 postgresql 캐시에서 데이터를 읽는 것이 아니라 쿼리가 실행되는 순서에 관계없이 일관되게 작동하는 것이 확실합니까?

또한 많은 데이터를 삭제/삽입/조작 한 후에 vacuum을 실행하면 큰 차이가 발생할 수 있습니다. 나는 (불필요한) 색인을 추가하는 것이 원인이라면 놀랄 것입니다. @Eelke가 지적한대로 해당 열에 이미 정의 된 PK가 있습니까?

+0

감사합니다. 나는 분석을 실행하고 실행 계획을 점검 할 것입니다. 그렇습니다, PK 제한이 있습니다. 그래서 나는 엄청난 성능 차이로 인해 당황 스러웠습니다. – kcris