使用多个存储过程
我有3个存储过程AddProduct
,AddProductProperties
和AddOffer
添加大量的数据到数据库中。 我需要使用此过程从数据库中的各种数据源导入数据。数据源的结构是可变的,所以它可能只包含产品或报价或两者兼而有之。 我的算法是从数据源读取记录,然后调用必要的过程。 要调用程序,我使用带参数的MySqlCommand
。使用多个存储过程
问题:
- 什么叫以这种方式 程序最快的方法?
- 我需要储存3个
MySqlCommand
对象,并只更改参数 或者它没有问题? - 我如何可以缓存这些呼叫(每个呼叫我看到在跟踪日志记录 “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更新来治愈癌症。
两个建议:
使用上的MySqlCommand
的的MySqlCommand类上有一个准备方法的准备方法。如果您必须重复调用这些存储过程,那么我会使用它来尽量减少每次执行必须完成的工作量。下面大概是我认为会涉及的步骤:
设置命令对象(每个存储过程一个),包括任何必要的参数。
-
打开您的数据
4.1连接到数据库
呼吁每个命令一次
-
迭代Prepare方法。根据您的数据
4.2更新命令的参数值。在命令中调用相应的执行方法
虽然我不确定您会从中获得多少性能好处。
如果您正在执行临时语句而不是过程(或者甚至是过程),那么我认为需要注意的一件重要事情是使用参数,而不是简单地将您的值连接到命令文本中。如果您要使用字符串连接方法(在大多数情况下我认为这通常是一个坏主意),那么您可能无法利用Prepare方法,因为您将不得不修改每个执行的命令。
是否有BulkInsert/bulkcopy选项可用?
我不熟悉MySQL作为与SQL Server; ADO.Net具有可用于将大量数据插入SQL Server的大容量复制功能。我不知道MySQL是否具有类似的功能,但如果是,并且您有大量数据要插入,请考虑使用该功能,而不是重复调用存储过程。
如果我打电话准备三个程序,那么对于所有三个程序或只有最后一个程序才会实际执行? – 2010-07-01 14:54:26
如果你有时间前后,我会好奇,看看他们是什么;-)如果你得到一分钟,就会发表评论。谢谢 – FastAl 2010-07-08 15:52:00