복붙노트

[SQL] 많은 인덱스가있는 테이블에 대한 느린 대량 삽입

SQL

많은 인덱스가있는 테이블에 대한 느린 대량 삽입

나는 20 개 이상의 인덱스가있는 테이블에 수백만 개의 레코드를 삽입하려고합니다.

마지막 실행에서 그것은 100.000 행 당 4 개 이상의 시간이 걸렸다, 쿼리는 3.5 일 이후에 취소되었습니다 ...

이 최대 속도를하는 방법에 대한 제안이 있습니까.

(나는 원인으로 많은 인덱스를 생각한다. 당신도 그렇게 생각한다면, 어떻게 자동으로 작동하기 전에 인덱스를 삭제할 수 있습니다, 다음 나중에 다시 같은 인덱스를 생성?)

추가 정보:

상태 업데이트 :

허용 대답은 내가 훨씬 더 빨리 그것을 만들어 주었다.

해결법

  1. ==============================

    1.당신은 비활성화하고 인덱스를 활성화 할 수 있습니다. 이를 해제하여 인덱스를 재 활성화하는 경우에만 발견된다 (예 중복 기본 키 또는 고유 인덱스 등을 갖는 같은) 원하지 않는 부작용을 가질 수 있다는 것을 유의해야한다.

    당신은 비활성화하고 인덱스를 활성화 할 수 있습니다. 이를 해제하여 인덱스를 재 활성화하는 경우에만 발견된다 (예 중복 기본 키 또는 고유 인덱스 등을 갖는 같은) 원하지 않는 부작용을 가질 수 있다는 것을 유의해야한다.

    --Disable Index
    ALTER INDEX [IXYourIndex] ON YourTable DISABLE
    GO
    
    --Enable Index
    ALTER INDEX [IXYourIndex] ON YourTable REBUILD
    GO
    
  2. ==============================

    2.이 데이터웨어 하우스 작업처럼 들린다. 삽입하기 전에 인덱스를 삭제하고 이후이를 다시 것이 일반적 일 것이다.

    이 데이터웨어 하우스 작업처럼 들린다. 삽입하기 전에 인덱스를 삭제하고 이후이를 다시 것이 일반적 일 것이다.

    당신은 인덱스를 다시 작성하는 경우, 먼저 클러스터 된 인덱스를 구축하고, 반대로 마지막 놓습니다. 그들은 모두 FILLFACTOR 100 %를 가져야한다.

    코드는 다음과 같이해야한다

    if object_id('Index') is not null drop table IndexList
    select name into Index from dbo.sysindexes where id = object_id('Fact')
    
    if exists (select name from Index where name = 'id1') drop index Fact.id1
    if exists (select name from Index where name = 'id2') drop index Fact.id2        
    if exists (select name from Index where name = 'id3') drop index Fact.id3
    .
    .
    BIG INSERT
    
    RECREATE THE INDEXES
    
  3. ==============================

    3.다른 답변에서 언급 한 바와 같이 사용하지 않도록 인덱스는 아주 좋은 시작이 될 것입니다.

    다른 답변에서 언급 한 바와 같이 사용하지 않도록 인덱스는 아주 좋은 시작이 될 것입니다.

    당신은 수를 줄여 보라, 서버는이 수단은 데이터를 추가하는 것은 매우 힘든 일이다 (인덱스와 함께), (이 다시 롤백 할 수 있도록) 트랜잭션 상태에있을 때의 엄청난 금액을 유지해야한다.

    왜 자신의 거래에서 각 삽입 문을 포장하지?

    또한, 당신은 문 (네트워크 왕복) 당 하나 개의 행을 추가하거나, 많은 추가 사용하는 SQL의 본질을보고?

  4. ==============================

    4.다음 다시 수 있도록 인덱스를 비활성화하고하는 것은 자주 이러한 경우에 좋습니다. 나는 때문에하지만이 방법에 대한 나의 의심이 :

    다음 다시 수 있도록 인덱스를 비활성화하고하는 것은 자주 이러한 경우에 좋습니다. 나는 때문에하지만이 방법에 대한 나의 의심이 :

    (1) 응용 프로그램의 DB 사용자는 일반적으로 소유하지 않아야 스키마 변경 권한을 필요로한다. (2) 그렇지 않으면 전체 색인 나무가 더 빨리 다음 안 재건, 처음에 최적의 다음 작을 수 있습니다 접근 및 / 또는 인덱스 스키마에 삽입 선택한 몇 가지 괜찮은 일괄 삽입 (예를 들어, 한 번에 하나의 삽입 문을 발행 클라이언트, 원인 서버 왕복 수천 또는 일정한 인덱스 노드 분할로 이어지는 클러스터 된 인덱스에 가난한 선택).

    내 제안은 조금 다른 비트 보이는 이유입니다 :

    이 문서에서 더 자세한 정보를 찾을 수 있습니다.

  5. from https://stackoverflow.com/questions/751039/slow-bulk-insert-for-table-with-many-indexes by cc-by-sa and MIT license