UGISS Community

Il sito della community dello User Group Italiano di SQL Server
Welcome to UGISS Community Sign in | Join | Help
in Search

Bellagita

Perchè la vita va presa con lo spirito giusto

Lanciamo una sfida: il modo più veloce per creare un milione di record

Ok. L'idea è questa: qual'è il modo più veloce per create una tabella NUMBERS (NUMBER int) con dentro un milione di numeri che vanno da 0 a 999999? Tutto ovviamente nel TempDb e con anche la DROP della tabella appena creata nel più sano spirito di querettaro da strapazzo!

Già è molto divertente pensare a diversi modi, sempre più veloci, ... Io sono riuscito a passare da minuti ad un secondo netto. E mi raccomando, il tutto deve essere provato su un Notebook ciofeca come il mio, possibilmente con Sql Server Express per stare in regola. Insomma non è una gara di hardware ma di come si scrive meglio le query.

Vi allego lo script, vale la pena di provarlo, un pezzo alla volta e con le statistiche client attive. Ci sono dentro dei trucchi notevoli, come quello con il GO 1000000, e arrivano anche delle delusioni grosse, come quella delle IDENTITY che non c'è modo per farle andare forti. 

Sul mio ferro si passa da minuti, a qualche secondo e nell'ultima versione ad un secondo netto, davvero niente male, chi rova il tutto su un qualche server un pelo decente? fatemi sapere i tempi!

Vi consiglio di scaricare lo script e nel frattempo seguire questo breve commento:

Prova 0: solo per vedere il GO 1000000 che ripete un comando un milione di volte. non provatela senza la transazione altrimenti fate notte. Ma se fossi in voi non la lancerei neanche (ma se lo fate, visto che la interromperete a metà, ricordatevi di rollbeccare e droppare la tabella).

Prova 1: un classico ciclo, la prima grossa delusione perchè non va, da dimenticare subito

Prova 2: il prodotto cartesiano. mentre fino ad ora erano scherzi, ora si incomincia ad ottenere un qualche tempo accettabile. Attenzione il prodotto cartesiano da la paga a tutti i precedenti metodi 'da programmatore'!

Prova 3: Prodotto cartesiano con select into, una conferma che la select into è molto più veloce della insert select

Prova 4: Altra grossa delusione la IDENTITY non va manco a spingerla

Prova 5: Il massimo con query compatibili SS2000

Prova 6: Le common table expression sono una bomba

Prova 7: Versione finale! voi riuscite a fare di più?

Published gen 24 2008, 09.53 by bellagita
Filed under:
Attachment: SempreDiPiù.txt

Comments

 

orsocurioso said:

Simpatica sta' cosa, non ho ancora letto il codice, ma oggi te lo sottometto su un server di produzione. e posto i risultati.

gennaio 25, 2008 8.17
 

orsocurioso said:

Ok, ho fatto un test su un Sql2005 installato su un IBM  HS20 con 2 processori Intel Xeon 3, 20 GHz 4 Gb di RAM - Win 2003 Server Standard edition - 2 dischi interni da 70 Gb in raid 1- una lun su storage Ds400 collegato in fibra da 150 Gb.

Ovviamente non e' un vero benchmark mica ho fermato le normali attivita' ;-) i risultati sono:

Prova 0 (senza transazione)  2' 7"

Prova 1  18 "

Prova 2  8"

Prova 3  2"

Prova 4 2"

Prova 5 3"

Prova 6 meno di un secondo

Prova 7 meno di un secondo

Prova 8 meno di un secondo

gennaio 25, 2008 1.15
 

bellagita said:

Grazie.

Come prevedibile su un server vero, per ottenere dei tempi confrontabile bisognerebbe passare a 10 milioni di record. Comunque credo che provare a lanciare queste query, meglio ancora a scriverle, faccia capire molto di come lavora un server.

Ok, in realtà è stato solo un bel gioco. Vi è piaciuto?

gennaio 25, 2008 4.18