2012-05-21 23 views
0

如果我使用ADO.Net針對使用具有單獨的連接兩個不同的過程相同的表同時bulkinserts各自具有與隔離級別「READCOMMITTED」事務對具有表:同時使用ADO.Net和SQL Server的bulkinserts,選擇哪些索引?

  • RowId的:BIGINT身份
  • FooId:唯一標識符PK非羣集

(在bulkinsert之前代碼分配的前期)至於同時插入,這將是更好的:

  • 一)穿上了RowId的一個PK具有聚簇索引和唯一鍵contraint指數,上FooId
  • b)非聚集把一個唯一的密鑰contraint索引,非聚集在RowId的

任何其他提示嗎?

+0

正如Kimberly Tripp在她的博客文章[The Clustered Index Debate Continues ...](http://sqlskills.com/BLOGS/KIMBERLY/post/The-Clustered-Index-Debate-Continues.aspx)中解釋的,具有*好*聚集索引(類似於'BIGINT IDENTITY')的列對於批量插入實際上**有益**。插入一個精心設計的表格中,選擇好的聚集索引比插入到一個堆(沒有聚集索引的表)中要快得多** - 所以我會說,去選項(a)。不知道你是否需要一個NC'Foo' - 爲了什麼? –

+0

Foo是一個「商業密鑰」,用於查詢和連接,但不能聚集。 – Daniel

回答

3

無論您選擇哪一個,您都將有一個索引爲RowId標識順序。兩種操作都會嘗試將行插入同一區域(索引結束),因此無法實現最低限度的日誌記錄(即最快的可能加載)。我強烈建議你閱讀Data Load Performance Guide

明顯的問題是爲什麼是否需要兩個併發的批量插入操作?更有可能他們會放慢彼此而不是加快速度。在集羣索引方案中實現並行快速加載流相當困難。你有沒有試過一個單一的流和TF610?如果您能夠使用單個流實現最小化日誌批量插入,並使用足夠大的批量大小,那麼我預計它會比兩個完全記錄的並行流更快。

+0

我不能控制它,因爲它取決於消費者。他們可以有一個工作流,其中兩個併發會話開始將數據與相同的表進行bulkinserting。 – Daniel