SlideShare a Scribd company logo
Template designed by
Set Based Thinking
Davide Mauri
dmauri@solidq.com
www.davidemauri.it
brought to you by
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
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
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
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
Demo
Prova su strada
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
Demo
L’alternativa
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
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
“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
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!
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
Iniziamo!
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
Demo
Calcolo delle rate
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
Demo
Raggruppamenti e valori
correlati
Data una tabella contenente tutte le transazioni
giornarliere, estrarre per ogni azione, per ogni ora, i valori di
apertura, chiusura, ecc.
Azioni
SymbolID TransactionDateTime Price Volume
1 2008-01-01 09:15:21.000 75.800 2589
1 2008-01-01 09:25:44.000 68.200 4386
1 2008-01-01 09:29:31.000 74.300 2837
1 2008-01-01 09:34:42.000 68.900 2937
1 2008-01-01 09:39:13.000 72.300 4513
1 2008-01-01 09:43:35.000 67.300 838
1 2008-01-01 09:51:57.000 73.800 1380
1 2008-01-01 09:56:42.000 68.700 4190
tran_hour from_datetime to_datetime symbol_id high low volume open close
9
2008-01-01
09:15:21.000
2008-01-01
09:56:42.000 1 75.800 67.300 23670 75.800 68.700
Demo
Borsa & Azioni
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
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 
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
Demo
Cinema, teatri e
magazzini
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
Demo
Raggruppamenti e range
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

More Related Content

Similar to Set Based Thinking

JugMarche: Machine learning: usi pratici di supervised learning
JugMarche: Machine learning: usi pratici di supervised learningJugMarche: Machine learning: usi pratici di supervised learning
JugMarche: Machine learning: usi pratici di supervised learning
Onofrio Panzarino
 

Similar to Set Based Thinking (20)

MySQL Day Milano 2019 - Il backup non ammette ignoranza
MySQL Day Milano 2019 - Il backup non ammette ignoranzaMySQL Day Milano 2019 - Il backup non ammette ignoranza
MySQL Day Milano 2019 - Il backup non ammette ignoranza
 
Optimizing dax
Optimizing daxOptimizing dax
Optimizing dax
 
Optimizing dax
Optimizing daxOptimizing dax
Optimizing dax
 
JugMarche: Machine learning: usi pratici di supervised learning
JugMarche: Machine learning: usi pratici di supervised learningJugMarche: Machine learning: usi pratici di supervised learning
JugMarche: Machine learning: usi pratici di supervised learning
 
Elaborazione automatica dei dati: computer e matlab
Elaborazione automatica dei dati: computer e matlabElaborazione automatica dei dati: computer e matlab
Elaborazione automatica dei dati: computer e matlab
 
SQL Server Modern Query Processing
SQL Server Modern Query ProcessingSQL Server Modern Query Processing
SQL Server Modern Query Processing
 
Coding Gym: divertirsi e migliorarsi a colpi di algoritmi - Marco Arena - Cod...
Coding Gym: divertirsi e migliorarsi a colpi di algoritmi - Marco Arena - Cod...Coding Gym: divertirsi e migliorarsi a colpi di algoritmi - Marco Arena - Cod...
Coding Gym: divertirsi e migliorarsi a colpi di algoritmi - Marco Arena - Cod...
 
Coding Gym: divertirsi e migliorarsi a colpi di algoritmi by Marco Arena
Coding Gym: divertirsi e migliorarsi a colpi di algoritmi by Marco ArenaCoding Gym: divertirsi e migliorarsi a colpi di algoritmi by Marco Arena
Coding Gym: divertirsi e migliorarsi a colpi di algoritmi by Marco Arena
 
Cert02 70-410
Cert02   70-410Cert02   70-410
Cert02 70-410
 
Corso di scratch - lezione 1
Corso di scratch - lezione 1Corso di scratch - lezione 1
Corso di scratch - lezione 1
 
Layered Expression Trees feat. CQRS
Layered Expression Trees feat. CQRSLayered Expression Trees feat. CQRS
Layered Expression Trees feat. CQRS
 
Quella sporca dozzina (a cascata) la vendetta
Quella sporca dozzina (a cascata) la vendettaQuella sporca dozzina (a cascata) la vendetta
Quella sporca dozzina (a cascata) la vendetta
 
Sql start!2019 Migliorare la produttività per lo sviluppo su SQL Server
Sql start!2019 Migliorare la produttività per lo sviluppo su SQL ServerSql start!2019 Migliorare la produttività per lo sviluppo su SQL Server
Sql start!2019 Migliorare la produttività per lo sviluppo su SQL Server
 
ML.Net - Machine Learning Framework for .NET
ML.Net - Machine Learning Framework for .NETML.Net - Machine Learning Framework for .NET
ML.Net - Machine Learning Framework for .NET
 
Inversion of Control @ CD2008
Inversion of Control @ CD2008Inversion of Control @ CD2008
Inversion of Control @ CD2008
 
Introduzione a..django
Introduzione a..djangoIntroduzione a..django
Introduzione a..django
 
Integrazione continua con TFS Build
Integrazione continua con TFS BuildIntegrazione continua con TFS Build
Integrazione continua con TFS Build
 
I Graph Database: analisi del comportamento degli utenti
I Graph Database: analisi del comportamento degli utentiI Graph Database: analisi del comportamento degli utenti
I Graph Database: analisi del comportamento degli utenti
 
