Und es war hässlich. Es funktioniert gut, bis es eine andere signifikante Belastung der DB gibt, und dann geht alles sehr langsam. Dies liegt hauptsächlich an IO-Beschränkungen des Servers, aber der einfachere Ansatz war, isfiction und isNonFiction in die MEMORY-Tabellen zu bekommen und die DELETE-Anweisung kann dann so aussehen:
DELETE tmp_table FROM tmp_table
INNER JOIN
(
SELECT ASIN, MAX( isFiction ) AS isFiction, MAX( isNonFiction ) AS isNonFiction
FROM tmp_table
GROUP BY ASIN
HAVING isFiction =1
AND isNonFiction =1
) D
WHERE D.ASIN=tmp_table.ASIN AND tmp_table.isNonFiction=1
Beim Testen wird der gesamte Prozess dadurch von etwa 90 Sekunden auf 10 Sekunden verkürzt.