Newsgroup: it.comp.lang.delphi
Titolo: Delphi + IB6 = Memoria KO

Ciao.... 
 
   Questo e' il mio primo messaggio su questo NG. Colgo l'occasione per
salutare tutti quanti. 
Ho un problema con Delphi e Interbase. Spiego cosa succede.Ho una tabella
che contiene circa 1.000.000 di record.
Da questa tabella devo eliminare tutti i valori che si ripetono piu'
volte, ovvero se avessi :
	pippo
	pluto 
	paperino
	pluto
Il risultato finale dovrebbe essere 
	pippo
	pluto	
	paperino
 
In modo da snellire il database. la query che eseguo e' molto banale 
SELECT * FROM TABELLA WHERE ID=XYZ
Una volta fatta la query per
selezionare tutti i campi , tramite delphi ho inziato a scorre il dataset
cancellado i record con un banale ciclo while. Ed ecco il problema:
Quando inizio a scorrere la tabella l'applicazione inizia a mangiarsi la
memoria. Alla fine del ciclo chido il dataset e lo riapro e la memoria
viene liberata.
Se pero' ho troppi record, o poca memoria succede che appare un bel "out
of memory". 
C'e' qualche modo per "scaricare" il dataset durante il ciclo per il
controllo dei record doppi ?!?!
Grazie mille per l'aiuto


ti conviene eliminare i duplicati con delle query ... e non caricando
i record in un dataset .. esaurisci la memoria e niente di +
Antonio

 record in un dataset .. esaurisci la memoria e niente di +
Non sono granche abile nella formulazione di query... come posso fare ad
eliminare tutte le occorrenze ??
Grazie mille per l'aiuto.

 pianger d'amore:

Se ho capito quello che vuoi fare... usa una clausola DISTINCT
nell'istruzione SELECT. In questo modo non avrai tutti i campi, ma solo
quelli non duplicati.
Poi dipende anche dai componenti che usi per accedere al DB. Stai per caso
usando IBX?

 caso usando IBX?
Si.. propio quelli....
Hanno qualche problema?? C'e' qualcosa di meglio ??

Non mi escono i msg con mailgate ecco perchè non vengono visualizzati alcuni
messaggi!
Riporto la risposto che ti dieti con mailgate.
----- Original Message -----
From: "Fabio Cillo" <fabio...@TOGLIQUESTOtiscali.it>
Newsgroups: it.comp.lang.delphi
Sent: Friday, October 04, 2002 3:21 PM
Subject: Re: Delphi + IB6 = Memoria KO
Io farei una stored procedure che andrebbe a selezionare i record multipli e
a cancellare l'ultimo in ordine di campo chiave. Ovviamente questo metodo
toglie un doppione per volta, quindi se il nome è triplicato o più, la
procedura deve essere ripetuta tante volte quanti sono i doppioni.
Esempio di procedura:
CREATE PROCEDURE CancellaDoppi
AS
     declare variable vCampoChiave integer;
Begin
   For
     Select Max(CampoChiave) from Tabella
     Group by CampoDoppio
     Having Count(CampoDoppio)>1
     Into :vCampoChiave
   Do
     Delete from Tabella Where CampoChiave=:vCampoChiave;
end
Ciao,
   Fabio

eliminare tutte le occorrenze ??
la query che verra' puo' essere un pochino complessa e articolata...
potresti per favore postare la struttura della tabella?
grazie
antonio

 potresti per favore postare la struttura della tabella?
E' molto semplice 
8 campi stringa 
1 chiamato ID integer not null
Primary Key ID 
Come vedi molto banale
Grazie !!

 eliminare tutte le occorrenze ??
Innanzitutto non ti conviene eseguire una "select *", ma devi eseguire una
select solo sul campo chiave primaria e il campo su cui vuoi compiere
controlli:
select PK, CAMPO from Tabella
Poi prova a fare lo scorrimento. In ogni caso, probabilmente non ti conviene
eseguire una DELETE ogni volta che incontri un record da cancellare,
piuttosto aggiungi un campo alla tabella (del tipo "FLAGCANC", S/N), lo
imposti a S ogni qual volta trovi un record da cancellare e a N, altrimenti.
Poi, esegui una:
 DELETE FROM Tabella WHERE FLAGCANC = 'S'
--------------------------------
Inviato via 
http://usenet.libero.it


wrote:

ipotizziamo che il campo in cui cercare i duplicati sia CAMPO1...
DELETE FROM [Tabella] WHERE ID NOT IN (Select DISTINCT ID, Campo1 FROM
[Tabella]);
mi pare che sia abbastanza chiaro e semplice
Antonio

 Hanno qualche problema?? C'e' qualcosa di meglio ??
Funziona abbastanza bene, se hai l'ultima versione (mi pare sia la 6.03), e
capisci il meccanismo delle transazioni (ci ho litigato abbastanza
all'inizio).
In alternativa, puoi usare IBO. Non mi ricordo il sito su cui l'ho trovato,
ma era liberamente scaricabile e dicono che funziona bene...

 [Tabella]);
In questo modo non cancelli *alcun* record.


 ha scritto nel messaggio
news:pan.2002.10.04.13....@xpedite.it...

Altra soluzione (non so se più vantaggiosa)
creare una tabella di appoggio identica
copiare i record con distinct
insert into copia
select distinct ....
svuotare la tabella principale
copiare i dati dalla tebella di appoggio
Saluti, Poalo