您好我必须每晚更新我的数据库中的数量至少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 | |
+-----------+------------+----------+--------------+----------------+-----------+-------------+----------+--------+------+------------+---------+
仓库表中有大约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个多小时。
答案 0 :(得分:-1)
听起来你正在做这个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 ...