Форум OlegON > Программы и оборудование для автоматизации торговли > Кассовые программы > УКМ-4

83 -> Модификация БД в пакете 00083000.dat.s.zip от 27.09.2018 : УКМ-4

24.11.2024 16:06


08.11.2018 15:07
Изучаю файл модификации БД 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) 
Часовой пояс GMT +3, время: 16:06.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.