TRUNCATE

Utilisez la commande " TRUNCATE pour supprimer toutes les lignes d'un tableau. Cette commande a le même effet que la commande DELETE, mais elle est plus rapide que la commande 'DELETE pour les grandes tables.

Vous pouvez utiliser " TRUNCATE dans une transaction ou une procédure stockée pour apporter d'autres modifications connexes aux données dans une unité atomique. Lorsque vous utilisez " TRUNCATE de cette manière :
  • La transaction de troncature peut être annulée, auquel cas le stockage et le contenu de la table restent intacts.
  • La table est verrouillée et aucun accès concurrent (y compris les commandes " SELECT ) à la table à partir d'autres sessions ou transactions n'est autorisé jusqu'à ce que la transaction de troncature soit validée ou annulée. Le retour en arrière peut résulter d'une commande " ROLLBACK ou d'un échec d'exécution dans la transaction.
  • Si la transaction de troncature accède à d'autres tables, le risque de blocage est accru. Vous pouvez éviter ce problème en émettant 'LOCK TABLE <tablename> IN ACCESS EXCLUSIVE MODE au début d'une opération de troncature. Voir LOCK TABLE pour des indications sur l'utilisation de cette commande.
  • le TRUNCATE TABLE est beaucoup plus rapide que la suppression de toutes les lignes avec le " DELETE FROM <table> et ne nécessite pas non plus un " GROOM TABLE ultérieur pour récupérer l'espace. Mais il existe un petit risque que des transactions concurrentes tentant de modifier et de tronquer la même table voient apparaître le message suivantERROR: Cannot truncate table because of concurrent insert or update. Vous pouvez minimiser le risque en utilisant la commande 'LOCK TABLE et en ne laissant pas active une transaction qui tronque une ou plusieurs tables plus longtemps qu'il n'est nécessaire pour atteindre son objectif.

NPS prend en charge le " SELECTs dans les transactions simultanées contre une table tronquée. L'espace disque d'une table tronquée n'est libéré que lorsqu'il n'y a plus de transactions concurrentes actives ayant débuté avant l'exécution de la troncature. S'il n'y a pas de transactions concurrentes au moment de la validation d'une troncature, l'espace de stockage est libéré quelques secondes après la validation. Les transactions ouvertes qui ont commencé avant l'engagement du " TRUNCATE peuvent toujours voir les lignes du tableau antérieures au " TRUNCATE.

Les opérations autres que " SELECT qui modifient la table tronquée doivent attendre que la transaction de troncature soit validée ou annulée.

Si votre système a souvent des sessions simultanées qui sélectionnent dans une table tronquée, notez que la commande 'TRUNCATE remet à zéro les statistiques de nombre de lignes de la table. La réinitialisation profite aux estimations de planification pour les nouvelles requêtes ultérieures sur la table. La réinitialisation des statistiques de comptage de lignes sur " TRUNCATE peut avoir un impact sur les requêtes existantes provenant de transactions simultanées. Si les nouvelles statistiques de décompte sont très différentes des décomptes avant le " TRUNCATE, l'exécution des requêtes simultanées risque d'être plus longue en raison de l'imprécision des estimations du planificateur pour les anciennes requêtes.

Si vous préférez conserver les statistiques de la table pour les requêtes en vol, vous pouvez configurer le système pour qu'il conserve les statistiques de la table et le nombre de lignes de la table avant le " TRUNCATE. Pour conserver les statistiques, vous pouvez attribuer la valeur false à la variable de base de données concurrent_truncate_zero_stats. Ce paramètre permet au système de toujours conserver les statistiques de la table, qui augmentent avec le temps au fur et à mesure que de nouvelles lignes sont insérées dans la table, ce qui peut entraîner des problèmes d'estimation de la requête et donc des durées d'exécution plus longues. Pour modifier le comportement par défaut :

  1. Connectez-vous au système NPS en tant que compte d'utilisateur nz.
  2. Avec n'importe quel éditeur de texte, ouvrez le fichier " /nz/data/postgresql.conf. Soyez prudent lorsque vous modifiez le " postgresql.conf. Il contient des paramètres de configuration importants pour le fonctionnement du système Netezza Performance Server
  3. Recherchez une définition de concurrent_truncate_zero_stats dans le fichier pour vous assurer qu'elle n'est pas déjà présente et/ou commentée. Si vous trouvez une entrée, assurez-vous que concurrent_truncate_zero_stats=false et qu'elle n'est pas commentée. Si vous ne trouvez pas d'entrée, ajoutez concurrent_truncate_zero_stats=false au fichier.
  4. Sauvegardez et fermez le fichier postgresql.conf.
  5. Arrêtez et redémarrez le logiciel NPS en utilisant les commandes " nzstop puis " nzstart

La variable concurrent_truncate_zero_stats peut également être définie (ou réinitialisée) dans des sessions individuelles de la base de données NPS à l'aide de la commande " set concurrent_truncate_zero_stats to <value>. Par exemple, il est possible de définir la variable au niveau de la session afin d'obtenir un comportement différent pour différentes tables. Les différentes sessions qui tronquent à partir de la même table doivent utiliser un paramètre cohérent pour cette variable afin d'obtenir un comportement cohérent.

Note : Les pratiques suivantes concernent l'utilisation du " GENERATE STATISTICS sur les tables qui sont tronquées et rechargées de façon répétée :
  • N'ajoutez pas de " GENERATE STATISTICS après le " TRUNCATE (ou après la validation de la transaction qui appelle le " TRUNCATE ).
  • Idéalement, " GENERATE STATISTICS devrait être exécuté après avoir rechargé les données avant de les interroger. Ceci est particulièrement important si la valeur de concurrent_truncate_zero_stats est fixée à false. Il s'agit également d'une bonne pratique générale pour les grandes tables de Performance Server, car certaines statistiques (telles que les "dispersions" des valeurs des colonnes) ne sont pas collectées automatiquement lors du chargement.
  • Si " GENERATE STATISTICS n'est pas actuellement exécuté après chaque rechargement et qu'il est trop difficile de modifier les flux de travail existants pour ajouter la commande, alors dans les cas où concurrent_truncate_zero_stats est faux, vous devriez exécuter " GENERATE STATISTICS périodiquement dans un travail d'arrière-plan. Choisissez une fréquence de travail telle qu'il n'y ait pas plus de quatre ou cinq troncatures et rechargements depuis le dernier " GENERATE STATISTICS.

Syntaxe

Syntaxe de troncature d'une table vide :
TRUNCATE [ TABLE ] <name>

Entrée

La commande TRUNCATE prend en compte les données suivantes :
Tableau 1. TRUNCATE entrée
Entrée Descriptif
<name> Le nom de la table à tronquer.

Sortie

La commande TRUNCATE produit le résultat suivant :
Tableau 2. TRUNCATE sortie
Sortie Descriptif
TRUNCATE TABLE La commande a abouti.

Droits

Vous devez être l'utilisateur admin, le propriétaire de la table, le propriétaire de la base de données ou du schéma, ou votre compte doit avoir le privilège Tronquer sur la table ou la classe d'objets Table.

Utilisation

Voici un exemple d'utilisation.
  • Supprimer toutes les lignes du tableau " bigtable:
    MYDB.SCH1(USER)=> TRUNCATE  bigtable;
  • Remplacer le contenu du tableau " mytable par de nouvelles données :
    BEGIN;
    TRUNCATE TABLE mytable;
    INSERT INTO mytable SELECT …;
    COMMIT;