最好的方式有两个连接到sql server(一个读一个写)

本文关键字:一个 sql server 两个 方式 连接 | 更新日期: 2023-09-27 18:02:29

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

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

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

有什么建议可以使它更有效,或者这只是做它的方式?

谢谢

最好的方式有两个连接到sql server(一个读一个写)

您似乎正在逐个编写行。这是最慢的模式。写更大的批量

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

我有一个非常棘手的情况,下面是我所做的:

    我做了两个相同的数据库副本。
  1. 一个为读优化,另一个为写优化。
  2. 在配置中,我保留了两个连接字符串ConnectionRead和ConnectionWrite。
  3. 现在在DataLayer当我读语句(选择…)我将连接切换到ConnectionRead连接字符串,当使用其他连接字符串时。

现在,因为我必须保持两个数据库同步,我使用SQL复制来完成这项工作。

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

我同意Tim Schmelter的帖子-我做了一些非常相似的事情…我实际上使用了一个SQLCLR过程,它使用。net (System.Data)从SQL表中的XML列中读取数据到内存中的表中,然后使用。net System.Xml名称空间对XML进行反序列化,填充另一个内存中的表(以目标表的形状),并使用sqlbulkcopy用我需要的解析属性填充目标SQL表。

SQL Server是为基于集合的操作设计的…如果我要分解/迭代(逐行),我倾向于使用SQLCLR,因为. net通常更擅长迭代/数据操作处理。我的规则的一个例外是在处理数据驱动进程的少量元数据时,清理例程可能会使用游标。