Firebird truncate table / supprimer toutes les lignes
J'utilise Firebird 2.5.1 Intégré. J'ai fait l'habitude de vider la table, avec près de 200k lignes:
delete from SZAFKI
Voici la sortie, de la voir comme ça se passe en 16 secondes, ce qui est inacceptable.
Preparing query: delete from SZAFKI
Prepare time: 0.010s
PLAN (SZAFKI NATURAL)
Executing...
Done.
3973416 fetches, 1030917 marks, 116515 reads, 116434 writes.
0 inserts, 0 updates, 182658 deletes, 27 index, 182658 seq.
Delta memory: -19688 bytes.
SZAFKI: 182658 deletes.
182658 rows affected directly.
Total execution time: 16.729s
Script execution finished.
Firebird n'a pas TRONQUER un mot clé. Comme la requête utilise le PLAN NATUREL, j'ai essayé de le PLAN de la requête à la main, comme suit:
delete from szafki PLAN (SZAFKI INDEX (SZAFKI_PK))
mais Firebird dit "SZAFKI_PK ne peut pas être utilisé dans le plan spécifié" (c'est une clé primaire)
La Question est de savoir comment dois-je vider la table de manière efficace? Suppression et recréation n'est pas possible.
"Suppression et recréation n'est pas possible." Pourquoi pas?
Avez-vous des déclencheurs SUR SUPPRIMER pour une table spécifiée?
Supprimer les contraintes (PK et FK) puis supprimer les données, puis le recréer des contraintes.
Le Plan n'est pas utile pour la suppression sans
Une autre chose à essayer serait
Avez-vous des déclencheurs SUR SUPPRIMER pour une table spécifiée?
Supprimer les contraintes (PK et FK) puis supprimer les données, puis le recréer des contraintes.
Le Plan n'est pas utile pour la suppression sans
WHERE
condition: il devra analyser l'intégralité du tableau de toute façon, et en raison de l'orientation de données Firebird, à la suite de l'indice de la commande sera le même mal parce que ce sera une marche au hasard à travers toutes les pages d'un tableau, au lieu de numériser les pages d'un tableau dans l'ordre de stockage.Une autre chose à essayer serait
DELETE FROM SZAFKI WHERE ID > 0
(en supposant que les id sont de 1 ou plus). Est-ce BTW un tableau où les lignes sont mises à jour, supprimé et inséré beaucoup avant suppression définitive; si je le supprime sur une table avec 200K enregistrements (fraîchement remplis, donc pas de déchets et pas de fragmentation de la datapages), il se termine en moins de 1,5 secondes.OriginalL'auteur Kitet | 2012-12-11
Vous devez vous connecter pour publier un commentaire.
Répondre en fonction de mon commentaire
Un truc que vous pourriez faire est d'essayer d'utiliser
DELETE FROM SZAFKI WHERE ID > 0
(en supposant que leID
est 1 ou plus). Cela va forcer Firebird pour rechercher les lignes à l'aide de l'index de clé primaire.Mon hypothèse de départ était que ce serait pire qu'un non indexées supprimer. Un indexée supprimer va faire un balayage séquentiel de tous les datapages d'une table et de supprimer des lignes (c'est-à: créer un nouveau recordversion qui est un supprimée tampon d'enregistrement). Lorsque vous utilisez l'index, il va rechercher les lignes dans l'ordre d'index, cela résultera en une marche au hasard à travers le datapages (en supposant un niveau élevé de fragmentation dans les données en raison d'un nombre élevé d'enregistrer des versions dû à des insertions, suppressions et mises à jour). J'avais prévu cette lente, mais il sera probablement entraîner Firebird avoir à seulement lire les datapages (avec enregistrement des versions pertinentes de la transaction), au lieu de tous les datapages d'une table.
La validation elle-même ne sera pas long, mais la prochaine sélectionnez sur la table pourrait déclencher la collecte des ordures (en fait, suppression des anciennes versions d'enregistrements qui ne sont plus d'intérêt à la transaction), et qui pourrait être un gain de performance.
il a fallu très de long pour 2 m de lignes de la table...
OriginalL'auteur Mark Rotteveel
Malheureusement, il n'existe aucun moyen rapide de faire d'énormes supprimer sur l'ensemble de la (grande) table avec les versions Firebird. Vous pouvez vous attendre à encore plus de retards lors de la "contenu supprimé" garbage collecté (exécuter select * dans la table après le supprimer s'engage et vous verrez). Vous pouvez essayer de désactiver l'index dans cette table avant de faire le supprimer et voir si ça aide.
Si vous utilisez la table comme une sorte de stockage temporaire, je vous suggère d'utiliser le GTT fonctionnalité.
OriginalL'auteur WarmBooter
Plus rapide et la seule voie vers le point de se débarrasser de toutes les données rapide dans FireBird table- baisse et créer table à nouveau. Au moins pour la version officielle en vigueur 2.5.X . Il n'y a pas de tronquer l'opérateur dans la feuille de route pour FireBird 3.0 , la version bêta, donc probablement pas de tronquer dans la version 3.0.
Aussi, vous pouvez utiliser l'opérateur RECRÉER - même syntaxe que de créer. Si la table existe, RECRATE gouttes, puis en crée de nouvelles. Si la table n'existe pas, alors recréer juste crée.
OriginalL'auteur TPAKTOPA