0
votes

quelle déclaration de suppression est préférable pour supprimer des millions de lignes

J'ai une table qui contient des millions de lignes. Je veux supprimer toutes les données de plus d'une semaine en fonction de la valeur de la colonne last_updated.

Voici mes deux requêtes, P>

Approche 1: P>

l_lastupdated varchar2(255) := to_char(sysdate-nvl(p_days,7),'YYYY-MM-DD');
insert into B(ID) select ID from A where LASTUPDATED < l_lastupdated;
delete from A where id in (select id from B);


1 commentaires

Le problème fondamental est probablement que vous stockez des dates telles que Strings.so, à moins d'un index basé sur la fonction sur last_updated Cela ne fera pas une grande différence. L'approche 2 est en fait une manière rond-point de faire la même chose.


3 Réponses :


1
votes

Votre dateDeformat stockée semble appropriée pour un tri correct, vous pouvez donc aller à l'inverse et convertir sysdate en chaîne: xxx pré>

de sorte que ce serait: p>

Delete from A where last_updated < to_char(sysdate-7, ''yyyy-mm-dd'');


0 commentaires

0
votes

Si vous essayez de supprimer la plupart des rangées de la table, je vous conseillerais d'aller avec une approche différente, à savoir: xxx

puis xxx < / pré>

et enfin, vous pouvez renommer la nouvelle table à l'ancienne table.

Vous pouvez toujours partitionner la nouvelle table (c.-à-d. Créer la nouvelle table avec une déclaration séparée contenant les clauses de partitionnement et Ensuite, avez un insert comme sélectionnez dans la nouvelle table de l'ancienne table).

De cette façon, lorsque vous devez supprimer des lignes, c'est une simple question de déposer la ou des partitions pertinentes.


2 commentaires

Je n'irais pas renommer la table, car cela perd des déclencheurs, des contraintes, des références de clé étrangère et probablement plus. Il suffit d'insérer dans la table originale tronquée.


@Gordonlinoff Renaming est plus rapide, mais vous avez raison, vous devez recréer toutes les contraintes associées, déclencheurs, etc. de l'ancienne table, etc. Vous perdez l'avantage de faire la table partitionnée (sauf si vous n'êtes pas sur 12.2 ou plus et que vous puissiez faire partitionnement en ligne de la table)



1
votes

En supposant que la suppression supprime une fraction significative des données et des millions de lignes, approche trois: xxx

https://asktom.oracle.com/pls/apex/f?p=100:11:0 :: :: p11_question_id: 2345591157689

Vous devrez évidemment copier sur tous les index, subventions, etc. Mais la redéfinition en ligne peut aider avec ce https://oracle-base.com/articles/11g/online-table-ReRefinition-eulements-11gr1

Lorsque vous arrivez à 12.2, une autre option plus simple: un déplacement filtré.

Il s'agit d'une opération de déplacement de table Alter, avec une clause supplémentaire indiquant que vous souhaitez conserver les rangées. : xxx

pendant que vous attendez de passer à 12.2+ et si vous ne souhaitez pas utiliser la méthode Create-AS-SELECT pour une raison quelconque, l'approche 1 est supérieure :


0 commentaires