Dublicate datalarin bulunmasi kolaydir ama silinmesin de bi takim sikintilar yasayabiliriz.Geçen gün 96 row için 1 saatten fazla çalisan select gördügümde ne oluyor acaba diye düsünmeye basladim.Internette arastirdigim bütün dublicate datalari bulma yöntemini denedim ama gene ise yaramadi.Sonunda söyle bir metot gelistirdim.Dublicate datalarin bulundugu tabloyu referans alarak bir tablo create ettim.Daha sonra bu create ettigim tablodan eslesen row_id leri buldum ve sonraki adimda da onlari sildim.
Simdi bakalim nasil yapmisiz
1-Tabloyu referans alarak kendi tablomuzu yaratma
create table tmp_deneme_yusuf as
select /*+ PARALLEL(a 32) */
kolon_1,kolon_2...kolon_n
,count(1) cnt
from ana_tablo a
group by kolon_1,kolon_2..kolon_n
having count(1) >1
Burda dikkat etmemiz gerekn ana tablo ile referans tablomuz birebir ayni olmalidr.Bu select cümlecigi bize kaç tane dublicate datanin oldugunu gösterir
2-Row idleri bulma
create table tmp_silinecek as
SELECT rowid rid
FROM (SELECT /*+ PARALLEL(a 32) */ a.*,
ROW_NUMBER () OVER (PARTITION BY kolon_1,kolon2..kolon_n ORDER BY ROWID)
AS sira
FROM tmp_deneme_yusuf a)
WHERE sira > 1
3-Son olarak 2. Adimda buldugumuz rowid leri siliyoruz
DELETE /*+ PARALLEL(a 32) */ tmp_deneme_yusuf a
WHERE ROWID IN (select rid from tmp_silinecek)
Bu yöntemle 5-10 dakika arasinda bütün dublicate datalarimdan kurtulmus oldumJ