SQL Server 2008 BULK INSERT вызывает больше операций чтения, чем записи. Зачем? - PullRequest
3 голосов
/ 27 ноября 2011

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

Операция 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 и два неуникальных индекса (с fillfactor = 90%)

И еще одна БД, хранящаяся на RAID50 с полосой размером 256K

1 Ответ

2 голосов
/ 27 ноября 2011

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

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

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

...