Dai problemi più semplici a quelli più complessi, è la logica con cui si risolve il problema che fa la differenza. E, nel risolvere un problema, non sarebbe bello poter sempicemente dire alla macchina "cosa" si vuole ottenere, lasciando risolvere il problema di "come" farlo, alla macchina stessa? In questo modo essa potrebbe anche tenere conto delle condizioni di contorno, in modo tale di produrre il risultato nel modo migliore possibile. In questa sessione vedremo come poter risolvere problemi comuni utilizzando un approcio "Set-Based" ("pensare per insiemi"), grazie al quale sarà possibile migliorare le performance di oltre il 100%!
3. Works with SQL Server from 6.5, on BI from 2003
Specialized in Data Solution Architecture, Database
Design, Performance Tuning, BI
Microsoft SQL Server MVP
President of UGISS (Italian SQL Server UG)
Mentor @ SolidQ
Regular Speaker @ SQL Server events
Consulting & Training
Davide Mauri
3
4. Iniziamo con un problema apparentemente semplice
E vediamo dove ci porta
Dobbiamo sviluppare una sistema di online-ticketing per la
prenotazione di posti a sedere in teatri / stadi / cinema, ecc.
ecc.
Problema
5. Supponiamo di avere questa situazione
Arriva un gruppo di 5 persone: dove gli dico di sedersi?
Che algoritmo implemento nel mio sistema?
Cinema, teatri e magazzini
6. Cinema, teatri e magazzini – Row by Row
3 4 5 6 7 9
A. Imposta il «Contatore Posti Liberi» (CPL) a 1
B. Memorizza il valore ordinale (n) del primo posto
libero trovato (PPL)
C. Se il successivo posto libero ha ordinale n+1
allora aumenta il contatore CPL
D. Altrimenti memorizza PPL e CPL da qualche parte
E. Riparti da A
1 2 5 1
8. E’ il migliore?
…oppure solamente il primo che ci è venuto in mente?
E’ veramente cosi semplice come ci sembra?
…alla fine il codice è molto meno semplice di quanto ipotizzato!
E’ scalabile?
Se lo vediamo allo stadio di Maracanà (95.000 posti a sedere) cosa succede?
Cinema, teatri e magazzini – Row by Row
10. Le performance migliorano di un ordine di grandezza!
E di più di uno per quato riguarda gli I/O!!!!
Dobbiamo cambiare il modo di pensare alla soluzione
Non dobbiamo ragionare in termini di ciò che possiamo fare scrivendo il codice T-
SQL
Dobbiamo pensare a come trovare la soluzione migliore da un punto di vista
puramente “logico”
Considerazioni
11. Dobbiamo pensare all’intero insieme dei dati
In questo modo possiamo trovare una soluzione logica
esprimibile in modo unicamente dichiarativo
E non procedurale!
• Il codice è solamente un “tool”. E’ il mezzo, non il fine!
In questo modo permettiamo all’optimizer di fare il solo lavoro, altrimenti ci
sostiuiamo a lui
Thinking in Sets
12. “Houston abbiamo un problema”
Siamo abituati a pensare in modo procedurale (visto che la maggior parte dei
linguaggi di programmazione lo è)
Dobbiamo quindi disimparare a pensare in questo modo ed
imparare a pensare set-based!
Thinking in Sets
13. All’inizio sarà difficile, ma non preoccupatevi
All’inizio ogni cosa è difficile!
Thinking in Sets
Un pò meno:Facile: Ma è chiaro chi dei
due vincerà in una
competizione!
Tutto quello di cui
abbiamo bisogno
è esercizio!
14. Ora vedremo una serie di problemi reali, incontrati durante
differenti consulenze
Opportunamente rimodellati e generalizzati
E vedremo come risolverli usando un approccio “Set-Based”,
anche quando non sembra possibile che esista una
soluzione in tal senso
Vedrete che per la fine della sessione inizierete a “vedere la luce”
• Magari con un pò di mal di testa
Thinking in Sets
16. Dati valore del prestito, inizio e fine dello stesso, frequenza
di pagamento e interessi, generare tutte le righe
corrispondenti a tutte le date di scadenza delle rate
Rate, Mutui & Prestiti
Loan Value # Rates Payment Frequency % Interest
€ 10.000,00 12 1 5,00%
€ 20.000,00 12 6 6,00%
€ 30.000,00 12 6 5,50%
Rate Date
€ 875,00 January-10
€ 875,00 February-10
€ 875,00 March-10
€ 875,00 April-19
€ 875,00 May-10
€ 875,00 June-10
€ 875,00 July-10
€ 875,00 August-10
€ 875,00 September-10
€ 875,00 October-10
€ 875,00 November-10
€ 875,00 December-10
18. Data una lista di macchine, restituire l’ultimo stato notificato
nel log di lavoro
Raggruppamenti e valori correlati
Controller
A
B
C
Controller Status TimeStamp
A StandBy 1001
B StandBy 1001
C StandBy 1003
D Working 1004
A Working 1004
B StandBy 1006
D StandBy 1009
D Working 1010
D Working 1011
22. Supponiamo di avere questa situazione
Arriva un gruppo di 5 persone: dove gli dico di sedersi?
Che algoritmo implemento nel mio sistema?
Cinema, teatri e magazzini
23. Cinema, teatri e magazzini – Set Based
A. Se SQL Server potesse vedere l’immagine qui sopra
potrebbe facilmente identificare dei gruppi
E quindi potremmo usare un semplice «Group By»
B. Dobbiamo quindi trovare il modo di «convertire» questa
caratteristica «visuale» in un qualcosa di utilizzabile da
SQL Server
Più che convertire...far emergere
24. Cinema, teatri e magazzini – Set Based
A. Enumeriamo tutti i posti
B. Enumeriamo solo i posti liberi
C. Facciamo una differenza
D. Ed ora possiamo fare un bel GROUP BY!
1 2 3 4 5 6 7 8 9 10…
1 2 3 4 5 6 7 …
2 2 2 2 2 3 3
26. Data una lista di macchine, raggruppare per range tutti gli
stati riportati
Raggruppamenti e Range
Controller Status TimeStamp
A StandBy 1001
B StandBy 1002
B StandBy 1003
B StandBy 1004
A Working 1005
A Working 1006
A Working 1007
B Working 1008
B Working 1009
A StandBy 1010
A StandBy 1011
B StandBy 1012
Controller Status From To
A StandBy 1001 1001
B StandBy 1002 1004
A Working 1005 1007
B Working 1008 1009
A StandBy 1010 1011
B StandBy 1012 1012
28. Grazie a tutti per la partecipazione
Riceverete il link per il download a slide e demo via email nei
prossimi giorni
Per contattarmi
dmauri@solidq.com
Grazie
Notas del editor
Key Message: Joins supports also other operator than “=“
Key Message: Introduce ranking functions and their usage, Show again that with UDF execution plan can tell you “lies”