簡體   English   中英

大號 SQL 插件 TVF vs BULK 插件

[英]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

  • 使用 SqlBulkCopy
  • 來自多個線程,每次都有 30.000 行之類的塊。
  • 不是決賽桌,而是臨時桌
  • 使用不支持鎖的連接設置從中復制。

這完全將最小的鎖定放在茶幾上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM