Newsgroup: it.comp.lang.delphi
Titolo: Un consiglio per un problema inerente [FIREBIRD]

Premesso che sono un principiante sia di delphi che di firebird, ho
questo problema da risolvare... (forse più un probelma più da
database, ma sul ng italiano relativo firebird risulta quasi
sconosciuto)
ho una tabella firebird contentente migliaia di NOMI (indicizzata e
unique) e una lista molto molto lunga di nomi su un file di testo
(questi ultimi già verificati univoci fra di loro)
io voglio inserire in tabella tutti i nomi nuovi (e conoscere quelli
scartati).
mi vengono in mente diverse soluzioni.
1) inserisco i momi ad uno ad uno e gestisco l'errore che mi da il
database in caso di nome doppio (UNIQUE) (probabilmente lentissimo)
2) Eseguo una select prima di inserire per sapere se il nome e
presente (immagino sia astronomicamente lento)
3) creo dentro al db una tabella temporanea inserisco tutti i nomi
della lista con un unica insert e a quel punto è facile fare una
select from [nomi nuovi] where nome NOT in select nome from
[nomivecchi]. a questo punto anche la select per trovare i doppi è
banale. Questa soluzione mi ispira fiducia, ma Firebird 2.01 mi sembra
non supporti tabelle temporanee (previsto per il 3.0 e anche in
anteprima sul 2.1).  quindi la tabella "TEMPORANEA" dovrebbe essere
gestita con una cancellazione finale da parte del programma.
Esiste una soluzione più elegante. Qualcosa a livello di
ClientDataSource che non ho capito? oppure con firebird è possibile
fare una select fra tabelle su due DB diversi? in questo caso potrei
creare un DB solo per le tabelle temporanee senza rischiare di
lasciare sporco sul DB dei dati e con in più una gestione molto più
semplificata per la multiutenza
Naturalmente se esiste una soluzione più semplice....


Di quanti record parliamo 1000 10000 100000 ?
In genere penso comunque che la più veloce fra le tre sia la 1°
Massimo

On 23 Mag, 11:32, nospam.ple...@nospam.nononospam wrote:

Di quanti record parliamo 1000 10000 100000 ?


100000
stima a naso
tabella da 100000 a 90000000 (imho non supererà 100000 ma mi hanno
richiesto di poter scalare)
e lista temporanea 2000 90000
frequenza casi doppi 5%-10%
io avrei detto la 3, per la 1 devo fare un mucchio di richieste al
database è secondo mè firebird perderà più tempo a preparare la
richiesta che a fare il lavoro effettivo.
Oviamente devo ancora fare le prove, sto sviluppando un altra parte
del progetto e a questa parte del problema ho solo pensato senza
scrivere una riga di codice.

 scrivere una riga di codice.
Un'alternativa alle 3 è scrivere una Store Procedure (che fa prima
select e poi, se non esiste, insert).
Se serve fammi sapere.
Massimo

 scrivere una riga di codice.
Un'alternativa alle 3 è scrivere una Store Procedure (che fa prima


Scusate ma google mi fa il post doppio !!

select e poi, se non esiste, insert).
Questa era la mia ipotesi punto 2 (beh! al primo colpo non la avevo
pensata come stored che certamentè è più veloce di una select esterna)
ma questo comunque comporta l'esecuzione di diciamo 8000 select se
devo inserire 8000 nomi, va bene che la tabella è indicizzata, ma non
mi stupirei se Firebird mi sputasse in un occhio.
per la quantità anche a me sembra eccessiva (io sospetto che sia
sovradimensionato di un fattore 100)
ad ogni modo la 2 non mi ispira proprio fiducia
quindi a giorni implementerò la 1 e la 3 (sono convinto che la tre sia
più performante e quindi devo sbatterci la testa prima di cambiare
opinione
Al limite la select NOT in non sarebbe nemmeno necessaria.
mi basta una select per individuare i doppi. Poi devo rinominare i
nomi già presenti (con un criterio che so per certo non essere gia
presente nella tabella iniziale) e a quel punto inserirli tutti.