Tales from the Machine Room |
Home Page | Comments | Articles | Faq | Documents | Search | Archive | Tales from the Machine Room | Contribute | Set language to:en it | Login/Register
Per prima cosa mi faccio spiegare da Wendy come dovrebbero saltare fuori sti dati, quindi vado a guardare le informazioni che abbiamo nei log e scrivo un programmello che riempie una tabellina ad uopo per rigenerare tali informazioni.
Sembra fare quello che vogliamo, anche se, con un file di log per 1 giorno di un centinaio di giga ci vuole una giornata intera ad elaborarlo. Io schedulo per elaborare sul giorno precedente (log non-attivo) e risolvo brillantemente (penso io).
Fast-forward al giorno dopo quando K mi compare accanto.
K - Allora, stavo vedendo la funzione di fatturazione.
IO - Ma non hai solo 6 giorni da fare? Ti metti a fare la fatturazione adesso?
K - Eh, DB ha madonnato...
IO - Comunque, io ho creato una nuova tabella che dovrebbe contenere tutti
i dati di cui abbiamo bisogno e ci sono gia' dei dati reali dentro.
K - Ah, ma io pensavo invece di modificare le tabelle X, Y e Z per aggiungere
le informazioni che vogliamo e...
IO - Bello, ma dato che le informazioni sono gia' nella mia tabella,
perche' non te la usi e risolvi cosi'?
K - No ma perche' il codice sarebbe gia' scritto...
IO - Hummm... ieri mi dici che quella parte e' stata eliminata dal sistema ed
oggi mi dici che il codice e' gia' scritto?
K - In effetti il codice lo avevamo gia' scritto quando abbiamo deciso di
rimuovere la funzione cosi'...
IO - E questo successe quante versioni del database fa'?
Perche' data la tendenza di questa gente ad alterare la struttura dati ogni due per tre non e' che mi fidi molto del suo codice.
In ogni caso mi metto a guardare le tabelle X, Y e Z che questo rintronato vuole modificare. Allora, la mia tabella e' cosi' composta:
indirizzo char(255)
spam int(11)
virus int(11)
clean int(11)
data data
direzione char(1)
Dove 'direzione' puo' essere "o" per Output e "i" per Input. Semplice no? La
chiave primaria e' ovviamente indirizzo+data+direzione, perche' un singolo
indirizzo puo' esserci solo una volta per data/direzione (i dati sono
storicizzati). Mentre le tabelle che lui vuole usare sono cosi' fatte:
indirizzo char(60)
dominio char(60)
totale int(11)
data data
ora int(11)
id_cliente int(11)
Dove le informazioni sono per ora (non per giorno), l'indirizzo e' separato in
"indirizzo" e "dominio", invece dei 3 valori spezzati c'e' un solo valore
totale ed in piu' compare l'id del cliente (che e' collegato al dominio
tra l'altro).
IO - Hummm... ma noi abbiamo bisogno sia delle mail uscenti che di quelle
entranti, qui hai solo le uscenti.
K - Si infatti io volevo aggiungere due campi alla tabella: incoming e
outgoing ed avere la divisione tra le due.
IO - ...ed il vantaggio tra il modificare questa, modificare la
procedura che la crea e la mantiene e modificare le funzioni che la
visualizzano (perche' io sono sicuro che ci sono) ed aggiungere una funzione
per usare la mia tabella che gia' c'e' ed e' generata sarebbe?
K - Ma perche' la tua tabella ha i dati su diversi record, c'e' un record 'in'
ed un record 'out', quindi devo fare due ricerche per avere tutti i dati e
questo va a scapito delle prestazioni.
Ora, se state pensando "ma perche' non fa una semplice JOIN", e' perche' non conoscete K. Lui ovviamente non si sporca le mani con qualche cosa di vecchio ed antiquato come SQL. Lui ha questa bellissima libreria Object-Oriented che mette insieme i pezzi e costruisce le "dataview" senza che lui manco veda come e' fatto il database sotto. In effetti ho madonnato parecchio quando cercavo di fargli vedere la struttura dati come e' e non come gliela presenta la sua merda di libreria. Quindi la semplice idea di una "join" e' completamente aliena per lui.
Mi trattengo dall'ammaccarlo e gli dico che guardero' come fare. Mi metto a guardare la procedura che genera la foxxuta tabella che io dovrei modificare. Quella procedura e' chiamata in pipe con il sistema di logging, quindi riceve una linea alla volta, scarta tutto meno la linea con l'indirizzo di posta e memorizza i valori in memoria, al cambio d'ora i dati storicizzati sono scaricati sulla tabella. Ok, non dovrebbe essere troppo complicato modificarla in modo da prendere anche i dati relativi alle mail ENTRANTI oltre che uscenti.
Dopo un paio d'ore ho uno script di test, gli do in pasto uno dei file di log di un paio di giorni fa ed aspetto. Alle 6 di sera decido che me ne vado a casa e domani si vedra'. Il mattino dopo arrivo e scopro che lo script sta ancora lavorando. Ok, fankulo alle prestazioni del sistema.
Mentre sto discutendo la faccenda con K ("discutere" = "spiegare che il tuo sistema non funziona ed usiamo il mio che e' meglio"), arriva DaBoss. Gli spiego il problema.
IO - ...quindi per riempire i dati nella tabella come vuole lui ci si mette una
vita, mentre estrarli dalla tabella che dico io e' gia fatto.
DB - Come mai ci mette tanto?
IO - Perche' la procedura che effettua gli inserimenti in quella tabella non e'
stata pensata per fare quello e deve fare i salti mortali per trovare i dati
giusti. E perche' sono 200 milioni di linee da analizzare al giorno.
DB - (rivolto a K) E perche' non usi la sua di tabella se ha gia' tutti
i dati?
K - Perche' nella sua i dati sono su due linee diverse, quindi diventa piu'
lento a dare le risposte.
DB - Piu' lento quanto?
K - Hemmm... qualche minuto...
DB - La fatturazione la facciamo una volta al mese, Wendy puo' anche aspettare
qualche minuto per avere i dati.
K - Ma la responsivita' del sistema...
DB - (rivolto a K) Fila a modificare il codice!
Ecco a volte amo quest'uomo...
DB - (rivolto a me) A proposito, ho ricevuto l'ennesimo bug-fix da parte dei produttori del CRM e ci sarebbe da provarlo...
Ed altre volte invece...
Davide
27/07/2009 08:00
Comments are added when and more important if I have the time to review them and after removing Spam, Crap, Phishing and the like. So don't hold your breath. And if your comment doesn't appear, is probably becuase it wasn't worth it.
SQL questo sconosciuto By Gama posted 27/07/2009 08:25
Com'è che era? By Anonymous coward posted 27/07/2009 09:16
@ Anonymous coward By Davide Inglima posted 27/07/2009 12:54
Bellissima libreria Object-Oriented By Davide Inglima posted 27/07/2009 09:30
Come iniziare bene la settimana.... By Lex79_VE posted 27/07/2009 10:14
pallini... By Nik posted 27/07/2009 10:26
CVD By Anonymous coward posted 27/07/2009 10:39
Ma che droga assumono? By Kurgan posted 27/07/2009 16:11
libreria? By Riccardo Cagnasso posted 27/07/2009 16:16
@ Riccardo Cagnasso By Davide Bianchi posted 27/07/2009 16:24
@ Riccardo Cagnasso By Kent Morwath posted 27/07/2009 17:13
@ Kent Morwath By Davide Bianchi posted 27/07/2009 18:26
@ Davide Bianchi By Kent Morwath posted 27/07/2009 20:26
@ Kent Morwath By Anonymous coward posted 28/07/2009 02:24
@ Anonymous coward By Davide Bianchi posted 28/07/2009 07:33
data warehouse By Anonymous coward posted 28/07/2009 14:32
@ Anonymous coward By Riccardo Cagnasso posted 28/07/2009 22:41
@ Riccardo Cagnasso By Anonymous coward posted 29/07/2009 10:41
@ Anonymous coward By Riccardo Cagnasso posted 29/07/2009 15:36
@ Riccardo Cagnasso By Anonymous coward posted 29/07/2009 19:22
@ Anonymous coward By Riccardo Cagnasso posted 30/07/2009 02:21
@ Riccardo Cagnasso By Anonymous coward posted 31/07/2009 14:35
@ Anonymous coward By Lo Zeno posted 29/07/2009 16:00
@ Lo Zeno By Davide Bianchi posted 29/07/2009 16:14
This site is made by me with blood, sweat and gunpowder, if you want to republish or redistribute any part of it, please drop me (or the author of the article if is not me) a mail.
This site was composed with VIM, now is composed with VIM and the (in)famous CMS FdT.
This site isn't optimized for vision with any specific browser, nor
it requires special fonts or resolution.
You're free to see it as you wish.