什麼是從C#應用程序插入巨大數組(10M元素)的最快方法?大型SQL插入TVF和BULK插入
到現在爲止,我用散裝插入。 C#應用程序生成一個大的文本文件,我用BULK INSERT
命令加載它。出於好奇,我寫了一個簡單的用戶定義的CLR表值函數。
[SqlFunction(Name = "getArray", FillRowMethodName = "FillRow")]
public static IEnumerable getArray(String name)
{
return my_arrays[name]; // returns the array I want to insert into db
}
public static void FillRow(Object o, out SqlDouble sdo)
{
sdo = new SqlDouble((double)o);
}
而這個查詢:
INSERT INTO my_table SELECT data FROM dbo.getArray('x');
作品比散裝相當於快了近2倍。確切的結果是:
BULK - 330S(寫入到磁盤+插入) TVF - 185s
當然,這是由於開銷寫,但我不知道是否BULK INSERT有相同的記憶。
所以我的問題是 - TVF是否更好地彌補了BULK(它是爲巨大的插入創建的),還是我在這裏錯過了一些東西。有沒有第三種選擇?
你確定關於多個線程嗎?你是否指自己的連接上有多個SBC?通常我會認爲瓶頸是網絡或磁盤驅動器。我認爲使用多線程會導致爭用。 – gjvdkamp
Multipel線程使得多個SBC同時運行。我使用它來加載更大量的數據(6億以上),並使用3個線程加倍了我的吞吐量。在覈心表上,爭議較少的地方。鎖定時間很短,三個線程無論如何都使用單獨的臨時表實例;)始終保持數據流暢。 – TomTom