从sql server表读取、修改和写入不同sql server表的最有效方法
本文关键字:server sql 方法 有效 读取 修改 | 更新日期: 2023-09-27 18:25:13
我有两个表,需要从其中一个表中提取数据,对该数据进行一些修改,然后将其写入另一个表。
我想知道什么是最节省空间/时间的方法。
最好是读取一条记录,修改并将单个记录写入另一个表并循环,还是最好是读取整个记录,修改它,然后将所有记录写入其他表。
我将使用C#和Linq来写这篇文章。
这些表格有不同的列标题和结构。
事实上,最高效的方法是使用存储过程或其他东西(然后当然使用批处理/设置操作)。
如果必须选择C#,请选择I/O操作最少的选项,因为这些操作几乎总是性能的破坏者。这通常意味着:一次读取所有内容,修改,然后一次写入所有内容,但这一切都取决于您正在修改的数据量。
最有效的方法是完全在后端完成。编写一个存储过程(很可能不需要循环——这应该是INSERT/SELECT的问题),并从.NET代码中调用该SP。
最好的方法是ETL过程或脚本。如果在插入到表中之前修改需要任何最终用户UI活动,那么使用linq的C#是好的。如果每条记录上的修改相同,则使用ETL或SQL脚本执行此操作。
很少有指导方针
对于从一个表中获取数据/插入数据,最好使用SQL端的存储过程。使用ADO.Net获取和插入记录比LINQ更快。
***用于对多个记录进行相同处理对于记录的批量处理,请使用表变量来获取每条记录并对其进行交互。
表变量比临时变量快得多,它还有助于查询记录。
修改操作或光标或任何基于逻辑的记录迭代或列数据编辑,然后通过另一个表中的大容量插入插入。
SQL Server非常擅长大规模的记录处理。我不建议在基于C#、LINQ的应用程序中使用相同的业务逻辑。除非最终用户需要编辑记录,否则请尝试在sqlserver上处理您的业务逻辑。
我已经将180万条记录从表移到了一个新的数据库结构表中,它在11分钟内准确地发生了,但(验证)查询花了27分钟来验证一切是否都在正确的位置。
也许对你有帮助。
一个大问题是数据量。.Net客户端不能在一个请求中"写出全部内容"。逐行插入和更新。在一个请求中读取数据当然是有意义的(如果数据太大,无法处理内存中的所有内容,则可以分批读取)。
但是,如果您有100000或数百万行,那么不管怎样,这个过程都需要几分钟。因此,我将重新评估您的断言,即"中间的操纵需要它[C#]"。可能有一些方法可以解决这个问题,例如,预先在数据库中创建某种控制表,然后可以在查询或存储过程中使用这些控制表来应用修改。在这种情况下,表现上的差异使我们有必要发挥创造性。
我在这里有一个完整的工作迷你示例:
http://granadacoder.wordpress.com/2009/01/27/bulk-insert-example-using-an-idatareader-to-strong-dataset-to-sql-server-xml/
但要点是这个
- 使用IDataReader从源数据库中读取数据
- 在C#代码中执行一些验证和计算
- 需要将经过处理的数据放入目的地数据库中。这里的问题是"一排排"会扼杀性能,但如果你一次完成所有任务,可能会太多。所以我所做的是发送X行(以1000为例)。。。。。通过xml到存储过程。。。。。。。并且一次大容量插入X行
您可能有中毒记录(或未通过验证)。我的模型是"将尽可能多的数据放入数据库,记录并稍后处理中毒记录"。代码将记录未通过的xml。
未包含在演示中,但为增强功能。如果(1000的)大容量插入不起作用,那么可能有一个子程序在该点逐个传入它们。。。。。。。。并记录少数不起作用的部分。
可下载的示例比较旧,但具有骨架。
您可以尝试逐列更新,这样您就不必为每一行循环,并且您的服务器行程可以减少到2*列数(一个用于获取数据,一个用于插入)。您可以在使用提取记录时获得主键
其中条款
并将这些值插入到另一个表中。
但您必须详细说明您的问题才能得到满意的答案,上述方法将减少服务器跳闸和循环。或者您可以使用SqlDatadapter。插入
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldataadapter.insertcommand.aspx
------希望它能起作用。