2016-06-14 1 views
1

Je souhaite conserver les 20 derniers enregistrements dans la table VMR et supprimer tous les autres enregistrements. La table VMR a 5000000 enregistrements et sa croissance. J'ai également la colonne create_date qui a date datatype dans la table VMR et il a l'index non unique. J'ai essayé d'utiliser rownum pour supprimer les enregistrements et conserver les 20 derniers enregistrements en utilisant la requête ci-dessous, mais cela prend trop de temps pour la suppression. Existe-t-il un autre moyen d'exécuter la requête plus rapidement?Conserver les 20 derniers enregistrements et supprimer d'autres enregistrements dans oracle sql

delete from VMR 
where rowid not in 
     (select rowid 
      from VMR 
     where rownum <=20); 

Répondre

1

Essayez d'utiliser ROW_NUMBER()

WITH CTE AS (
SELECT t.*, 
     ROW_NUMBER() OVER(ORDER BY create_date DESC) as rnk 
FROM VMR t) 
DELETE FROM CTE 
WHERE CTE.rnk > 20 
+0

pouvez-vous s'il vous plaît expliquer la requête? Il n'a pas l'habitude d'utiliser la partition dans les requêtes – Andrew

+0

Il n'utilise pas réellement les partitions, cette partition est comme une clause GROUP BY pour classer les lignes, comme vous pouvez le voir, j'ai utilisé '1' et' 1' dans l'ordre par, puisque cela n'a pas d'importance. Cela classe juste la première rangée comme 1, deuxième comme 2 et ETC .. et puis avec ces données, supprimez tout ce qui est plus grand que 20. @Andrew – sagi

+0

https://docs.oracle.com/cd/B19306_01/server.102/ b14200/functions137.htm – sagi

3

Juste pour montrer une alternative:

-- get 20 last records and remember them 
create table vmr20 as 
    select * from vmr order by create_date desc fetch first 20 rows only; 

-- empty table via DDL which should be fastest 
truncate vmr; 

-- re-insert the last 20 rows 
insert into vmr 
    select * from vmr20; 

-- delete temp table 
drop table vmr20; 
+0

Un inconvénient d'utiliser truncate est que vous ne pouvez pas alors 'ROLLBACK'. – MT0

+0

Oui, c'est vrai. Il faut donc s'assurer de ne pas oublier d'exécuter la première instruction avant de la tronquer :-) Et il y a peu de temps quand la table est complètement vide. Donc, cela devrait être fait à un moment où les tables ne sont pas utilisées. –