与sql server建立2个连接的最佳方式(一个读取一个写入)

时间:2014-05-09 13:10:51

标签: c# .net sql-server

我需要从SQL Server表中选择非常多的行(1000万)。我将浏览每个记录并解析每个记录(它们是xml),然后通过存储过程将每个记录写回数据库。

我的问题是,最有效的方法是什么?

我现在这样做的方式是打开2 SqlConnection(一个用于读取一个用于写入)。读取的一个使用SqlDataReader,它基本上是select * from table,我遍历数据集。解析每条记录后,我在第二个连接上执行ExecuteNonQuery(使用参数)。

是否有任何建议可以提高效率,或者只是这样做的方法?

由于

3 个答案:

答案 0 :(得分:0)

您似乎正在逐行编写行。这是最慢的模型。 Write bigger batches.

使用MARS时无需两个连接。不幸的是,MARS在每个写入的行中强制使用14字节的行版本控制标记。可能完全可以接受,或不是。

答案 1 :(得分:0)

我的情况非常渺茫,在这里我做了什么:

  1. 我制作了两份相同的数据库。
  2. 一个针对阅读进行了优化,另一个针对写作进行了优化。
  3. 在配置中,我保留了两个连接字符串ConnectionRead和ConnectionWrite。
  4. 现在在DataLayer中,当我有读取语句(选择..)时,我将连接切换到ConnectionRead连接字符串,并在使用其他字符写入时。
  5. 现在我必须保持两个数据库同步,我正在使用SQL复制来完成这项工作。

    我可以理解实施取决于很多方面,但方法可能会帮助你。

答案 2 :(得分:-1)

我同意Tim Schmelter的帖子 - 我做了一些非常类似的事情......我实际上使用了一个SQLCLR程序,它使用.net(System,将SQL表中的XML列中的数据读入内存(表)。然后使用.net System.Xml命名空间对xml进行反序列化,填充另一个内存表(以目标表的形式),并使用sqlbulkcopy用我需要的那些已解析属性填充该目标SQL表。

SQL Server专为基于集合的操作而设计......如果我正在粉碎/迭代(逐行),我倾向于使用SQLCLR,因为.Net在迭代/数据操作处理方面通常更好。我的规则的一个例外是使用一些元数据来处理数据驱动的进程,清理例程,我可以使用游标。