使用多个存储过程

使用多个存储过程

问题描述:

我有3个存储过程AddProductAddProductPropertiesAddOffer添加大量的数据到数据库中。 我需要使用此过程从数据库中的各种数据源导入数据。数据源的结构是可变的,所以它可能只包含产品或报价或两者兼而有之。 我的算法是从数据源读取记录,然后调用必要的过程。 要调用程序,我使用带参数的MySqlCommand使用多个存储过程

问题:

  1. 什么叫以这种方式 程序最快的方法?
  2. 我需要储存3个MySqlCommand对象,并只更改参数 或者它没有问题?
  3. 我如何可以缓存这些呼叫(每个呼叫我看到在跟踪日志记录 “Retreiving程序元数据 PROCEDURENAME”)?

多记录SQL更新是关键

速度和插入各个呼叫就像油和水。 (哦,这不是一个好的声明在这些时间使用)。

策略...

  • 导入各种数据源到匹配其布局临时表。使用数据库的内置导入实用程序导入平面文件(或连接到其他数据库或odbc等的表格 - 如果可以使外部数据源显示为附加表格,则可以跳过临时表格部分)
  • 使用INSERT INTO AddProduct ...(从TempProducts1中选择...)这样的语句 - 或者链接表 - 将所有记录放入一次
  • 如果您必须从多个输入格式管理同一个目标表中的冲突,你仍然可以从sql批量查询中做到这一点。
    • 你必须使用临时表,然后
    • 如果temp1中导入之前胜过TEMP2然后
      Delete from temp2 where temp2.id in (select id from temp1)
      或simliar。
  • 你可以做通过更新连接表的相似,左外连接检查空或不在右侧的PK场等
  • 删除临时表。不抱怨临时表!你不是我打赌的多用户。你是我打赌的DBA。极端速度=极端措施。

一旦我甚至摆动这样的东西,其后在文件中冲突的项目必须覆盖更早的项目,与建立更新/插入/删除查询和临时表,从外部平面文件。采取了5 +巨大的丑陋的SQL语句。没有趣味,但比在同一个盒子上进行插入的代码快100倍。这是一个单一的SP插入的模拟(好吧,也许不是那么糟糕,它是vb4和访问jet2.0 :-)。但是,网络客户端会因为往返等而做WORSE。

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

+0

如果你有时间前后,我会好奇,看看他们是什么;-)如果你得到一分钟,就会发表评论。谢谢 – FastAl 2010-07-08 15:52:00

两个建议:

使用上的MySqlCommand

的的MySqlCommand类上有一个准备方法的准备方法。如果您必须重复调用这些存储过程,那么我会使用它来尽量减少每次执行必须完成的工作量。下面大概是我认为会涉及的步骤:

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

  2. 打开您的数据

    4.1连接到数据库

  3. 呼吁每个命令一次

  4. 迭代Prepare方法。根据您的数据

    4.2更新命令的参数值。在命令中调用相应的执行方法

虽然我不确定您会从中获得多少性能好处。

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

是否有BulkInsert/bulkcopy选项可用?

我不熟悉MySQL作为与SQL Server; ADO.Net具有可用于将大量数据插入SQL Server的大容量复制功能。我不知道MySQL是否具有类似的功能,但如果是,并且您有大量数据要插入,请考虑使用该功能,而不是重复调用存储过程。

+0

如果我打电话准备三个程序,那么对于所有三个程序或只有最后一个程序才会实际执行? – 2010-07-01 14:54:26