SQL Server 2008 BULK INSERT导致读多于写.为什么



我有一个巨大的表(几十亿行),有一个聚集索引和两个非聚集索引。

一个BULK INSERT操作产生112000个读操作,只有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)

无触发&外键通过DP_ID创建集群索引两个非唯一索引(fillfactor=90%)

还有一件事DB存储在RAID50上,条带大小为256K

对于您插入的每一行,数据库必须:

  • 检查约束。唯一约束可能需要将索引读入内存。外键约束需要从另一个表中读取。
  • 查找需要更新的页面(聚集索引和任何其他索引)
  • 运行表中定义的触发器

这些活动可能会导致大量的读取,并且必须对每一行执行。因此,看到对单个行插入进行数百次读取是非常正常的。事实上,我认为这是一个健康的信号,表明数据库正在工作。

最新更新