我有两张表,我需要从中提取数据,对该数据进行一些修改,然后将其写入另一个表。
我想知道什么是最节省空间/时间的方法。
读取一条记录,修改并将单个记录写入另一个表并循环它更好还是读取整个内容,修改它然后将其全部写入另一个表更好。
我将使用 C# 和 Linq 编写此代码。
这些表具有不同的列标题和结构。
我有两张表,我需要从中提取数据,对该数据进行一些修改,然后将其写入另一个表。
我想知道什么是最节省空间/时间的方法。
读取一条记录,修改并将单个记录写入另一个表并循环它更好还是读取整个内容,修改它然后将其全部写入另一个表更好。
我将使用 C# 和 Linq 编写此代码。
这些表具有不同的列标题和结构。
最有效的方法是完全在后端执行此操作。编写一个存储过程(很可能不需要循环,它应该是 INSERT/SELECT 的问题)并从您的 .NET 代码中调用该 SP。
实际上,最高效的方法是使用存储过程或其他东西(然后当然使用批处理/设置操作)。
如果您必须选择 C#,请选择具有最少 I/O 操作的选项,因为这些几乎总是会破坏性能。这通常意味着:一口气读取所有内容,修改,然后一口气将其全部写入,但这完全取决于您正在修改的数据量。
最好的方法是 ETL 过程或脚本。如果修改在插入表之前需要任何最终用户 UI 活动,那么使用 linq 的 C# 很好。如果每条记录的修改相同,则使用 ETL 或 SQL 脚本执行此操作。
对于从一个表中获取/插入数据,最好在 SQL 端使用存储过程。使用 ADO.Net 获取和插入记录比 LINQ 快。
***对于多条记录的相同处理对于记录的批量处理,使用表变量来获取和交互每条记录。
表变量比临时变量快得多,它也有助于查询记录。
修改操作或游标或任何基于逻辑的迭代记录或编辑列数据,然后通过批量插入将其插入另一个表中。
SQL Server 非常精通大规模的记录处理。我不建议将相同的业务逻辑放入基于 C#、LINQ 的应用程序中。除非最终用户需要编辑记录,否则尝试在 sql server 处理您的业务逻辑。
我已将 180 万条记录从表移动到新的数据库结构表,它在 11 分钟内准确发生,但需要 27 分钟来(验证)查询以验证一切都在正确的位置。
可能对你有帮助。
一个大问题是您的数据量。.Net 客户端不能在一个请求中“写出全部内容”。插入和更新是逐行发生的。在一个请求中读取数据当然是有意义的(或者如果它太大而无法处理内存中的所有内容,则可以批量读取)。
但是,如果您有 100,000 或数百万行,则无论如何此过程都将花费几分钟。因此,我将重新评估您的断言,即“中间的操作需要它 [C#]”。可能有解决此问题的方法,例如通过事先在数据库中创建某种控制表,然后您可以在查询或存储过程中使用它来应用修改。性能上的差异使得在这种情况下发挥创造力是值得的。
我在这里有一个完整的工作迷你示例:
但要点是这样
您可能有中毒记录(或未通过验证)。我的模型是“获取尽可能多的数据到数据库中,稍后记录和处理毒记录”。该代码将记录未通过的 xml。
不包含在演示中,但增强。如果批量插入(1,000 个)不起作用,则可能有一个子例程将它们一个接一个地传递......并记录少数不起作用的。
可下载的示例较旧,但有骨架。
好吧,您可以尝试逐列更新,这样您就不必为每一行循环,并且您的服务器行程可以减少到您拥有的列的 2*number(一个用于获取数据,一个用于插入)。您可以在获取记录时获取主键使用
where in 子句
并将这些值插入另一个表。
但是您必须详细说明您的问题才能获得满意的答案,上述方法将减少服务器跳闸和循环。或者你可以使用 SqlDatadapter.Insert
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldataadapter.insertcommand.aspx
------希望它有效。