bestsource

테이블을 데이터로 채우기 전에 인덱스를 생성하는 것이 좋습니까, 아니면 데이터가 제자리에 배치된 후에 인덱스를 생성하는 것이 좋습니까?

bestsource 2023. 5. 9. 22:52
반응형

테이블을 데이터로 채우기 전에 인덱스를 생성하는 것이 좋습니까, 아니면 데이터가 제자리에 배치된 후에 인덱스를 생성하는 것이 좋습니까?

제가 복사하여 변경할 약 100M 행의 테이블이 있고 인덱스를 추가합니다.새 테이블을 만드는 데 걸리는 시간은 크게 걱정하지 않지만, 데이터를 삽입하기 전에 테이블을 변경하거나 데이터를 먼저 삽입한 다음 인덱스를 추가하면 생성된 인덱스가 더 효율적입니까?

데이터를 삽입한 후 인덱스를 만드는 것이 더 효율적입니다. 배치 가져오기 전에 인덱스를 삭제하고 다시 만들기 전에 인덱스를 삭제하는 것이 좋습니다.

구문 예제(Postgre)SQL 9.1, 느린 개발 시스템, 백만 행):

CREATE TABLE test1(id serial, x integer);
INSERT INTO test1(id, x) SELECT x.id, x.id*100 FROM generate_series(1,1000000) AS x(id);
-- Time: 7816.561 ms
CREATE INDEX test1_x ON test1 (x);
-- Time: 4183.614 ms

삽입 후 인덱스 만들기 - 약 12초

CREATE TABLE test2(id serial, x integer);
CREATE INDEX test2_x ON test2 (x);
-- Time: 2.315 ms
INSERT INTO test2(id, x) SELECT x.id, x.id*100 FROM generate_series(1,1000000) AS x(id);
-- Time: 25399.460 ms

인덱스를 만든 다음 삽입 - 약 25.5초(2배 이상 느림)

행이 추가된 후 인덱스를 만드는 것이 좋습니다.그것은 더 빠를 뿐만 아니라, 나무 균형을 맞추는 것이 아마도 더 나을 것입니다.

여기서 "균형 조정"을 편집하는 것은 최상의 용어 선택이 아닐 수 있습니다.b-트리의 경우 정의에 따라 균형이 잡힙니다.그러나 그렇다고 해서 b-트리가 최적의 레이아웃을 갖는 것은 아닙니다.업데이트 중에 밸런싱을 신중하게 수행하지 않으면 부모 내의 자식 노드 분포가 불균등할 수 있으며(향후 업데이트에 더 많은 비용이 소요될 수 있음) 트리 깊이가 필요 이상으로 깊어질 수 있습니다.행이 추가된 후 인덱스가 생성되면 더 나은 분포를 가질 가능성이 높습니다.또한 인덱스가 작성된 후 디스크의 인덱스 페이지 조각 수가 줄어들 수 있습니다.여기에 조금 더 많은 정보가 있습니다.

이 문제는 다음과 같은 이유로 중요하지 않습니다.

  1. 테이블에 데이터를 먼저 추가한 후 인덱스를 추가합니다.인덱스 생성 시간은 다음과 같습니다.O(n*log(N))더 오래 (어디서)n행이 추가됨).왜냐하면 나무를 만드는 시간이O(N*log(N))만약 당신이 이것을 오래된 데이터와 새로운 데이터로 나누면 당신은 얻을 수 있습니다.O((X+n)*log(N))이것은 간단히 로 변환될 수 있습니다.O(X*log(N) + n*log(N))이 형식에서는 추가로 무엇을 기다릴 것인지 쉽게 확인할 수 있습니다.
  2. 인덱스를 추가한 경우와 그 이후에 데이터를 추가합니다.모든 행(사용자가 가지고 있음)n새 행) 삽입 시간이 길어집니다.O(log(N))트리에 새 요소를 추가한 후 트리 구조를 재생성해야 함(새 행의 인덱스 열, 인덱스가 이미 존재하고 새 행이 추가되었기 때문에 인덱스를 균형 잡힌 구조로 재생성해야 함, 이 비용O(log(P))P지수 검정력 [인덱스에 포함]입니다.당신은 가지고 있다n 행이 .n * O(log(N))그리고나서O(n*log(N))요약 추가 시간.

이후에 작성된 인덱스는 대부분의 경우 훨씬 더 빠릅니다.대표적인 사례: 행을 가져오는 동안 varchar(255)에 전체 텍스트가 있는 2천만 행 - (사업자 이름) 인덱스가 있습니다. 최악의 경우 최대 20초가 걸리는 것과 일치합니다.인덱스 삭제 및 다시 만들기 - 매번 1초 미만의 시간이 걸리는 것과 일치

두 경우 모두 인덱스에 새 데이터를 삽입하기 때문에 인덱스 효율성을 위해 실제로 문제가 될 수 있을지 모르겠습니다.기본적으로 서버는 인덱스가 작성된 후에야 인덱스의 불균형 상태를 알 수 있습니다.인덱스를 사용하지 않고 삽입을 수행하는 것은 당연합니다.

언급URL : https://stackoverflow.com/questions/3688731/is-it-better-to-create-an-index-before-filling-a-table-with-data-or-after-the-d

반응형