[gl-como] Ripassino di MySQL
Jio
jiojio74@gmail.com
Ven 12 Ott 2007 16:32:04 CEST
Yuppie! Entrambe funzionano a meraviglia. Grazie.
Per la cronaca la seconda è un filino più veloce della prima, ma la
differenza è veramente minima. Ho aggiunto un group by c1,c2 ad entrambe per
evitare i duplicati (ma questo non l'avevo specificato) visto che questi due
diventano poi un indice unique.
A parte il caso particolare, vorrei spiegavi a cosa mi serve, magari per voi
è banale:
Ho un file da cui leggere dei dati riga per riga per poi inserirli nel
database (in t1), il file è ciccioso (2000 righe di media) quando faccio
l'inserimento devo verificare che i dati non siano già inseriti. Prima
leggevo una riga, verificavo che non ci fosse già il record e se non c'era
lo inserivo, altrimenti passavo alla riga dopo. Siccome nel 99% dei casi il
record non c'è continuavo a fare interrogazioni per nulla. Quindi ho copiato
tutta la struttura della tabella t1 in una tabella temporanea t2 dove
inserisco in massa tutte le righe. Ci faccio un bel group by (veloce veloce
essendo su una tabella decisamente più piccola) per eliminare i doppioni e
con questa query qui faccio una sola interrogazione decisamente più
ottimizzata (essendo fatta direttamente dal db) anziché 2000 e concludo con
lo svuotamento della t2. Ho ridotto drasticamente il tempo di elaborazione
dell'operazione ed il lock sulla tabella. Ora vado a fare una prova
dichiarandola delayed che magari guadagno ancora qualcosina ed evito in toto
il lock.
Grazie per aver risolto la sega mentale del venerdì. Ora posso andare a
sbevazzare felice e contento.
Per ritirare la birra vedo se riesco a passare alla riunione di mercoledì.
Altrimenti segna che prima o poi si organizza
Il 12/10/07, Riccardo (SCASI) <r.penco@scasinet.com> ha scritto:
>
> Jio ha scritto:
> > Hergh... è un pò che non mi diletto con le query e la memoria vacilla.
> > Ho provato a googlare in giro, ma mi sa che non ricordo proprio come
> > fosse la questione.
> > Scenario: ho una tabella t1 con i campi: ID, c1, c2, c3 ed una tabella
> > t2 con gli stessi campi, ora voglio inserire nella tabella t1 i c1, c2,
> > c3 della t2 che non hanno campi corrispondenti in c1 e c2.
> > Per trovare le righe che non corrispondono nelle due tabelle uso:
> > SELECT c1, c2, c3, c4 FROM `t2` WHERE (c1,c2) NOT IN (SELECT c1,c2 FROM
> t1)
> > che funziona allegramente (so che si può fare anche con un join, ma son
> > quattro valori in croce e questa la capisco meglio)
> >
> > Io avevo buttato giù qualcosa così:
> > INSER INTO t1 (c1, c2, c3, c4) SELECT c1, c2, c3, c4 FROM t2 WHERE
> > (c1,c2) NOT IN (SELECT c1,c2 FROM t1)
> >
> > ma mysql si lamenta.
> >
> > Boh! Già è venerdì e non ho voglia, già son con la testa al birrificio
> > di Lurago stasera, insomma: non mi viene.
> > Una birra a chi mi trova la soluzione più elegante ;)
> >
>
> Mi sono venute in mente queste due query.
> Non le ho provate e non conosco bene mysql (W PostgreSQL !!), quindi non
> sono sicuro che funzionino.
>
> insert into t1 (c1, c2, c3, c4)
> select t2.c1, t2.c2, t2.c3, t2.c4
> from t2
> left outer join t1 on t2.c1=t1.c1 and t2.c2=t1.c2
> where t1.ID is null
>
> oppure
>
> insert into t1 (c1, c2, c3, c4)
> select t.c1, t.c2, t.c3, t.c4
> from (
> select c1, c2, c3, c4
> from t2
> where (c1, c2) not in (
> select c1, c2
> from t1 )
> ) t
>
> ciao
> riki
>
> --
> Mailing list info: http://lists.linux.it/listinfo/gl-como
>
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: http://lists.linux.it/pipermail/gl-como/attachments/20071012/6aa025a3/attachment.htm
Maggiori informazioni sulla lista
gl-como