使用多个存储过程将大量数据添加到数据库中

时间:2010-07-01 14:23:10

标签: c# mysql

我有3个存储过程AddProductAddProductPropertiesAddOffer。 我需要使用此过程从数据库中的各种数据源导入数据。数据源的结构是可变的,因此它可能只包含产品或产品或两者。 我的算法是从数据源读取记录然后调用必要的过程。 要调用程序,我使用MySqlCommand参数。

问题:

  1. 最快的打电话方式是什么? 程序那样?
  2. 我是否需要存储3个MySqlCommand个对象并仅更改参数 或者没关系?
  3. 如何缓存这些调用(对于每个调用,我在跟踪日志中看到记录 “恢复过程元数据 PROCEDURENAME“)?

2 个答案:

答案 0 :(得分:2)

两个建议:

在MySqlCommand上使用Prepare方法

MySqlCommand类上有一个Prepare方法。如果你必须重复调用这些存储过程,那么我会使用它来尝试最小化每次执行必须完成的工作量。以下是我认为可能涉及的步骤:

  1. 设置命令对象(每个存储过程一个),包括任何必要的参数。

  2. 打开与数据库的连接

  3. 为每个命令调用一次

  4. 的Prepare方法
  5. 迭代您的数据

    4.1。根据您的数据更新命令参数的值

    4.2。在命令的

  6. 上调用适当的Execute方法

    我不确定你会从中获得多少性能优势。

    如果您正在执行ad-hoc语句而不是程序(或者甚至是程序),那么我认为需要注意的一个重要事项是使用参数而不是简单地将值连接到命令文本中。如果您使用字符串连接方法,我认为在大多数情况下通常都是一个坏主意,那么您可能无法利用Prepare方法,因为您必须为每次执行修改命令。 / p>

    是否有可用的BulkInsert / BulkCopy选项?

    我对MySQL不像SQL Server那样熟悉; ADO.Net具有批量复制功能,可用于将大量数据插入SQL Server。我不知道MySQL是否有类似的功能,但是如果它有并且你要插入大量数据,那么考虑使用它而不是重复调用存储过程。

答案 1 :(得分:0)

多记录SQL更新是关键

速度和对插入物的单独调用就像油和水。 (哦,这些时候不是一个好的陈述)。

策略...

  • 将各种数据源导入与其布局匹配的临时表。使用db的内置导入实用程序导入flatfiles(或附加到其他数据库的表,或odbc等 - 如果你可以将外部数据源显示为附加表,则可以跳过临时表部分)
  • 使用类似INSERT INTO AddProduct的语句...(从TempProducts1中选择...) - 或链接表 - 将一次性放入所有记录
  • 如果必须从多种输入格式管理同一dest表中的冲突,您仍然可以通过sql批量查询来执行此操作。
    • 您必须使用临时表
    • 如果temp1胜过temp2,那么
      Delete from temp2 where temp2.id in (select id from temp1) 
      或者在导入之前使用simliar。
  • 您可以通过更新表的连接,左外连接检查空值或不在右侧的PK字段等来执行类似操作。
  • 删除临时表。没有关于临时表的投诉!你不是多用户我打赌。你是我打赌的DBA。极端速度=极端措施。

一旦我甚至摇摆了这样的东西,文件中的冲突项目必须覆盖以前的项目,包括来自外部平面文件的builk update / insert / delete查询和临时表。发了5个超级丑陋的sql语句。不是很有趣,但比插入的同一个盒子上的代码快100倍。哪个是单个SP进行插入的类型(好吧也许不是那么糟糕,它是vb4并访问jet2.0 :-)。但是,由于往返等原因,网络客户端会做WORSE。

您还可以通过多记录SQL更新来治愈癌症。