Настройка производительности моего оператора обновления

Привет, я должен обновлять свой номер в моей базе данных каждую ночь за минимум 2 миллиона частей. Я использую 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 | |
+-----------+------------+----------+--------------+----------------+-----------+-------------+----------+--------+------+------------+---------+

на столе склада имеется около 3 миллионов записей.

Я не могу завершить обработку всех этих файлов в течение ночи.

Вот моя логика... как я уже сказал, у меня есть несколько файлов, которые мне нужно обрабатывать для каждого склада.

"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 ответ

Похоже, вы делаете это 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 ...

licensed under cc by-sa 3.0 with attribution.