0

我有两张表,我需要从中提取数据,对该数据进行一些修改,然后将其写入另一个表。

我想知道什么是最节省空间/时间的方法。

读取一条记录,修改并将单个记录写入另一个表并循环它更好还是读取整个内容,修改它然后将其全部写入另一个表更好。

我将使用 C# 和 Linq 编写此代码。

这些表具有不同的列标题和结构。

4

6 回答 6

2

最有效的方法是完全在后端执行此操作。编写一个存储过程(很可能不需要循环,它应该是 INSERT/SELECT 的问题)并从您的 .NET 代码中调用该 SP。

于 2013-07-26T11:48:00.943 回答
2

实际上,最高效的方法是使用存储过程或其他东西(然后当然使用批处理/设置操作)。

如果您必须选择 C#,请选择具有最少 I/O 操作的选项,因为这些几乎总是会破坏性能。这通常意味着:一口气读取所有内容,修改,然后一口气将其全部写入,但这完全取决于您正在修改的数据量。

于 2013-07-26T11:48:29.353 回答
2

最好的方法是 ETL 过程或脚本。如果修改在插入表之前需要任何最终用户 UI 活动,那么使用 linq 的 C# 很好。如果每条记录的修改相同,则使用 E​​TL 或 SQL 脚本执行此操作。

几条指导方针。

对于从一个表中获取/插入数据,最好在 SQL 端使用存储过程。使用 ADO.Net 获取和插入记录比 LINQ 快。

***对于多条记录的相同处理对于记录的批量处理,使用表变量来获取和交互每条记录。

表变量比临时变量快得多,它也有助于查询记录。

修改操作或游标或任何基于逻辑的迭代记录或编辑列数据,然后通过批量插入将其插入另一个表中。

SQL Server 非常精通大规模的记录处理。我不建议将相同的业务逻辑放入基于 C#、LINQ 的应用程序中。除非最终用户需要编辑记录,否则尝试在 sql server 处理您的业务逻辑。


我已将 180 万条记录从表移动到新的数据库结构表,它在 11 分钟内准确发生,但需要 27 分钟来(验证)查询以验证一切都在正确的位置。

可能对你有帮助。

于 2013-07-26T11:57:47.450 回答
1

一个大问题是您的数据量。.Net 客户端不能在一个请求中“写出全部内容”。插入和更新是逐行发生的。在一个请求中读取数据当然是有意义的(或者如果它太大而无法处理内存中的所有内容,则可以批量读取)。

但是,如果您有 100,000 或数百万行,则无论如何此过程都将花费几分钟。因此,我将重新评估您的断言,即“中间的操作需要它 [C#]”。可能有解决此问题的方法,例如通过事先在数据库中创建某种控制表,然后您可以在查询或存储过程中使用它来应用修改。性能上的差异使得在这种情况下发挥创造力是值得的。

于 2013-07-26T12:06:37.557 回答
0

我在这里有一个完整的工作迷你示例:

http://granadacoder.wordpress.com/2009/01/27/bulk-insert-example-using-an-idatareader-to-strong-dataset-to-sql-server-xml/

但要点是这样

  1. 使用 IDataReader 从源数据库中读取数据。
  2. 在 C# 代码中执行一些验证和计算。
  3. 按摩后的数据需要放入目标数据库。这里的麻烦是“逐行”会扼杀性能,但如果你一击中做〜所有事情,它可能太多了。所以我要做的是发送 X 行(例如 1,000 行).....通过 xml 到存储过程......并一次批量插入 X 行。

您可能有中毒记录(或未通过验证)。我的模型是“获取尽可能多的数据到数据库中,稍后记录和处理毒记录”。该代码将记录未通过的 xml。

不包含在演示中,但增强。如果批量插入(1,000 个)不起作用,则可能有一个子例程将它们一个接一个地传递......并记录少数不起作用的。

可下载的示例较旧,但有骨架。

于 2013-07-26T13:43:08.947 回答
0

好吧,您可以尝试逐列更新,这样您就不必为每一行循环,并且您的服务器行程可以减少到您拥有的列的 2*number(一个用于获取数据,一个用于插入)。您可以在获取记录时获取主键使用

where in 子句

并将这些值插入另一个表。

但是您必须详细说明您的问题才能获得满意的答案,上述方法将减少服务器跳闸和循环。或者你可以使用 SqlDatadapter.Insert

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldataadapter.insertcommand.aspx

------希望它有效。

于 2013-07-26T13:47:48.633 回答