Изучаю файл модификации БД ukmserver-upgrade.sql в пакете 00083000.dat.s.zip от 27.09.2018, вижу такой запрос:
SQL код:
-- SF#10313, Удаление чеков: записи в trm_out_loyality_transactions не удаляются
DELETE FROM `trm_out_loyality_transactions` WHERE `receipt_id` NOT IN (SELECT `id` FROM `trm_out_receipt_header`);
Данный запрос, во-первых, неоптимален (выполнять поиск по условию IN (массив, полученный в подзапросе) – дурной тон в работе с БД), во-вторых – не верен в принципе, поскольку не учитывает поле cash_id, в итоге поиск не осуществляется по PRIMARY KEY.
И – да – он не работает.
В нашей БД в таблице trm_out_receipt_header на текущий момент:
SQL код:
SGO> select count(*) from trm_out_receipt_header;
+----------+
| count(*) |
+----------+
| 17878320 |
+----------+
Пытаюсь выполнить запрос из скрипта модификации БД:
SQL код:
SGO> DELETE FROM `trm_out_loyality_transactions` WHERE `receipt_id` NOT IN (SELECT `id` FROM `trm_out_receipt_header`);
Query OK, 0 rows affected (3 min 21.15 sec)
Удалено 0 записей. Но в таблице этой данные есть, целых 17053776 записей. Оптимизируем запрос на удаление (а точнее – перепишем его заново):
SQL код:
DELETE tr FROM trm_out_loyality_transactions tr
LEFT JOIN trm_out_receipt_header h ON h.cash_id=tr.cash_id AND h.id=tr.receipt_id
WHERE
h.id IS NULL;
и выполним:
SQL код:
SGO> DELETE tr FROM trm_out_loyality_transactions tr
-> LEFT JOIN trm_out_receipt_header h ON h.cash_id=tr.cash_id AND h.id=tr.receipt_id
-> WHERE
-> h.id IS NULL;
Query OK, 5678097 rows affected (12 min 2.12 sec)