SUPPRIMER la totalité de la table à l'exception d'une ligne

Supposons que j'ai une base de données avec une table qui contient 200k+ lignes.
Ce tableau est fixe tuple avec l'id 1800. Le reste de la n-uplets de la séquence commence à 300k+.
J'ai un besoin de nettoyer ce tableau, supprimer tous les enregistrements sans les supprimer du registre avec l'id 1800. Je suis venu avec 3 types de requête je pourrais peut-être lancer:

DELETE FROM table WHERE id > 1800
DELETE FROM table WHERE id <> 1800
DELETE FROM table WHERE id NOT IN (1800)

J'ai le sentiment que la première est plus rapide que les autres, mais je ne suis pas sûr, comme toutes les autres données ont id plus de 1800.

Lequel est le plus rapide, et pourquoi? Aussi, si il ya un moyen plus rapide pour supprimer les enregistrements à l'exclusion de celui qui ne peut pas être supprimé, faites le moi savoir.

Le plus rapide sera probablement pour copier un enregistrement dans une table temporaire, tronquer la table, puis insérez un enregistrement
À moins que l'optimiseur de requête est le total de la merde (ce qui est très rare), les trois sont les mêmes.
Il dépend. Si l'id est un (primaire) clé (ou un champ indexé) les trois requêtes ont des performances comparables. Autre chose : quelque chose se passe, en fonction des indices et de la cardinalité de l'id de domaine.
Vous pouvez être intéressé par la étroitement liée réponses ici et ici.
Existe-il des clés étrangères impliquées? Si oui, qui pourrait grandement affecter les performances. De toute façon, la copie d'enregistrer et de tronquer pourrait fonctionner, si il n'y a pas les clés étrangères. Si il y a des clés étrangères, puis en supprimant toutes les autres lignes est le chemin à parcourir, malheureusement comme il est assez lent. Aussi, si il y a des FKs puis assurez-vous qu'ils ont des indices sur la referncing lignes.

OriginalL'auteur MurifoX | 2013-01-16