你好,我每天晚上都要更新我的数据库中的数量,至少有200万个零件。我使用jdbc作为我的mysql连接器。
我的工作只有一个表一个仓库表.
我们每天晚上都会从每个仓库收到一个文件,其中包含需要更新的零件号和数量。
以下是仓库模式:
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 |仓库索引:
+-----------+------------+----------+--------------+----------------+-----------+-------------+----------+--------+------+------------+---------+
| 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万条记录。
我无法在晚上完成所有这些文件的处理。
这是我的逻辑。正如我所说的,我有多个文件需要为每个仓库处理一个文件。
"SELECT sap_article_id FROM " + WAREHOUSE_TABLE
+ " WHERE " + "sap_article_id='" + sapArticleId
+ "' AND sap_warehouse='" + sapWarehouse + "'";如果仓库中存在零件...
我们更新它..
"UPDATE " + WAREHOUSE_TABLE + " "
+ "SET ds_warehouse='0'," + "atp_qty=" + atpQty
+ " WHERE sap_article_id='" + sapArticleId + "' AND "
+ "sap_warehouse='" + sapWarehouse + "'"; 否则如果它不存在我们就插入它..。
"INSERT INTO " + WAREHOUSE_TABLE + "("
+ "sap_article_id,sap_warehouse,as400_warehouse,ds_warehouse,atp_qty"
+ ") VALUES ('"+sapArticleId+"'," + "'" + sapWarehouse
+ "'," + "'" + as400Warehouse + "'," + "'0'," + "'"
+ atpQty + "'" + ")";然后,我们转到文件中的下一行并重复。
我是不是做错了什么,或者我可以做些什么来大大提高这个过程的速度。就像我之前说的,在这一点上,它花费了太长的时间,我不能在给定的时间段内完成我的任务。我有大约3-5个小时来处理所有这些数据,而现在需要12个多小时。
发布于 2014-04-13 00:28:19
听起来你正在做这个RBAR,这是我通常试图避免的,就像瘟疫一样。相反,尝试执行如下所示的基于集合的更新,然后(如果有必要)对单个数据库执行循环:
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 ...https://stackoverflow.com/questions/23032706
复制相似问题