08.11.2018 15:07
Onesoft
 
Изучаю файл модификации БД ukmserver-upgrade.sql в пакете 00083000.dat.s.zip от 27.09.2018, вижу такой запрос:

SQL код:
-- SF#10313, Удаление чеков: записи в trm_out_loyality_transactions не удаляются
DELETE FROM `trm_out_loyality_transactionsWHERE `receipt_idNOT IN (SELECT `idFROM `trm_out_receipt_header`); 
Данный запрос, во-первых, неоптимален (выполнять поиск по условию IN (массив, полученный в подзапросе) – дурной тон в работе с БД), во-вторых – не верен в принципе, поскольку не учитывает поле cash_id, в итоге поиск не осуществляется по PRIMARY KEY.
И – да – он не работает.

В нашей БД в таблице trm_out_receipt_header на текущий момент:

SQL код:
SGOselect count(*) from trm_out_receipt_header;
+----------+
count(*) |
+----------+
17878320 |
+----------+ 
Пытаюсь выполнить запрос из скрипта модификации БД:

SQL код:
SGODELETE FROM `trm_out_loyality_transactionsWHERE `receipt_idNOT IN (SELECT `idFROM `trm_out_receipt_header`);
Query OK0 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 код:
SGODELETE 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 OK5678097 rows affected (12 min 2.12 sec

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