SQL Server 2008 BULK INSERT вызывает больше операций чтения, чем операций записи. Почему?

У меня огромная таблица (несколько миллиардов строк) с кластеризованным индексом и двумя некластеризованными индексами.

Операция BULK INSERT производит 112000 чтений и только 383 записи (длительность 19948 мс).

Меня это очень сбивает с толку. Почему чтения превышают записи? Как я могу уменьшить его?

запрос на обновление


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)

Без триггеров и внешних ключей Индекс кластера по DP_ID и два неуникальных индекса (с коэффициентом заполнения = 90%)

И еще кое-что: БД хранится на RAID50 с размером страйпа 256К.


person sh1ng    schedule 27.11.2011    source источник
comment
недостаточно деталей, чтобы ответить точно... но INSERT должен прочитать, чтобы найти правильное место для вставки...   -  person Mitch Wheat    schedule 27.11.2011
comment
Какая деталь вам нужна?   -  person sh1ng    schedule 27.11.2011
comment
Фактический оператор SQL, который вы выполняете, и структура таблицы были бы полезны.....   -  person marc_s    schedule 27.11.2011


Ответы (1)


Для каждой вставляемой строки база данных должна:

  • Проверьте ограничения. Уникальное ограничение может потребовать чтения индекса в память. Ограничение внешнего ключа требует чтения из другой таблицы.
  • Найдите страницы, которые необходимо обновить (кластеризованный индекс и любые другие индексы).
  • Запустите все триггеры, определенные в таблице.

Эти действия могут вызвать много чтений, и их необходимо выполнять для каждой строки. Так что совершенно нормально видеть сотни чтений для вставки одной строки. На самом деле, я бы воспринял это как хороший признак того, что база данных выполняет свою работу.

person Andomar    schedule 27.11.2011