2014-01-30 2 views
1

이 속도가 느립니까? 4 열이있는 테이블이 있습니다. ID 성 Coach 도시postgresql 데이터베이스 삽입이 너무 오래 걸림

나는 각 열에 데이터가 들어있는 300 개의 행을 추가하는 데이터 추가 버튼이 있으므로 총 1200 개의 레코드가 있습니다.

물리적으로 데이터를 추가하는 데 4 분 이상이 소요됩니다 (즉, 버튼을 눌렀을 때부터 완료된 메시지 상자가 표시 될 때까지).

내가 ADSL2에 + 호주에서 오전는 속도 테스트는이 후에 수행 내가 호주 인터넷이 농담을 알고 28ms 핑 14.12Mbps 다운로드 0.49Mbps 업로드

를 얻었으나, 이것은 정말 느린!

내 인터넷 업로드 속도 때문인가요?

+1

거래 내에서 이러한 삽입 작업을 수행하고 있습니까? (자동 커밋 해제) – nurettin

+0

아니요, 단순히 반복되는 삽입 –

+0

은 속도에 큰 변화를 줄 것입니까? –

답변

1

요청 및 응답 수를 줄이면 ping 시간이 적절하지 않게되므로 사용하는 삽입 문 수를 줄이면 가장 큰 이점을 얻을 수 있습니다.

여기에 예를 참조하십시오 http://www.postgresql.org/docs/9.0/static/dml-insert.html 당신이 삽입 테이블에 인덱스가 있음을

1

그것의 수. 삽입 조작이 수행 될 때 각 색인을 갱신해야 함을 기 o하십시오.

당신이 시도 할 수 :

select * from pg_indexes where tablename = 'your_table'; 

의 모든 인덱스를 나열합니다.

각 삽입에 대한 연결을 열거 나 닫으면 성능이 저하됩니다. 단일 삽입 SQL 쿼리를 고려 했습니까?

INSERT INTO "table" (col1, col2, col3) 
    VALUES (1, 2, 3) , (3, 4, 5) , (6, 7, 8); 
1

개별 트랜잭션에서 개별 삽입 작업을 수행하는 것은 가능한 최악의 성능입니다. 삽입 된 행당 최소 하나의 네트워크 왕복이 발생하고 300 행의 트래픽이 유의미하게 발생합니다. 대기 시간만으로는 약 10 초가 걸리며, 인 경우 인당 한 번의 왕복을하는 경우 28ms 대기 시간은 더 큰 패킷에 적용됩니다. 그것은 COMMIT s에서 시간을 고려하지 않습니다. 데이터베이스 드라이버는 별도의 BEGINCOMMIT 명령을 보내는 경우

, 즉 300 BEGIN의 300 COMMIT 초 동안 혼자 네트워크 대기 시간에 소요되는 또 다른 20 대입니다.

단일 트랜잭션 내에서 여러 값의 삽입을 청크로 수행합니다. 또는 더 나은 방법은 데이터를 COPY으로 스트리밍하는 것입니다. 그렇게하면 왕복 시간을 최소화하여 네트워크 대기 시간의 영향을 줄이고 커밋 비용의 영향을 줄일 수 있습니다.

자세한 내용과 유용한 링크는 How to speed up insertion performance in PostgreSQL을 참조하십시오.

몇 백 밀리 초 안에 이와 같은 배치를 수행 할 수 있어야합니다.

관련 문제