다중 행 인서트 대 다중 단일 행 인서트


9

내 응용 프로그램에서 나는 db와 응용 프로그램 사이의 왕복 횟수를 줄이기 때문에 여러 줄 삽입을 할 수 있습니다.

그러나 다른 궁금한 점이 있습니까? 예를 들어 다음과 같이 여러 행이 한 번에 삽입되는 경우 :

insert into tbl (c1, c2) values
(v1, v2)
(v3, v4)

대:

insert into tbl (c1, c2) values (v1, v2)
insert into tbl (c1, c2) values (v3, v4)

그리고 테이블에는 인덱스가 있습니다. 인덱스는 첫 번째 경우에 한 번, 두 번째 경우에는 두 번 계산됩니까? 아니면 항상 인서트 당 한 번입니까? 두 쿼리가 동일한 트랜잭션에 있다고 가정하십시오.

PostgreSQL을 사용하고 있습니다.


2
내가 생각하는 인덱스는 한 번만의 업데이트 된 마다 한 번이, . 따라서 단일 진술은 두 진술보다 효율적이어야합니다. 그러나 나는 확실하지 않다 (따라서 답이 없다. 단지 의견)
a_horse_with_no_name

1
올바른 질문은 동일한 거래에 캡슐화되어 있는지입니다. 거래에서 거래가 모두 있으면 차이가 없습니다.
user1363989

@ user1363989, 나는 두 쿼리는 동일한 트랜잭션에서 될 것이라고 표시하는 내 질문에 업데이 트했습니다
cdmckay

답변:


5

@a_horse_with_no_name은 명령문마다 인덱스가 한 번 업데이트된다는 것이 옳다고 생각합니다. 명령문이 실행을 완료하지 않으면 트랜잭션에 있기 때문에 데이터가 표시되지 않기 때문입니다. 그리고 성명서의 정의에는 여러 값을 갖는 것이 포함됩니다

그리고 여기서 문서 생성 에 따라 인덱스 생성 / 업데이트는 단일 명령문보다 배치에서 더 효율적으로 작동합니다.

Peter Manis 가 추천 할 수있는 다양한 Insert 메소드의 성능에 관한 좋은 기사도 있습니다.

명심해야 할 또 다른 사항 은 Fabien Coelho가 여기에 설명하는 것처럼FILLFACTOR 성능에 영향을 미치기 때문에 색인의 색인 입니다.


쿼리가 트랜잭션에서 일괄 처리되면 인덱스 업데이트가 문당 한 번 발생합니까? 다른 것으로 인해 성능 차이가 있습니까? 어느 기사에도 액세스 할 수 없습니다. 다시 링크 해주세요.
batbrat

1

이 점에서 인덱스 유지 관리 영역에 현재 최적화 차이가 있다고 생각하지 않습니다.

네트워크 오버 헤드 외에도 다중 값 문의 다른 장점은 구문 분석, 잠금 등입니다 (테이블 잠금 tbl은 첫 번째 insert 문에서 가져온 다음 각 트랜잭션의 나머지 부분에서 유지됩니다. 문은 여전히 ​​잠금이 유지되는지 확인해야하며이 확인은 무료가 아닙니다)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.