Atomic Design e sviluppo di un Design System
Atomic Design e sviluppo di un Design SystemAtomic Design e sviluppo di un Design System
Atomic Design e sviluppo di un Design System
 
Sinfonia in Domino RE - Integrazione Symphony e Lotus Notes 8.x
Sinfonia in Domino RE - Integrazione Symphony e Lotus Notes 8.xSinfonia in Domino RE - Integrazione Symphony e Lotus Notes 8.x
Sinfonia in Domino RE - Integrazione Symphony e Lotus Notes 8.x
 

More from Davide Mauri

More from Davide Mauri (20)

Azure serverless Full-Stack kickstart
Azure serverless Full-Stack kickstartAzure serverless Full-Stack kickstart
Azure serverless Full-Stack kickstart
 
Agile Data Warehousing
Agile Data WarehousingAgile Data Warehousing
Agile Data Warehousing
 
Dapper: the microORM that will change your life
Dapper: the microORM that will change your lifeDapper: the microORM that will change your life
Dapper: the microORM that will change your life
 
When indexes are not enough
When indexes are not enoughWhen indexes are not enough
When indexes are not enough
 
Building a Real-Time IoT monitoring application with Azure
Building a Real-Time IoT monitoring application with AzureBuilding a Real-Time IoT monitoring application with Azure
Building a Real-Time IoT monitoring application with Azure
 
SSIS Monitoring Deep Dive
SSIS Monitoring Deep DiveSSIS Monitoring Deep Dive
SSIS Monitoring Deep Dive
 
Azure SQL & SQL Server 2016 JSON
Azure SQL & SQL Server 2016 JSONAzure SQL & SQL Server 2016 JSON
Azure SQL & SQL Server 2016 JSON
 
SQL Server & SQL Azure Temporal Tables - V2
SQL Server & SQL Azure Temporal Tables - V2SQL Server & SQL Azure Temporal Tables - V2
SQL Server & SQL Azure Temporal Tables - V2
 
SQL Server 2016 What's New For Developers
SQL Server 2016  What's New For DevelopersSQL Server 2016  What's New For Developers
SQL Server 2016 What's New For Developers
 
Azure Stream Analytics
Azure Stream AnalyticsAzure Stream Analytics
Azure Stream Analytics
 
Azure Machine Learning
Azure Machine LearningAzure Machine Learning
Azure Machine Learning
 
Dashboarding with Microsoft: Datazen & Power BI
Dashboarding with Microsoft: Datazen & Power BIDashboarding with Microsoft: Datazen & Power BI
Dashboarding with Microsoft: Datazen & Power BI
 
Azure ML: from basic to integration with custom applications
Azure ML: from basic to integration with custom applicationsAzure ML: from basic to integration with custom applications
Azure ML: from basic to integration with custom applications
 
Event Hub & Azure Stream Analytics
Event Hub & Azure Stream AnalyticsEvent Hub & Azure Stream Analytics
Event Hub & Azure Stream Analytics
 
SQL Server 2016 JSON
SQL Server 2016 JSONSQL Server 2016 JSON
SQL Server 2016 JSON
 
SSIS Monitoring Deep Dive
SSIS Monitoring Deep DiveSSIS Monitoring Deep Dive
SSIS Monitoring Deep Dive
 
Real Time Power BI
Real Time Power BIReal Time Power BI
Real Time Power BI
 
AzureML - Creating and Using Machine Learning Solutions (Italian)
AzureML - Creating and Using Machine Learning Solutions (Italian)AzureML - Creating and Using Machine Learning Solutions (Italian)
AzureML - Creating and Using Machine Learning Solutions (Italian)
 
Datarace: IoT e Big Data (Italian)
Datarace: IoT e Big Data (Italian)Datarace: IoT e Big Data (Italian)
Datarace: IoT e Big Data (Italian)
 
Azure Machine Learning (Italian)
Azure Machine Learning (Italian)Azure Machine Learning (Italian)
Azure Machine Learning (Italian)
 

Set Based Thinking

  • 1. Template designed by Set Based Thinking Davide Mauri dmauri@solidq.com www.davidemauri.it
  • 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
  • 20. Data una tabella contenente tutte le transazioni giornarliere, estrarre per ogni azione, per ogni ora, i valori di apertura, chiusura, ecc. Azioni SymbolID TransactionDateTime Price Volume 1 2008-01-01 09:15:21.000 75.800 2589 1 2008-01-01 09:25:44.000 68.200 4386 1 2008-01-01 09:29:31.000 74.300 2837 1 2008-01-01 09:34:42.000 68.900 2937 1 2008-01-01 09:39:13.000 72.300 4513 1 2008-01-01 09:43:35.000 67.300 838 1 2008-01-01 09:51:57.000 73.800 1380 1 2008-01-01 09:56:42.000 68.700 4190 tran_hour from_datetime to_datetime symbol_id high low volume open close 9 2008-01-01 09:15:21.000 2008-01-01 09:56:42.000 1 75.800 67.300 23670 75.800 68.700
  • 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

Editor's Notes

  1. Key Message: Joins supports also other operator than “=“
  2. Key Message: Introduce ranking functions and their usage, Show again that with UDF execution plan can tell you “lies”