2011-11-27 3 views
2

클러스터 된 인덱스와 두 개의 클러스터되지 않은 인덱스가있는 거대한 테이블 (수십억 개의 행)이 있습니다.SQL Server 2008 대량 삽입은 쓰기보다 많은 읽기를 발생시킵니다. 왜?

벌크 INSERT 동작 112,000 읽기 및 쓰기 383 만 (기간 19948ms) 생성한다.

그것은 나에게 매우 혼란. 읽기가 쓰기를 초과하는 이유는 무엇입니까? 어떻게 줄일 수 있습니까?

갱신 쿼리


insert bulk DenormalizedPrice4 ([DP_ID] BigInt, [DP_CountryID] Int, [DP_OperatorID] SmallInt, [DP_OperatorPriceID] BigInt, [DP_SpoID] Int, [DP_TourTypeID] Int, [DP_CheckinDate] Date, [DP_CurrencyID] SmallInt, [DP_Cost] Decimal(9,2), [DP_FirstCityID] Int, [DP_FirstHotelID] Int, [DP_FirstBuildingID] Int, [DP_FirstHotelGlobalStarID] Int, [DP_FirstHotelGlobalMealID] Int, [DP_FirstHotelAccommodationTypeID] Int, [DP_FirstHotelRoomCategoryID] Int, [DP_FirstHotelRoomTypeID] Int, [DP_Days] TinyInt, [DP_Nights] TinyInt, [DP_ChildrenCount] TinyInt, [DP_AdultsCount] TinyInt, [DP_TariffID] Int, [DP_DepartureCityID] Int, [DP_DateCreated] SmallDateTime, [DP_DateDenormalized] SmallDateTime, [DP_IsHide] Bit, [DP_FirstHotelAccommodationID] Int) with (CHECK_CONSTRAINTS) 

아니오 RAID50에 저장 DP_ID 두 개의 고유하지 않은 인덱스 (FILLFACTOR와 = 90 %)

그리고 한 가지 더 DB에 의해 & 외래 키 클러스터 인덱스를 트리거 스트라이프 크기 256K

+1

충분하지 상세하게 정확하게 답변 ...하지만 INSERT 삽입하는 올바른 위치를 찾을 수 읽기가하는 ... –

+0

당신은 세부의 어떤 종류를해야합니까? – sh1ng

+2

실행하는 실제 SQL 문과 테이블 구조가 도움이 될 것입니다 ..... –

답변

2

삽입 한 각 행에 대해 데이터베이스는 다음을 가져야합니다.

  • 조건을 확인하십시오. 고유 제한 조건은 색인을 메모리로 읽어야 할 수도 있습니다. 외래 키 제약 조건은 다른 테이블에서 읽어야합니다.
  • 업데이트해야 할 페이지 찾기 (클러스터 된 인덱스 및 다른 인덱스)
  • 테이블에 정의 된 트리거를 실행하십시오.

이러한 활동으로 인해 많은 읽기가 발생할 수 있으며 각 행마다 수행해야합니다. 따라서 단일 행 삽입에 대한 수백 개의 읽기를 보는 것이 정상입니다. 사실, 나는 데이터베이스가 그 일을하고 있다는 건 건강한 신호라고 생각합니다.