2011-11-27 58 views
2

我有一个巨大的表(几十亿行)与聚集索引和两个非聚集索引。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 和两个非唯一索引(与填充因子= 90%)

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

+1

没有足够的细节来准确回答...但是插入必须阅读才能找到正确的插入位置... –

+0

需要什么样的细节? – sh1ng

+2

您执行的实际SQL语句以及表结构将有所帮助..... –

回答

2

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

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

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