déjà, dans un "exists", on met toujours "select null" ou "select 1", ça sert à rien de charger des données dans un segment temporaire pour rien.
ensuite, vérifie que datetraitement2 et sitecode2 sont bien indexés dans la table "temp" ainsi que dans la table "lignes_cde".
sinon, je ne vois rien qui cloche avec ta requête...
ps: MySQL combien? si c'est une version qui supporte les triggers, vu que ton truc ça semble être "je recopie les données de "lignes_cde" dans "lignes_cde_his" avant de les mettre à jour avec les lignes de "temp", je pense qu'un trigger permettrait de faire quelquechose de plus propre (sur "before update" ) tout et ce sertait certainement plus rapide, puisqu'il n'y aurait pas de requête à faire (le trigger va se contenter de faire un insert pour chaque ligne mise à jour, sans devoir aller cherches des données à partir d'autres tables comme ici)