[SQL] 많은 인덱스가있는 테이블에 대한 느린 대량 삽입
SQL많은 인덱스가있는 테이블에 대한 느린 대량 삽입
나는 20 개 이상의 인덱스가있는 테이블에 수백만 개의 레코드를 삽입하려고합니다.
마지막 실행에서 그것은 100.000 행 당 4 개 이상의 시간이 걸렸다, 쿼리는 3.5 일 이후에 취소되었습니다 ...
이 최대 속도를하는 방법에 대한 제안이 있습니까.
(나는 원인으로 많은 인덱스를 생각한다. 당신도 그렇게 생각한다면, 어떻게 자동으로 작동하기 전에 인덱스를 삭제할 수 있습니다, 다음 나중에 다시 같은 인덱스를 생성?)
추가 정보:
상태 업데이트 :
허용 대답은 내가 훨씬 더 빨리 그것을 만들어 주었다.
해결법
-
==============================
1.당신은 비활성화하고 인덱스를 활성화 할 수 있습니다. 이를 해제하여 인덱스를 재 활성화하는 경우에만 발견된다 (예 중복 기본 키 또는 고유 인덱스 등을 갖는 같은) 원하지 않는 부작용을 가질 수 있다는 것을 유의해야한다.
당신은 비활성화하고 인덱스를 활성화 할 수 있습니다. 이를 해제하여 인덱스를 재 활성화하는 경우에만 발견된다 (예 중복 기본 키 또는 고유 인덱스 등을 갖는 같은) 원하지 않는 부작용을 가질 수 있다는 것을 유의해야한다.
--Disable Index ALTER INDEX [IXYourIndex] ON YourTable DISABLE GO --Enable Index ALTER INDEX [IXYourIndex] ON YourTable REBUILD GO
-
==============================
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.다른 답변에서 언급 한 바와 같이 사용하지 않도록 인덱스는 아주 좋은 시작이 될 것입니다.
다른 답변에서 언급 한 바와 같이 사용하지 않도록 인덱스는 아주 좋은 시작이 될 것입니다.
당신은 수를 줄여 보라, 서버는이 수단은 데이터를 추가하는 것은 매우 힘든 일이다 (인덱스와 함께), (이 다시 롤백 할 수 있도록) 트랜잭션 상태에있을 때의 엄청난 금액을 유지해야한다.
왜 자신의 거래에서 각 삽입 문을 포장하지?
또한, 당신은 문 (네트워크 왕복) 당 하나 개의 행을 추가하거나, 많은 추가 사용하는 SQL의 본질을보고?
-
==============================
4.다음 다시 수 있도록 인덱스를 비활성화하고하는 것은 자주 이러한 경우에 좋습니다. 나는 때문에하지만이 방법에 대한 나의 의심이 :
다음 다시 수 있도록 인덱스를 비활성화하고하는 것은 자주 이러한 경우에 좋습니다. 나는 때문에하지만이 방법에 대한 나의 의심이 :
(1) 응용 프로그램의 DB 사용자는 일반적으로 소유하지 않아야 스키마 변경 권한을 필요로한다. (2) 그렇지 않으면 전체 색인 나무가 더 빨리 다음 안 재건, 처음에 최적의 다음 작을 수 있습니다 접근 및 / 또는 인덱스 스키마에 삽입 선택한 몇 가지 괜찮은 일괄 삽입 (예를 들어, 한 번에 하나의 삽입 문을 발행 클라이언트, 원인 서버 왕복 수천 또는 일정한 인덱스 노드 분할로 이어지는 클러스터 된 인덱스에 가난한 선택).
내 제안은 조금 다른 비트 보이는 이유입니다 :
이 문서에서 더 자세한 정보를 찾을 수 있습니다.
from https://stackoverflow.com/questions/751039/slow-bulk-insert-for-table-with-many-indexes by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 트위스트와 임시 데이터베이스 설계, (초안 행 VS 라이브) (0) | 2020.06.03 |
---|---|
[SQL] 어떻게 내가 같은 테이블에서 2 개 행을 비교합니까 (SQL 서버) (0) | 2020.06.03 |
[SQL] 그것은 여러 외국 키로 한 열을 참조 할 수 있습니까? (0) | 2020.06.03 |
[SQL] T-SQL 하위 쿼리 최대 (일)과 조인 (0) | 2020.06.03 |
[SQL] 어떻게 엔티티 프레임 워크는 문자 (N) 필드에 매핑 특정 컬럼에 대한 검색 자동 트림 값으로 구성 할 수 있습니다? (0) | 2020.06.03 |