性能调整我的更新语句

时间:2014-04-12 15:56:02

标签: java mysql sql optimization sql-update

您好我必须每晚更新我的数据库中的数量至少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个多小时。

1 个答案:

答案 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 ...