什么是从C#应用程序中插入一个巨大的数组(10M个元素)的最快方法?
直到现在,我使用了批量插入。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)- 330秒(包括写入磁盘和插入) 临时表值函数(TVF) - 185秒
当然,这是由于写入开销造成的,但我不知道BULK插入是否有任何内存等效的方法。
所以我的问题是——相比于专为大型插入而创建的BULK,TVF是否更好,或者我漏掉了什么?是否有任何第三种选择?