[英]Large SQL inserts TVF vs BULK insert
從 C# 應用程序插入一個巨大的數組(10M 個元素)的最快方法是什么?
到目前為止,我使用批量插入。 C# 應用程序生成一個大文本文件,我使用BULK INSERT
命令加載它。 出於好奇,我寫了一個簡單的用戶定義的 CLR 表值 function。
[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 - 330 秒(寫入磁盤 + 插入) TVF - 185 秒
當然,這是由於寫入開銷造成的,但我不知道 BULK 插入是否有任何 memory 等效項。
所以我的問題是 - TVF 是否比 BULK 更好(它是為大型插入創建的),或者我在這里遺漏了什么。 有沒有第三種選擇?
當我真的需要最后一點性能時,我會使用SqlBulkCopy ,這樣您就可以跳過首先將其全部放在磁盤上的開銷。
SqlBulkCopy 接受您必須實現的 IDataReader,但只接受接口的幾個方法。 我總是做的只是創建class MyBulkCopySource: IDataReader
,單擊“實現接口”並將其提供給 BulkCopy 以查看調用的方法。 實現它,再試一次等。您只需要實現其中四個,rest 永遠不會被調用。
AFAIK 這是將數據從 C# 程序泵入 SqlDB 的最快方法。
GJ
這完全將最小的鎖定放在茶幾上。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.