2016-08-22 5 views
1

필자는 관계형 데이터베이스에 처음으로 익숙한 브랜드이며 대규모 (기존) 데이터베이스를 쿼리하기위한 기본 작업 환경을 설정하는 데 도움이 필요합니다. 필자는 PGAdmin을 통해 원격 서버에 연결했지만 모든 기본 쿼리는 매우 느립니다.초급 PostgreSQL : 대규모 기존 데이터베이스를 쿼리하기위한 환경 설정

쿼리

SELECT to_char(created, 'YYYY-MM-DD'), user_id 
FROM transactions 
WHERE type = 'purchase' 
AND created > NOW() AT TIME ZONE 'US/Mountain' - INTERVAL '1 month' 
ORDER BY created; 

EXPLAIN(BUFFERS, ANALYZE) 출력 :

내 제한된 지식에
Index Scan using payments_transaction_created_42e34d6ca1e04ffe_uniq 
     on  payments_transaction (cost=0.44..339376.18 rows=481811 width=24) (actual time=2.643..49422.733 rows=511058 loops=1) 
Index Cond: (created > (timezone('US/Mountain'::text, now()) - '1 mon'::interval)) 
Filter: ((type)::text = 'purchase'::text) 
Rows Removed by Filter: 955691 
Buffers: shared hit=405597 read=295625 written=764 
Planning time: 0.111 ms 
Execution time: 49569.324 ms 

, 실행 시간은 나에게 너무 긴 것 같다.

가능한 가장 효율적인 환경을 만들기 위해 어떤 단계를 밟아야합니까? 데이터베이스의 로컬 복사본을 만드는 것이 더 빠른 쿼리를 의미합니까? 그러한 비효율을 초래할 수있는 다른 요소가 있습니까?

나는 데이터베이스에 새로운 것이므로 너무 단순한 대답이 없음을 기억하십시오.

+1

https://stackoverflow.com/tags/postgresql-performance/info 다음 질문을 읽고 [편집] 누락 된 정보를 추가하십시오. 특히 쿼리에 대해 [explain (analyze, verbose)'] (https://www.postgresql.org/docs/current/static/sql-explain.html)의 출력을 게시하십시오. –

+0

@a_horse_with_no_name 팁에 감사드립니다. 게시물을 업데이트했습니다. 도움이 될만한 정보가 더 있다면 알려주십시오. – gidgicken

답변

1

귀하의 질의는 transactions(created)에 색인을 사용하는 것 같습니다. 2 배를 버리는 동안 0.5M의 행을 반환합니다.

당신이 당신의 텍스트와 타임 스탬프 열 모두에 인덱스를 추가하는 혜택을 누릴 수 있습니다 type 열 전체에서 값의 분포에 따라 :

CREATE INDEX ON transactions(type, created); 

엄지 손가락의 규칙 인덱스를 추가하는 것은 평등 사업자에 대한 최초의 인덱스에있는 동안 그 다음 날짜. 실제로 쿼리를 많이 빠르게 할 수도 있습니다.하지만 이전에 값 분산에 따라 언급했듯이.

사용하여 인덱스를 생성 한 후 테이블 통계를 업데이트하는 것을 잊지 마십시오 : 데이터베이스의 로컬 복사본에

ANALYZE transactions; 

테스트를 당신이 네트워크를 통해 패키지를 전송하지 않기 때문에 빠른 처리를 의미한다. 대신 모든 것이 로컬에서 처리되고 있지만 이것은 쿼리에 대한 많은 협상이 아니어야하며 가능한 한 많은 양의 비교 가능한 환경에서 항상 테스트하는 것이 좋습니다.