E foi feio. Funciona bem até que haja qualquer outra carga significativa no banco de dados e, em seguida, tudo ocorre muito lentamente. Isso se deve principalmente às limitações de IO do servidor, mas a abordagem mais simples era obter isfiction e isNonFiction nas tabelas MEMORY e a instrução DELETE pode se parecer com:
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
Nos testes, isso reduz todo o processo de cerca de 90 segundos para 10 segundos.