【问题标题】:Most efficient way to Read from sql server table, modify and write to a different sql server table [closed]从sql server表读取,修改和写入不同的sql server表的最有效方法[关闭]
【发布时间】:2013-07-26 11:43:50
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 最有效的方法是根本不使用C#。全部在 SQL 中完成。
  • 或者甚至只是对它有一个看法(取决于“修改”是什么)。
  • 定义高效。解释修改。定义其他参数(应用程序的类型、预期的负载模式、行的数量和大小、您使用的持久性框架等)可能有 20 种不同的方法来回答这个问题,所有这些都是正确的,因为它们描述了“最有效的”方式,取决于假设。
  • @Liam,我必须使用 C#,因为中间的操作需要它。
  • 如果你需要使用 C# 进行计算,为什么不把它们作为 CLR 函数放在 SQL Server 中呢?

标签: c# sql sql-server database linq


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      几条指导方针。

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

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

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

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

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


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

      也许对你有帮助。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          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 个)不起作用,也许有一个子例程在那时将它们一个接一个地传递......并记录少数不起作用的。

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

          【讨论】:

            【解决方案6】:

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

            在哪里

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

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

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-09-03
              • 2020-06-17
              • 2015-08-19
              • 2012-01-24
              • 1970-01-01
              相关资源
              最近更新 更多