며칠 전, 나는 꽤 표준 장고 설정과 예기치 않은 성능 문제로 달렸다. 다가올 기능을 위해 매시간 테이블을 재생성해야하는데, 디스크의 약 100,000 행, 디스크의 9M, pgAdmin에 따른 10M 색인이 포함됩니다.는 PostgreSQL을, 외래 키 삽입 속도 및 장고
문제는별로 삽입한다는 것입니다 말 그대로 100 % 디스크 바쁜 시간 3 분까지 나이, 무슨 일이든하는 방법. 그것은 프로덕션 사이트에서 원하는 것이 아닙니다. 삽입이 트랜잭션에 있거나, 일반 삽입, 다중 행 삽입, COPY FROM 또는 심지어 INSERT INTO t1 SELECT * FROM t2를 통해 발행되었는지는 중요하지 않습니다. 이 장고의 잘못이 아닙니다 알아 차리지 후
, 나는 시행 착오 경로를 따라, 그리고 야, 문제는 모든 외부 키를 삭제 한 후 사라졌다! 3 분 대신에 INSERT INTO SELECT FROM은 실행하는데 1 초도 채 걸리지 않았습니다. 디스크의 테이블 < = 20M에 대해서는 그리 놀라운 일이 아닙니다. 은입니다. PostgreSQL은 3 개의 외래 키를 사용하여 삽입을 180x 느리게 처리합니다.
오, 디스크 활동은 모든 것이 RAM에 캐시되므로 순수한 쓰기였습니다. 쓰기 만 디스크로 이동합니다. 3MB/sec * 180은이 새로운 테이블이 디스크에서 차지하는 20MB보다 많은 데이터이므로 PostgreSQL은 참조 된 테이블의 모든 행을 다루기 위해 매우 열심히 노력하고있는 것처럼 보입니다. 180 년대에는 WAL이 없었고, 장고에서는 직접 psql을 테스트하고 WAL 로깅을 위해 ~ 50 %의 오버 헤드를 추가했습니다. @commit_on_success, 같은 속도 느려, 나는 심지어 psycopg2와 함께 다중 행 삽입 및 COPY FROM 구현했습니다. 이것은 또 다른 이상한 일입니다. 어떻게 10M 값의 인서트가> 10x 16M 로그 세그먼트를 생성 할 수 있습니까?
표 레이아웃 : 시리얼 번호 차, INT32 무리 3 외래 키
- 작은 테이블, 198 행, 디스크 16K
- 큰 테이블 1.2M 행 데이터 (59) + (89)에 인덱스 디스크에 MB
- 큰 테이블, 2.2M 행, 198 그래서 + 210메가바이트
, 나는 운명하고 수동 외부 키를 떨어 뜨리거나 bla_id X3를 저장 정의하여 매우 취소 장고 방식으로 테이블을 사용 모델을 사용하여 건너 뜁니다. nKey? 이 문제를 해결하기위한 마법의 해독제/Pg 설정에 대해 듣고 싶습니다.
이미 확인했습니다. 문제는 검사가 아니라 두 인덱스에서 O (n log (n)) 인덱스를 찾아 메모리에서 읽는 것입니다. 아니요, 문제는 디스크에 발생한 많은 양의 쓰기입니다. 지수를 떨어 뜨리면 성능이 크게 향상되지 않으며 자동 커밋 - 원본 게시물에 명시된 것과 동일한 결과를 얻었거나없이 결과를 시도했습니다. –
FK를 삭제하는 것이 대량 삽입물의 성능을 향상시키지 않는 데이터베이스를 아직 보지 못했습니다. 그들을 떨어 뜨리고 재창조하는 것이 현명해야합니다. 그것은 분명히 좋은 생각입니다. – hgmnz