首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >性能调整我的update语句

性能调整我的update语句
EN

Stack Overflow用户
提问于 2014-04-12 23:56:02
回答 1查看 72关注 0票数 0

你好,我每天晚上都要更新我的数据库中的数量,至少有200万个零件。我使用jdbc作为我的mysql连接器。

我的工作只有一个表一个仓库表.

我们每天晚上都会从每个仓库收到一个文件,其中包含需要更新的零件号和数量。

以下是仓库模式:

代码语言:javascript
复制
warehouse | CREATE TABLE `warehouse` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`sap_article_id` varchar(128) NOT NULL,
`sap_warehouse` varchar(24) NOT NULL,
 `as400_warehouse` varchar(10) NOT NULL,
 `ds_warehouse` varchar(10) NOT NULL,
  `atp_qty` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `article` (`sap_article_id`)
 ) ENGINE=MyISAM AUTO_INCREMENT=497524962 DEFAULT CHARSET=latin1 |

仓库索引:

代码语言:javascript
复制
+-----------+------------+----------+--------------+----------------+-----------+-------------+----------+--------+------+------------+---------+
| Table     | Non_unique | Key_name | Seq_in_index | Column_name    | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-----------+------------+----------+--------------+----------------+-----------+-------------+----------+--------+------+------------+---------+
| warehouse |          0 | PRIMARY  |            1 | id             | A         |     2858699 |     NULL | NULL   |      | BTREE      |         |
| warehouse |          1 | article  |            1 | sap_article_id | A         |      571739 |     NULL | NULL   |      | BTREE      |         |
+-----------+------------+----------+--------------+----------------+-----------+-------------+----------+--------+------+------------+---------+

warehouse表中有大约300万条记录。

我无法在晚上完成所有这些文件的处理。

这是我的逻辑。正如我所说的,我有多个文件需要为每个仓库处理一个文件。

代码语言:javascript
复制
"SELECT sap_article_id FROM " + WAREHOUSE_TABLE
                                + " WHERE " + "sap_article_id='" + sapArticleId
                                + "' AND sap_warehouse='" + sapWarehouse + "'";

如果仓库中存在零件...

我们更新它..

代码语言:javascript
复制
  "UPDATE " + WAREHOUSE_TABLE + " "
                                    + "SET ds_warehouse='0'," + "atp_qty=" + atpQty
                                    + " WHERE sap_article_id='" + sapArticleId + "' AND "
                                    + "sap_warehouse='" + sapWarehouse + "'"; 

否则如果它不存在我们就插入它..。

代码语言:javascript
复制
"INSERT INTO " + WAREHOUSE_TABLE + "("
                            + "sap_article_id,sap_warehouse,as400_warehouse,ds_warehouse,atp_qty"
                            + ") VALUES ('"+sapArticleId+"'," + "'" + sapWarehouse
                            + "'," + "'" + as400Warehouse + "'," + "'0'," + "'"
                            + atpQty + "'" + ")";

然后,我们转到文件中的下一行并重复。

我是不是做错了什么,或者我可以做些什么来大大提高这个过程的速度。就像我之前说的,在这一点上,它花费了太长的时间,我不能在给定的时间段内完成我的任务。我有大约3-5个小时来处理所有这些数据,而现在需要12个多小时。

EN

回答 1

Stack Overflow用户

发布于 2014-04-13 00:28:19

听起来你正在做这个RBAR,这是我通常试图避免的,就像瘟疫一样。相反,尝试执行如下所示的基于集合的更新,然后(如果有必要)对单个数据库执行循环:

代码语言:javascript
复制
MERGE INTO tablename USING table_reference ON (condition)
   WHEN MATCHED THEN
   UPDATE SET column1 = value1 [, column2 = value2 ...]
   WHEN NOT MATCHED THEN
   INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23032706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档