SlideShare une entreprise Scribd logo
1  sur  144
Télécharger pour lire hors ligne
www.xedotnet.org
Gianluca Hotz
@glhotz | Presidente UGISS.ORG | Data Platform MVP
Best practices on
SQL Server
• Gianluca Hotz | @glhotz | ghotz@ugiss.org
• Fondatore e Mentor SolidQ
• 20+ anni con SQL Server (dalla 4.21 nel 1996)
• Modellazione basi di dati, dimensionamento e
amministrazione, sviluppo, ottimizzazione
• Interessi
• Modello relazionale, architettura DBMS, alta disponibilità
e Disaster Recovery
• Community
• 20 anni Microsoft MVP SQL Server (dal 1998)
• Fondatore e presidente UGISS
• User Group Italiano SQL Server (PASS Chapter)
2
Chi sono
10/10/2018
Agenda
Introduzione
Amministrazione
Sviluppo
10/10/2018 3
Introduzione
Best practices on SQL Server
10/10/2018 4
• Compito di preservare i dati e l’integrità fisica/logica
• Vita mediamente più lunga di un’applicazione
• Nasce OLTP…
• … poi arrivano reporting aziendale e BI
• … poi iniziano progetti di integrazione tra sistemi
• … magari arrivano delle fusioni
• Tipicamente usato da molteplici applicazioni
• … le informazioni possono crescere a dismisura
• … il carico di lavoro può cambiare frequentemente
• … collo di bottiglia rischia di impattarle tutte
10/10/2018 5
Database
10/10/2018 6
Best Practices
Best Practice di cosa?
• Database Engine
• SQL Server Agent
• Integration Services
• Analysis Services
• Reporting Services
• Master Data Services
• Data Quality Services
• Data Mining
• Edizioni Specifiche
• PDW/APS
• Edizioni PaaS
• SQL Database
• SQL DB Managed Inst.
• RDS for SQL Server
• SQL Data Warehouse
10/10/2018 7
• Amministrazione
• Prestazioni (dimensionamento, configurazione)
• Disponibilità (HA/DR, backup)
• Sicurezza (controllo accessi, permessi, crittografia)
• Sviluppo
• Prestazioni (schema, query, indici)
• Manutenzione futura
• Sicurezza (SQL Injection, crittografia)
• Sono tantissime…
• … alcune ormai classificate come «miti»
• … complessità scenari/RDBMS non aiutano
10/10/2018 8
Quali Best Practice?
• Tormentone nella community SQL Server!
• RDBMS è un software estremamente complesso!
• Serve conoscenza generica e specifica
• architettura
• modello relazionale e modellazione basi di dati
• linguaggi di interrogazione
• Best Practice vanno sempre contestualizzate
• spesso sono eccessive…
• … ma questo non significa che vadano ignorate!
• … a complicare le cose ci sono le diverse edizioni
• … e i diversi ambienti (on-premise, IaaS, PaaS)
• … e le diverse tipologie di carico di lavoro (OLTP/OLAP)
10/10/2018 9
It Depends!
10/10/2018 10
Best Practices
• Move Forward! ☺
• Almeno a SQL Server 2016 SP1!
• Diagnostica drasticamente migliorata
• Molti limiti rimossi
• Molte funzionalità EE disponibili in edizioni inferiori
• … ormai meglio direttamente a SQL Server 2017
10/10/2018 11
Tuttavia qualcosa di generico c’è…
10/10/2018 12
Supporto Versioni
Versione SQL Server Supporto “Mainstream” Supporto “Extended” Supporto SP
SQL Server 2000 SP4 08/04/2008 09/04/2013
SQL Server 2005 SP4 12/04/2011 12/04/2016
SQL Server 2008 SP4 08/07/2014 09/07/2019
SQL Server 2008R2 SP3 08/07/2014 09/07/2019
SQL Server 2012 SP3 09/10/2018
SQL Server 2012 SP4 11/07/2017 12/07/2022
SQL Server 2014 SP2 09/07/2019 09/07/2024
SQL Server 2016 SP1 09/07/2019
SQL Server 2016 SP2 13/07/2021 14/07/2026
SQL Server 2017 11/10/2022 12/10/2027 SP non previsti[1]
[1] https://blogs.msdn.microsoft.com/sqlreleaseservices/announcing-the-modern-servicing-model-for-sql-server
Amministrazione
Best practices on SQL Server
10/10/2018 13
• Iniziale
• Stima/analisi uso risorse sulla base del carico di lavoro
• Molto difficile per sistemi nuovi/custom
• Continuo («on-going»)
• Monitoring proattivo continuo
• Approvvigionamento nuove risorse (fisiche e/o virtuali)
• Cambio di configurazione
• Configurazione nuove funzionalità
10/10/2018 14
Dimensionamento
• Solitamente non abbiamo dati sufficienti
• Storicamente realizzato simulando il sistema:
«Benchmark sizing», generalmente molto costoso
• Confronto con benchmark di riferimento
• TPC-C, TPC-H, SAP-SD ecc.
• Tipicamente sono poco confrontabili
• Raccolta delle metriche di sistemi simili
• Non sempre possibile
Dimensionamento iniziale
10/10/2018 15
• Caratteristiche carico di lavoro diverse
• Transazionali (OLTP)
• Molte attività lettura/scrittura che coinvolgono pochi dati
• Decisionali, reporting, Business Intelligence (OLAP)
• Più attività di lettura che coinvolgono grossi volumi di dati
• Nel modo reale spesso sistemi misti
• Es. Reporting o BI integrati nel gestionale oppure…
• Query non performanti o mancanza di indici
Tipologie di sistemi
10/10/2018 16
• Gestisce risorse
• Come un Sistema Operativo
• Memoria, schedulazione task
• Primitive sincronizzazione ecc.
• Necessaria buona conoscenza
• Per capire bene parametri di configurazione
• Per capire quando e come cambiare i «default»
• http://blogs.msdn.com/b/sqlosteam/archive/2010/06/23
/sqlos-resources.aspx
SQLOS
10/10/2018 17
• Uso Intensivo
• Molte connessioni in parallelo
• Query computazionalmente onerose
• Risoluzione singole query con forza bruta
• Compressione (non particolarmente alto)
• Tecnologie «In-Memory»
• In generale
• Lasciare i parametri di configurazione di default
• Tuning configurazione per scenari specifici
• «Max Degree of Parallelism»
• «Cost Threshold for Parallelism
• «Max Worker Thread»
10/10/2018 18
Processori
• Affinità processori
• Schedulazione «thread»
• I/O affinity
• Parametro «Fiber mode»
• Parametro «Boost priority»
• In generale, non toccare!
Configurazione CPU
10/10/2018 19
• Gruppo condiviso di «lavoratori» che eseguono Query
• Modello concorrenza cooperativo vs. competitivo in
Windows
• Default in base a numero core/architettura CPU
(32/64bit)
• http://msdn.microsoft.com/en-us/library/ms190219.aspx
• Consumano memoria «MemToLeave»
• Non controllabile*
• x86: 512KB per worker thread
• X64: 2MB per worker thread (4MB per IA64)
Opzione «Max Worker Thread»
10/10/2018 20
• Inter-query
• Query distinte in esecuzione parallela
• Intra-query
• Parallelizzazione attività di una singola query
• Costoso in termini di inizializzazione/uso risorse
Parallelismo
10/10/2018 21
• Massimo grado parallelismo Intra-query
• Alcune regole generiche
• Abbassare per sistemi OLTP (in teoria fino a 1)
• Da 1 a numero core se core totali/per nodo NUMA <= 8
• Fisso a 8 se core totali/per nodo NUMA > 8
• Alcune operazioni possono beneficiare > 8
• es. reindex ma dipende anche dal «Recovery Model»
• Controllo più granulare con «Resource Governor»
• «Fine-tuning» per singole query
Configurazione «Max degree of parallelism»
10/10/2018 22
• Costo minimo stimato per considerare parallelismo
• Espresso in secondi ma…
• …stimato per esecuzione su sistema modello
• Regola generica
• Alzare per sistemi OLTP o misti
• Indicativamente partire da 20 e tenere sotto controllo
Parametro «Cost threshold for parallelism»
10/10/2018 23
• Tendenza a consolidare più database/istanze
• Sia per tendenza a virtualizzare in generale
• Che per aumento costi licenze Enterprise per core!
• Valutare di sfruttare al meglio i core
• Non lasciarli al 30-50% di utilizzo ma…
• Attenzione ai picchi di utilizzo!
• Attenzione a teoria delle code!
• aumento tempi di risposta esponenziale
• Enterprise Edition
• svariate tecnologie per sfruttare al meglio risorse
Considerazioni uso delle CPU
10/10/2018 24
• Uso intensivo
• Miriadi di cache (principali Buffer Pool/Procedure Cache)
• «In-Memory OLTP» (storage tabelle «Memory-Mased»)
• «In-Memory OLAP» (indici ColumnStore)
• In generale
• Quanta più possibile 😎
• Soprattutto con tecnologie «In-Memory»
• Supporto edizione Standard (128GB/32GB/32GB)
• Best Practice: impostazione manuale
• Parametro «Min Server Memory» solitamente no
• Parametro «Max Server Memory» quasi sempre si…
10/10/2018 25
Memoria
• MemToLeave (VAS Reservation)
• Thread stack
• Allocazioni >8KB fino a SQL 2008 R2
• Es. extended & COM procedures, linked servers,
OLEDB providers, SQLCLR
• Buffer Pool
• Organizzata in pagine da 8KB
• Principalmente Buffer e Procedure Cache (ma anche
altre)
• Obiettivo primario Buffer Cache: ridurre I/O fisico
• In-Memory OLTP Storage
SQL Server Memory 101
10/10/2018 26
• Quanta più possibile, ma… dipende
Dimensionamento Buffer Cache
Dimensione buffer cache
HitRatio
0%
100%
Database con un set di
dati “caldi”
Database teorico con accessi casuali
all’intero set di dati
10/10/2018 27
• Gestione dinamica
• Reagisce a pressione esterna (applicazioni o Windows)
• Problemi velocità deallocazione (Windows non aspetta…)
• Convivenza con altre applicazione non banale
• Anche con altri componenti del prodotto: SSIS, AS, RS
• Best Practice: impostazione manuale
• Parametro «Min Server Memory» solitamente no
• Parametro «Max Server Memory» quasi sempre si
Configurazione Memoria
10/10/2018 28
• SQL Server < 2012
• Controllava praticamente solo il Buffer Pool
• Tecnicamente solo le allocazioni di singole pagine da 8K
• SQL Server >= 2012
• Controlla tutta memoria (qualunque tipo di allocazione)
• Eccezione: memoria per «stack» dei «thread»
Parametro «Max Server Memory»
10/10/2018 29
• Diverse indicazioni per partire
• Circa il 10% in meno della memoria disponibile
• Formule più precise che tengono conto OS/applicazioni
• Numeri preconfezionati
• Importante tenere sotto controllo!
• Perfmon
• SQL Server: Buffer ManagerPage Life Expectancy
• SQL Server: Buffer ManagerPage reads/sec
• Physical DiskDisk Reads/sec
• DMV
• sys.dm_os_ring_buffers
• ring_buffer_type = 'RING_BUFFER_RESOURCE_MONITOR'
Configurazione «Max Server Memory»
10/10/2018 30
• Previene paginazione memoria Buffer Cache
• Messaggi di errore in ERRORLOG
• Eventi «ringbuffer» delle risorse
• Privilegio per utente associato al servizio SQL Server
• Policy locale "Lock pages in memory”
• Può essere sintomo di contesa con altre applicazioni
• memoria insufficiente
• configurazione «Max Server Memory» inadatta
Configurazione «Lock Pages in Memory»
10/10/2018 31
• Aggiungere memoria: modo semplice per aumentare le
prestazioni (specialmente per sistemi OLTP)
• Può essere problematico
• Costoso
• Massima capacità (numero slot/dimensione DIMM)
• Aggiungere storage spesso meno problematico
• Estensione del «Buffer Pool» su dischi SSD
Buffer Pool Extension
10/10/2018 32
• Memoria sotto pressione
• «Clean pages»
• possono essere liberate
• o scritte nelle estensioni BP
• «Dirty pages»
• devono essere scritte nei file dati
• possono essere scritte nelle estensioni BP
• Simile «Storage Tiering» ma controllato da SQL Server
Buffer Pool Extension: come funziona
10/10/2018 33
• DBA: «Devo rilasciare un nuovo database»
• SAN Admin: «di quanto spazio hai bisogno?»
• Problema: intendersi sul termine «capacità»
• Capacità in termini di spazio (Capacity GB/TB)
• Capacità di trasmissione (Throughput MB/sec o IOPS)
• Tempi di latenza (Latency ms)
Capacità Storage
10/10/2018 34
• Scenario classico: SAN monolitica
• CxO: «La SAN va benissimo! L’abbiamo pagata un occhio
della testa e ci girano 200 workstation e una dozzina di
altri server senza problemi!»
• Problema: molto spesso sovraccarica
• Spinto da venditori come sistemi a risorse infinite
• Tipicamente collo di bottiglia banda o HBA
• SQL Server con tanti core ma dati non arrivano
velocemente
Risorse infinite?
10/10/2018 35
• Parti comuni
• SQL Server, Windows OS, Drivers, CPU, PCI-Bus
• Storage DAS
• Controller, Cache, Shelf, Dischi
• Storage SAN
• HBA, Switch, FC Ports, Storage Processor, Backplane,
Dischi
• Qualche livello in più con ambienti virtuali
• Nel Cloud sparisce tutto… meglio o peggio?
Colli di bottiglia Storage
10/10/2018 36
Esempio massimo «throughput»
Plateau disco
Aggiunta disco
Plateau
numero dischi
per controller
Aggiunta
controller e
disco
Plateau
numero
controller per
bus/backplane
10/10/2018 37
• Ideale: separare su più volumi dati, log e tempdb
• Sfruttare al massimo gli accessi in parallelo
• Ottimizzare diversi pattern di accesso
• Granularità: tabelle/indici partizionati
• Ma… deve esserci effettivamente il «ferro» dietro ☺
• Tipo di volumi?
• Mediazione tra prestazioni e protezione (RAID)
• Formattazione con «Allocation unit size» da 64KB
• In genere una partizione per LUN
• Impatto CHKDSK con volumi di grosse dimensioni
Posizionamento file database
10/10/2018 38
• Diverse tipologie: lettura/scrittura
• Diverse modalità di accesso: sequenziale/random
• Di diverse dimensioni in base all’operazione
• Esempi
• Seeks: Random Read 8KB
• Scans: Sequential Read 8KB-512KB (Read-Ahead 1-8MB)
• Log writes: Sequential Writes up to 60KB
• Checkpoint/Lazy Writer: Random Writes 8KB-256KB
Pattern di accesso
10/10/2018 39
• OLAP
• Scan: letture sequenziali 64KB-512KB
• Caricamenti (bulk load): scritture sequenziali 128KB-256KB
• Ottimizzare «throughput» aggregato (massimizzare MB/sec)
• OLTP
• Molte operazioni lettura/scrittura random da 8KB
• Possibile una certa quantità di «read-ahead»
• Scritture in blocco nei file dati da cache
• Scritture su transaction log stabili
• Ottimizzare massimizzando IOPS tenendo bassa la latenza
Regole empiriche
10/10/2018 40
• Transaction Log
• 1-2 millisecondi
• ideale: <= 1 millisecondo
• Dati (sistemi OLTP)
• 5-20 millisecondi
• Ideale: <= 10 millisecondi
• Dati (sistemi DSS/OLAP)
• <= 25-30 millisecondi
• Di riferimento! Occorre comprendere i tipi di I/O di SQL
Valori di riferimento per latenza
10/10/2018 41
• «Disk Alignment» a 1024K (o multiplo 64K)
• Default a partire da Windows Vista/Server 2008
• Default versioni precedenti: disallineato
• Aumento prestazioni fino al 30%
• Ormai non se ne vedono più ☺
Best Practice partizioni
10/10/2018 42
• Da cosa è usato
• Oggetti utente (tabelle temporanee, variabili tabella,…)
• Oggetti interni (row versioning, worktables, sort,…)
• Best Practice
• Volume dedicato
• Se non si comprendono a fondo le caratteristiche degli
accessi I/O può essere meglio utilizzare un volume
condiviso con molte meccaniche
• Buon candidato SSD locale in molti scenari
• Trace Flag 1117 e 1118 (SQL Server < 2016)
• Numero di file
Database di sistema tempdb
10/10/2018 43
• Numero di file tempdb?
• «Numero di CPU»?
• «½ numero di CPU»?
• «½ numero di core senza contare HT»?
• «8»
• «Nessuno lo sa veramente…»?
• Dipende!
• Radice del problema: contesa pagine di allocazione
Tempdb: classico esempio di «mito»
10/10/2018 44
• Sessione SQL PASS «inside tempdb»
• https://www.youtube.com/watch?v=SvseGMobe2w
• Durata 02:42:43! ☺
• Approccio come Setup SQL 2016
• Numero di core o 8
• Si può aumentare
Numero di file tempdb
10/10/2018 45
• Impedisce uso di «Mixed Extents»
• Riduce contesa pagine allocazione SGAM
• Per tutti i database, problema solitamente con tempdb
• https://support.microsoft.com/en-us/kb/2154845
• http://www.sqlskills.com/blogs/paul/misconceptions-
around-tf-1118
• Non più necessario a partire da 2016
• Sempre attivi per tempdb
• Estensione ALTER DATABASE per altri database
Best Practice: Trace Flag 1118
10/10/2018 46
• In generale l’allocazione va gestita proattivamente!
• «Autogrow» come «paracadute»
• «Autoshrink» solo scenari «mobile» o non presidiati
10/10/2018 47
Allocazione spazio
• In genere, meglio pre-allocare lo spazio
• Attesa delle transazioni durante crescita automatica
• Può introdurre frammentazione a livello di File System
• Crescita automatica non bilanciata tra file stesso
filegroup
• Buona norma per tutti i database
• Considerare crescita automatica come «paracadute»
«Autogrow» e allocazione spazio
10/10/2018 48
• Forza crescita di tutti i file di un filegroup
• Non serve per evitare la pre-allocazione ☺
• Pensata principalmente per tempdb
• https://support.microsoft.com/en-us/kb/2154845
• Non più necessario a partire da 2016
• Sempre attivi per tempdb
• Estensione ALTER DATABASE per altri database
Best Practice: Trace Flag 1117
10/10/2018 49
• File non viene inizializzato con zeri
• Creazione, allocazione e restore se non esiste
• Valutare rischi di sicurezza (più teorici che altro…)
• Solo file dati, no log!
• Privilegio per utente associato al servizio SQL Server
• SE_MANAGE_VOLUME_NAME
• Policy locale “Perform Volume Maintenance Tasks”
• Integrato nel Setup da SQL 2016+
• Non serve per evitare pre-allocazione! ☺
Configurazione «Instant File Initialization»
10/10/2018 50
• In genere, «shrink» operazione straordinaria
• Crescita imprevista es. dovuta a query fuori controllo
• «Autoshrink» pensata per scenari non presidiati
• Es. mobile, workstation utenti
• Principalmente per edizione Express
• Introduce frammentazione
• Se log deve ricrescere, deve essere inizializzato
• Non può usare «Instant File Initialization»
• Transazioni devono attendere!
«Autoshrink» e allocazione spazio
10/10/2018 51
• Metodologia architetturale
• Per rilasciare sistemi configurati in maniera ottimale
• Legata a carichi di lavoro «Data Warehouse»
• Configurazione Hardware verificata con
«vendor/partner»
• Personalizzabile
• Non adatta per carichi di lavoro generici
• Analogo OLTP non esiste
Fast Track DW
10/10/2018 52
• «Non posso disabilitarlo?»
• «Fortunatamente no!» ☺
• A partire da SQL Server 2014
• In-Memory OLTP (tabelle persistenti solo in memoria)
• Delayed Durability / Lazy Commit (commit asincrono)
Transaction Log
10/10/2018 53
• Transazione può essere
• «Fully Durable»
• protocollo WAL tradizionale, commit sincrono
• «Delayed Durable»
• AKA «lazy commit» o commit asincrono
• «Eventual Durability» ☺
• Record Transaction Log mantenuti nel buffer
• Buffer scritto quando pieno o evento di «Flush»
• Possibile perdita della transazione!
• in modo consistente
• Applicazione deve tollerare la perdita di dati!
54
«Delayed Durability»
10/10/2018
• Buffer Transaction Log pieno
• Commit transazione «fully durable»
• stesso database
• Esecuzione manuale procedura sp_flush_log
• Attenzione! Shutdown SQL Server
• potrebbe non scrivere il buffer
• va trattato come un possibile evento di perdita dati
55
«Delayed Durability Flush»
10/10/2018
• Livello Database
• Livello «Atomic block» («Native Compilation»)
• Livello «Commit»
56
Controllo «Delayed Durability»
ALTER DATABASE … SET DELAYED_DURABILITY = { DISABLED | ALLOWED | FORCED }
CREATE PROCEDURE <procedureName> …
WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER
AS BEGIN ATOMIC WITH
( DELAYED_DURABILITY = ON,
TRANSACTION ISOLATION LEVEL = SNAPSHOT,
LANGUAGE = N'English'
… )
END
COMMIT [ { TRAN | TRANSACTION } ] [ transaction_name | @tran_name_variable ] ]
[ WITH ( DELAYED_DURABILITY = { OFF | ON } ) ]
10/10/2018
• A livello di riga
• In realtà nuovo formato più compatto
• Tipi dato storicamente a lunghezza fissa ora variabile
• Spazio occupato solo per rappresentare i valori
• Potenzialmente utile anche per sistemi OLTP
• A livello di pagina
• Compressione per prefisso (colonna)
• Compressione a dizionario (intera pagina)
• Principalmente utile per sistemi OLAP
• Vantaggio
• più pagine (compresse) nella «Buffer Cache»
Compressione dati
10/10/2018 57
• Se già è difficile il dimensionamento per un database…
• Molte domandi da porsi
• Server fisico o virtuale?
• Server dedicato solo al database Engine?
• Istanza singola o più istanze?
• On-premise o Cloud?
• Sharding?
• In generale per il consolidamento
• Database Tier 1 richiedono risorse dedicate
• Database Tier 2 richiedono una buona progettazione
• Database Tier 3 c’è più flessibilità…
10/10/2018 58
Consolidamento e scalabilità
Pattern comuni di scalabilità
10/10/2018 59
• Carico di lavoro disomogeneo
• Clienti di dimensione diversa
• Collocazione geografica e «Time Zone»
• Stagionalità diverse
• Spesso «Over-provisioning» risorse
• Per assorbimento picchi di utilizzo
• Poco efficiente dal punto di vista dei costi
Problema tipico SaaS
10/10/2018 60
• Collezione di DTU (eDTUs) e «Storage» (GBs) condivisi
• «Auto-Scale»
• Database aggiunti/rimossi a caldo
«Elastic Database Pools»
Image source: https://docs.microsoft.com/en-us/azure/sql-database/sql-database-what-is-a-dtu
10/10/2018 61
• Molteplici database condivisi da più «tenant»?
• Tecnica «Scale out» distribuzione dati
• Strutturati in maniera identica
• In più database indipendenti
• In base a «Sharding Key»
• Mappature per intervallo di valori o lista
62
«Sharding»
10/10/2018
• «Shard Map Management»
• Mappatura «Shard Keys» e database
• «Shard Keys» liste o intervalli di valori
• «Data Dependent Routing»
• Supporto apertura connessione in base a «Shard Key»
• «Multi-Shard Queries»
• Supporto Query che coinvolge più «Shard»
• Fusione unico «Result Set» con Semantica UNION ALL
63
«Elastic Database client library»
Image source: https://docs.microsoft.com/en-us/azure/sql-database/sql-database-elastic-scale-shard-map-management
10/10/2018
• «Split Range» distribuisce una «Shard» su due «Shard»
• «Merge Range» accorpa due «Shard» in una «Shard»
• «Move Shardlet»
64
«Elastic Database split-merge tool»
Image source: https://azure.microsoft.com/en-us/documentation/articles/sql-database-elastic-scale-overview-split-and-merge
10/10/2018
• Esecuzione Script T-SQL o applicazione DACPAC
• Collezione database personalizzata
• Tutti i database di «Elastic Database Pool»
• «Shard Set»
• Ritenta in caso di fallimento
• Schedulazione
65
«Elastic Database Jobs»
10/10/2018
• Attività amministrative
• es. «deploy» nuovo schema
• Ricostruzione degli indici
• Aggiornamento di dati in comune a più database
• Raccolta dati di telemetria in tabella comune
66
Scenari «Elastic Database Jobs»
10/10/2018
• Supporto T-SQL per query distribuite
• CREATE EXTERNAL DATA SOURCE
• CREATE EXTERNAL TABLE
• Partizionamento verticale «cross-database queries»
• TYPE = RDBMS
• Partizionamento orizzontale «Sharding»
• TYPE = SHARD_MAP_MANAGER
67
«Elastic Database Queries»
Image source: https://docs.microsoft.com/en-us/azure/sql-database/sql-database-elastic-query-overview
10/10/2018
• Best Practice Analyzer (PBA)
• Verifica conformità installazione
• Fornisce link a spiegazione
• Solo vecchie versioni 2008R2/2012 
• Funzionalità Policy Based Management
• Informalmente sostituisce BPA
• https://blogs.msdn.microsoft.com/poojakamath/2018/05/
03/where-is-my-sql-bpabest-practice-analyzer-for-sql-
201420162017
• Stored procedure sp_Blitz
• https://github.com/BrentOzarULTD/SQL-Server-First-
Responder-Kit
• altre procedure utili per monitoring/troubleshooting
Automazione controllo Best Practice
10/10/2018 68
• Infrastruttura per
• Definizione «policy»
• Controllo conformità installazione con «policy»
• Serie di «policy» conformi a Best Practice
• Categoria di policy per sicurezza!
• Enterprise Policy Management Framework
• http://aka.ms/epmframework
«Policy Based Management»
10/10/2018 69
• Classificazione carico di lavoro
• In «Workload Group»
• Tramite funzione T-SQL di classificazione
• Limiti utilizzo
• Massimo grado parallelismo
• Percentuale massima memoria del
pool per singola query
• Numero massimo richieste concorrenti
• Definizione gruppi di risorse («Pool»)
• Limiti di utilizzo per memoria, CPU, IOPS
(da 2014)
• Controllo uso risorse
• Assegnazione «Pool» a «Workload Group»
• Alcuni Limiti globali
Resource Governor
10/10/2018 70
• Non sottovalutare manutenzione ordinaria!
• Soluzione supportata dalla Community
• Backup
• Controllo integrità
• Manutenzione Indici e Statistiche
• https://ola.hallengren.com
• Altro?
• SQL Server Agent Alerts
• Directory Log di SQL Server
10/10/2018 71
Manutenzione
• Directory Log di SQL Server
• ERRORLOG*
• SQLAGENT*
• FDLAUNCHERRORLOG*
• SQLFT*
• Stack Dump in caso di crash! Sono importanti!
• ERRORLOG in particolare
• Limitare le dimensioni!
• Stored procedure sp_cycle_errorlog
• Numero di file per rotazione da SSMS
10/10/2018 72
Controllo dei log
• Avete dato un’occhiata ai report SSMS ultimamente?
• Availability Group Latency
• Performance Dashboard
• Glenn Berry Diagnostic Information Queries
• https://www.sqlskills.com/blogs/glenn/category/dmv-
queries
• Ma soprattutto…. sp_whoisactive!
• Wait Stats, blocking, piani esecuzione ecc. ecc.
• Installare su tutte le istanze! ☺
• 28 articoli didattici
• http://whoisactive.com
10/10/2018 73
Monitoring & Troubleshooting
«Security Layering»
74
Data
Encryption
Data
Access
Access
Control
Proactive
monitoring
• Transport Layer Security (in transit)
• Transparent Data Encryption (at rest)
• Cell-Level Encryption (at rest)
• Always Encrypted (at rest and in transit)
Data Encryption
• Dynamic Data Masking
• Row-Level Security
Data Access
• Encrypted Authentication
• SQL Firewall*
Access Control
• Auditing
• Threat Detection*
Proactive monitoring
10/10/2018
Sviluppo
Best practices on SQL Server
10/10/2018 75
• Discorso veramente troppo lungo
• Complesso a livello concettuale/logico
• Pieno di dettagli implementativi a livello fisico
• In generale: non perdere di vista le basi
• Modello relazionale (e limiti di SQL)
• Normalizzazione
10/10/2018 76
Schema
• Tipi dato complessi
• XML, GEOMETRY, GEOGRAPHY, HIERARCHYID,
FILESTREAM, FILETABLE, JSON
• «Type System» estensibile con integrazione CLR
• Integrazione SQL (XPATH/XQUERY, funzioni JSON)
• Sparse Column
• In-Memory OLTP/OLAP
• Graph Processing
• Temporal Tables
10/10/2018 77
Tecnologie da valutare
• Nome in codice «Hekaton»
• Ancora usato nella documentazione
• Esigenza: sfruttare al meglio RAM/CPU
• Costo della RAM in costante decrescita
• Frequenza CPU non cresce più esponenzialmente
• Anche se numero di core continua a crescere
• Serviva tecnologia che eseguisse stesse operazioni in
meno cicli
«In-Memory OLTP»
10/10/2018 78
• Tabelle «Memory-Optimized»
• Moduli T-SQL compilati
• Strutture dati lock e latch free
• Completamente integrate
• Superficie programmabilità
• V1 in 2014 limitata
• V2 in 2016 molti limiti rimossi
• V3 in 2017 ancora meno limiti
Componenti principali «In-Memory OLTP»
10/10/2018 79
• Struttura
• Completamente in memoria
• Indici di tipo hash e range (BW-tree)
• Compilazione schema e metodi accesso
• Persistenza (durability)
• Solo Schema o Schema e dati
• Storage
• Data file e delta file usano tecnologia FILESTREAM
• Transaction-log
80
«Memory Optimized Tables»
10/10/2018
• Compilazione codice nativo
• «Stored Procedures»
• «After Triggers»
• «Inline TVFs»
• «Scalar UDFs»
• Massime prestazioni ma…
• svariate limitazioni
• rimosse in ogni nuova versione
81
Compiled SQL Modules
10/10/2018
• Nuovo protocollo per transazioni MVCC
• Conforme proprietà ACID
• Molteplici versioni delle righe
• Completamente lock-free (timestamp based)
• Garbage Collector versioni non più utili
• Metodi di accesso «latch/spinlock-free»
• Operazioni CAS (Compare & Swap)
• Logica di «Thread assist/abort»
82
Concorrenza «In-Memory OLTP»
10/10/2018
• Protocollo ottimistico
• Possibili conflitti tra scritture
• Validazione prima della commit potrebbe fallire
• Gestione e logica di «retry» necessaria
Effetti collaterali MVCC
10/10/2018 83
• Formato «Storage» cambiato
• Molti miglioramenti
• Supporto per aggiornamento e campionamento statistiche
• ALTER TABLE eseguito in parallelo e scrittura solo metadati
nel T-Log
• Miglioramenti T-SQL
• Es. UNIQUE, FK, CHECK, TRIGGERS (solo AFTER), LOB
(colonne)
• Esteso supporto moduli T-SQL compilati nativamente
• Es. UNION, UNION ALL, DISTINCT, OUTER JOIN,
«Subqueries», OUTPUT, LOB (variabili/parametri), «Inline-
TVF» e «Inline-UDF» compilate
• Supporto per piani di esecuzione paralleli
• https://docs.microsoft.com/en-us/sql/database-engine/whats-
new-in-sql-server-2016#InMemory
«In-Memory OLTP» in SQL 2016
10/10/2018 84
• Supporto colonne calcolate
• Incluso indici su colonne calcolate
• Supporto funzioni JSON
• Sia moduli T-SQL compilati nativamente che vincoli
CHECK
• Esteso supporto moduli T-SQL compilati nativamente
• CROSS APPLY, CASE, TOP (N) WITH TIES,
sp_spaceused, sp_rename
• Prestazioni
• Fase REDO ripristino log delle transazioni effettuata in
parallelo
«In-Memory OLTP» in SQL 2017
10/10/2018 85
• Particolarmente efficienti per DWH
• Scansione/aggregazione grossi volumi
• Organizzazione per colonne
• Compressione a più livelli
• Modalità di accesso «batch»
• Introdotti in SQL Server 2012
• Estesi significativamente ad ogni nuova versione
• Disponibili in tutte le edizioni a partire da
• Forza bruta per query imprevedibili
• Indice Columnstore non-clustered su tutte le colonne
«In-Memory OLAP» («ColumStore indexes»)
10/10/2018 86
• Solo un indice «non-Clustered Columnstore» per
tabella
• Richiede sempre spazio extra (tabella rimane un B-
Tree/Heap)
• Tabella non può esser aggiornata direttamente
• Molte limitazioni
• Tipi dato
• Schema
• Interoperabilità con altre funzionalità
Indici «Columnstore» in SQL Server 2012
10/10/2018 87
• «Clustered Columnstore»
• Meccanismo di «storage» primario
• Aggiornabile
• Nessun altro indice consentito su tabella
• «Non-Clustered Columnstore»
• Come in SQL Server 2012
• Opzione di compressione «Archival»
• Più operatori in modalità «Batch»
• Scan, Filter, Project, Join, Group By, Union All
• Ancora solo query parallele
Indici «Columnstore» in SQL Server 2014
10/10/2018 88
• «Clustered Columnstore»
• Uno o più indici «non-Clustered Rowstore» supportati
• PK e FK possono essere supportati da indici «non-Clustered Rowstore»
• «Non-Clustered Columnstore»
• Supporto per un solo indici aggiornabile su tabelle «Rowstore»
• Supporto per condizione di filtro (es. dati «caldi» di un carico di lavoro
OLTP)
• Tabelle «In-Memory» possono avere un indice «Columnstore»
• «Compression Delay»
• Evita frammentazione quando dati caldi cambiano frequentemente con
carichi di lavoro OLTP
• Ancora più operatori in modalità «Batch»
• sort, aggregates with multiple distinct functions, window aggregate
functions, window user-defined aggregates, window aggregate analytic
functions
• Supporto per query «Single-Threaded» (MAXDOP 1)
Indici «Columnstore» in SQL Server 2016
10/10/2018 89
• Supporto per livelli di isolamento transazionale RCSI e
SI
• Deframmentazione indici tramite riorganizzazione
• Supporto per repliche secondarie AlwaysOn AG
• «Pushdown» aggregazioni e predicati su stringhe
(durante scansioni)
• Disponibile in tutte le edizione di SQL Server 2016
Service Pack 1
Indici «Columnstore» in SQL Server 2016
10/10/2018 90
• Supporto per colonne calcolate non persistenti
• Supporto per LOB
• Solo «Clustered Columnstore»
• Già disponibile anche in Azure SQL Database (Premium)
• Es. caso di studio utilizzo dati JSON
• https://blogs.msdn.microsoft.com/sqlserverstorageengine/20
17/02/09/json-data-in-clustered-column-store-indexes
• Supporto «online build/rebuild» indici «non-clustered
Columnstore»
• Riepilogo funzionalità per versione prodotto
• https://docs.microsoft.com/en-us/sql/relational-
databases/indexes/columnstore-indexes-what-s-new
Indici «Columnstore» in SQL 2017
10/10/2018 91
• Tabella «Node»
• Rappresenta un entità
• Tabella «Edge»
• Rappresenta una relazione «many-to-many»
• Può avere proprietà
• Ha un orientamento (digrafo), connette due nodi
• MATCH comando T-SQL
• Condizione di ricerca per grafi
• «Pattern matching» e attraversamento
Concetti «Graph Processing»
10/10/2018 92
«Graph Processing»
10/10/2018 93
• Tabelle temporanee locali/globali non supportate
• Tipi/variabili tabella non supportate
• Tabelle temporali «system-versioned» non supportate
• Tabella «memory optimized» non supportate
• Non si possono aggiornare direttamente (UPDATE)
• due «Node» collegati tramite un «Edge», soluzione
• inserire nuove «Edge» che punta a differenti «Node»
• cancellare precedente «Edge»
• Query «cross-database» con oggetti «Graph» non
supportate
Limiti «Graph Processing»
10/10/2018 94
Modifiche Database Temporali
«Temporal table» (dati correnti)
Insert / Bulk Insert
* Versioni vecchie
Update */ Delete *
«History table»
10/10/2018 95
Interrogazioni Database Temporali
«Temporal table» (dati correnti)
Query temporali *
FOR SYSTEM_TIME
ALL, AS OF,
BETWEEN … AND …, FROM … TO,
CONTAINED IN
«History table»
Query normali
(dati correnti)
* Include versioni
storiche
10/10/2018 96
• Idealmente: serializzazione delle transazioni
• massima consistenza
• minor concorrenza
• Se le transazioni non sono coordinate
• perdita di aggiornamenti (lost updates)
• Se transazioni sono parzialmente isolate
• letture inconsistenti («dirty reads»)
• letture non ripetibili («non-repeatable reads»)
• letture fantasma («phantoms»)
• conflitto in aggiornamento («update conflict»)
97
Isolamento delle transazioni
10/10/2018
• Aggiornamento non sincronizzato
98
Perdita di aggiornamenti
T2
T1
Tempo
X=10
Legge X
(10)
Legge X
(10)
Calcola
X=X+10
(20)
Calcola
X=X+15
(25)
Scrive X
X=20 X=25X=25
Scrive X
10/10/2018
• T2 vede le modifiche non confermate di T1
99
Letture inconsistenti
Calcola
X=X+15
(25)
T2
T1
Tempo
X=10
Legge X
(25)
Legge X
(10)
X=25
Scrive X
X=10
Rollback
Utilizza il
valore di X
che non è mai
stato confermato
10/10/2018
• Lettura successiva inconsistente
100
Letture non ripetibili
T2
T1
Tempo
X=10
Legge X
(10)
Legge X
(10)
Calcola
X=X+15
(25)
X=25
Scrive X
Commit
Legge X
(25)
10/10/2018
• Lettura intervallo successiva inconsistente
101
Letture fantasma
Part3, 50
Insert
Select count (*)
where cost > 30
(2)
T2
T1
Tempo
Part1,40
Part2, 70
Part3, 50
Part1,40
Part2, 70
Select count (*)
where cost > 30
(3)
10/10/2018
• 4 livelli supportati per standard ANSI
• «Read Uncommitted», «Read Committed», «Repeatable
Read», «Serializable»
• Predefinito «Read Committed» in due modalità
• pessimistico, usa protocollo di «Locking»
• ottimistico, usa «Row Versioning»
• Aggiunta di un ulteriore livello «Snapshot»
• simile a «Serializable» ma ottimistico in scrittura
• genera errore alla «Commit» in caso di conflitto
102
Livelli di isolamento in SQL Server
10/10/2018
• Tipologie di lock
• Condivisi (S)
• Esclusivi (X)
• Aggiornamento (U)
• Intenzione (I)
• Granularità
• Riga/chiave
• Intervallo tra chiavi
• Pagina
• Tabella
• «Extent»
• Database
103
Gestione dei «Lock»
Tabella
Pagina Pagina Pagina
Riga Riga Riga
10/10/2018
• Sottoinsieme della matrice di compatibilità
104
Compatibilità «Lock»
Lock
richiesto
IS S U IX X SchS SchM BU
IS Si Si Si Si No Si No No
S Si Si Si No No Si No No
U Si Si No No No Si No No
IX Si No No Si No Si No No
X No No No No No Si No No
SchS Si Si Si Si Si Si No Si
SchM No No No No No No No No
BU No No No No No Si No Si
Lock già rilasciato
10/10/2018
105
«Read Committed» (pessimistico)
CREATE TABLE t1 ( c1 int unique, c2 int)
INSERT INTO t1 VALUES (1, 5)
Transazione 1
BEGIN TRAN
UPDATE t1
SET c2 = 9
WHERE c1 = 1
COMMIT TRAN
Tempo
Transaction 2
(Read Committed)
BEGIN TRAN
SELECT c2 FROM t1
WHERE c1 = 1
-- SQL Server risponde 9
COMMIT TRAN
Bloccato!
10/10/2018
106
«Read Committed Snapshot» (ottimistico)
CREATE TABLE t1 ( c1 int unique, c2 int)
INSERT INTO t1 VALUES (1, 5)
Transazione 1
BEGIN TRAN
UPDATE t1
SET c2 = 9
WHERE c1 = 1
COMMIT TRAN
Tempo
Transaction 2
(Read Committed Snapshot)
BEGIN TRAN
SELECT c2 FROM t1
WHERE c1 = 1
-- SQL Server risponde 5
SELECT c2 FROM t1
WHERE c1 = 1
-- SQL Server risponde 9
COMMIT TRAN
10/10/2018
107
«Snapshot» (in lettura)
CREATE TABLE t1 (c1 int unique, c2 int)
INSERT INTO t1 VALUES (1, 5)
Transazione 2 (Snapshot Isolation)
SET TRANSACTION ISOLATION LEVEL
SNAPSHOT
BEGIN TRAN
SELECT c2 FROM t1 WHERE c1 = 1
-- SQL Server risponde 5
SELECT c2 FROM t1 WHERE c1 = 1
-- SQL Server risponde 5
COMMIT TRAN
SELECT c2 FROM t1 WHERE c1 = 1
-- SQL Server risponde 9
Transazione 1
BEGIN TRAN
UPDATE t1
SET c2 = 9
WHERE c1 = 1
COMMIT TRAN
Tempo
10/10/2018
108
«Snapshot» (in aggiornamento)
Tempo
CREATE TABLE t1 ( c1 int unique, c2 int)
INSERT INTO t1 VALUES (1,5)
transazione 1 (Snapshot Isolation)
SET TRANSACTION ISOLATION LEVEL
SNAPSHOT
BEGIN TRAN
SELECT c2 FROM t1 WHERE c1 = 1
-- SQL Server risponde 5
UPDATE t1
SET c2 = 15
WHERE c1 = 1
Transazione 2
BEGIN TRAN
UPDATE t1
SET c2 = 9
WHERE c1 = 1
COMMIT TRAN
Bloccato!
Rollback perché conflitto tra aggiornamenti
10/10/2018
109
Livelli, fenomeni, concorrenza
Livelli di
isolamento
Dirty Read
Non-
Repeatable
Read
Phantoms
Update
Conflict
Modello
concorrenza
Read
Uncommitted
Si Si Si No
Read
Committed
1 Locking
2 Snapshot
No
No
Si
Si
Si
Si
No
No
Pessimistico
Ottimistico
Repeatable
Read
No No Si No Pessimistico
Snapshot No No No Si Ottimistico
Serializable No No No No Pessimistico
Fenomeni permessi
10/10/2018
• Mediazione
• livello alto: più consistenza, meno prestazioni
• livello basso: meno consistenza, più prestazioni
• Modello pessimistico o ottimistico?
• dipende… quasi sempre va bene ottimistico
• è bene censire gli altri casi
• Scelta in base alle necessità applicative!
• non alle prestazioni!
110
Scelta livello di isolamento
10/10/2018
• «Shared Lock» rilasciati durante «scan»
• Righe possono muoversi fisicamente
• Es. aggiornamento indice «Clustered»
• Fenomeni problematici
• Rilettura stessa riga
• Mancata lettura di una riga
111
Altri problemi «Read Committed»
10/10/2018
• Evento normale
• tecniche per mitigarne la frequenza
• non sempre si possono eliminare completamente
• Risoluzione automatica
• controllo cicli ad intervalli regolari
• transazione meno costosa per annullamento viene scelta
come vittima («rollback»)
• controllo più frequente quando si verificano «Deadlock»
• Applicazioni
• ricevono errore 1205
• devono gestire il problema, es. riprovando
112
«Deadlock» (blocco critico)
10/10/2018
• Coinvolge più risorse
• Processi si bloccano a vicenda in modo ciclico
113
«Cycle Deadlock»
Resource
Granted Lock
Resource
Granted Lock
SPID 1 SPID 2
Waiting Lock
Waiting Lock
10/10/2018
• Coinvolge una risorsa
• Entrambi i processi hanno un «Lock» sulla risorsa
• tipicamente «Shared»
• con livello di isolamento più alto di «Read Committed»
• Entrambi cercano di convertire il «Lock»
• con uno incompatibile
114
«Conversion Deadlock»
Resource SPID 2SPID 1
Granted Lock
Granted Lock
Convert
Convert
10/10/2018
• Usare livello di isolamento appropriato
• Verificare possibilità di usare livelli «Snapshot»
• Controllare gli indici
• Controllare normalizzazione della base dati
• Le transazioni dovrebbero
• durare poco
• non richiedere interazione utenti (ormai tutto stateless)
• accedere alle risorse nello stesso ordine
115
Minimizzare i «Deadlock»
10/10/2018
• Fondamentale!
• Per avere una baseline
• Per capire dove spendono tempo le query
• Analisi uso risorse
• Numero di pagine lette (da disco e da cache)
• Memoria utilizzata (se query massiva)
• Analisi tempi di esecuzione
• Tempo di generazione piano esecuzione (compile time)
• Tempo di processamento effettivo (CPU time)
• Tempo di attesa risorse (Wait Stats)
10/10/2018 116
Analisi delle Query
• Fondamentale!
• Per migliorare le prestazioni
• Per determinare se si sono verificate regressioni
• SQL Server Management Studio
• Visualizzazione grafica/Live
• Confronto tra piani
• Strumenti Free di terze parti
• SentryOne Plan Explorer
• https://www.sentryone.com/plan-explorer
• ApexSQL Plan
• https://www.apexsql.com/sql_tools_plan.aspx
10/10/2018 117
Analisi dei piani di esecuzione
• SQL Server Execution Plans, 3rd Edition
• https://www.red-gate.com/products/dba/sql-
monitor/entrypage/execution-plans
10/10/2018 118
Libri consigliati
• Tempi di esecuzione query
• «CPU time» e «Elapsed time»
• SQL Server 2012 SP4, 2016 SP1, 2017, 2014 (TBD?)
• Top 10 «Wait Stats» a livello di query
• Attenzione all’accuratezza
• https://www.brentozar.com/archive/2017/07/sql-2016-
sp1-shows-wait-stats-execution-plans
• https://blogs.msdn.microsoft.com/sql_server_team/makin
g-parallelism-waits-actionable
• SQL Server 2016 SP1, 2017 (compatibilità 140!)
• «Trace Flags» attive
• Include il livello: global, session o query
• SQL Server 2012 SP4, 2016 SP1, 2017
Miglioramenti piani di esecuzione
10/10/2018 119
• sys.dm_exec_query_statistics_xml(session)
• Piano di esecuzione con statistiche transitorie «in-flight»
(es. n° righe, CPU)
• Funziona con profilazione
• Standard (eseguire SET STATISTICS XML ON prima di
eseguire la query)
• «lightweight statistics» (attivare Trace Flag 7412)
• Disponibile in SQL Server 2016 SP1, 2017
Profilazione esecuzione query
10/10/2018 120
• Registra piani di esecuzione e metriche prestazioni
• Per database
• In memoria consolidando su disco in modalità asincrona
• Integrato con SSMS e disponibile via DMV
• Da SQL Server 2017: anche Wait Stats!!
• Riduce drasticamente complessità «troubleshooting»
• Identificare «Top Query» per tempo/memoria/CPU/IO
• Analizzare utilizzo risorse per un determinato database
• Audit storia piani di esecuzione di una determinata query
• Identificare regressione piani di esecuzione
• Forzatura piano specifico da storico
QUERY STORE
10/10/2018 121
QUERY STORE TOP CONSUMER
10/10/2018 122
QUERY STORE TOP «REGRESSED QUERIES»
10/10/2018 123
• «Wait Stats» integrate con Query Store!
• Nuova DMV sys.query_store_wait_stats
• Organizzate in categorie
• ALTER DATABASE …
SET QUERY_STORE
(WAIT_STATS_CAPTURE_MODE = ON)
Query Store in SQL Server 2017
10/10/2018 124
10/10/2018 125
Attenzione a contestualizzare sempre!
• «Come fa la query a essere lenta in produzione?»
• «Sul mio Portatile la Query è velocissima!»
• Essenziale per generare piani esecuzione efficienti, predice
• Numero righe risultati intermedi (es. join, filtri, aggregazioni)
• Numero righe finale
• Fino a SQL 2012 in gran parte basato su SQL 7.0
• Abilitazione Fix QFE con Trace Flag per evitare regressioni
• Alcuni problemi necessitavano di un ridisegno rilevante
• Introdotto in SQL Server 2014 può causare regressioni
• Impatto su scenari specifici (es. data ordine, join)
• Maggior parte delle query dovrebbe comunque beneficiarne
Cardinality Estimator
10/10/2018 126
• Nessuna opzione indipendente in SQL Server 2014 
• Attivo con livello di compatibilità database a 120
• Trace Flag specifici per singole query (troubleshooting)
• A partire da SQL Server 2016
• ALTER DATABASE SCOPED CONFIGURATION
• LEGACY_CARDINALITY_ESTIMATION
• ma anche QUERY_OPTIMIZER_HOTFIXES
• A partire da SQL Server 2017
• USE HINT('QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n')
• https://support.microsoft.com/en-us/help/4342424/update-
to-query-optimizer-compatibility-level-n-in-use-hint-option
• Impostare o non impostare…
• Cambiamento con più potenzialità di regressioni da anni
• …ma era ora ☺ fare quanti più test possibili
Configurazione Cardinality Estimator
10/10/2018 127
• Aggiornamento database a 2016
• Mantenendo «Database Compatibility Level» originale
• Abilitare «Query Store» per il database
• Tutti i piani vengono congelati al livello originale
• Aspettare raccolta carico di lavoro rappresentativo
• Cambiare il livello di compatibilità a 130+
• Valutare problemi specifici di regressione con SSMS
• Forzare piani pre-aggiornamento registrati in «Query
Store»
• Usare HINT specifico da 2017 CU10+ per singole query
REGRESSIONE PIANI ESECUZIONE IN 2016+
10/10/2018 128
«Adaptive Query Processing» in SQL 2017
10/10/2018 129
• «Excessive Grant»
• Troppa memoria allocata rispetto a quanto utilizzata
• Impatto: «blocking», «out-of-memory», concorrenza ridotta
• «Poor Grant»
• Memoria allocata insufficiente con conseguente «spill» nel
tempdb
• Impatto: query lenta, eccessivo utilizzo del disco (tempdb)
• «Grant increase»
• Incremento memoria allocata dinamicamente troppo grande
• Impatto: instabilità del server, performance non predicibili
«Batch Memory Grant»
10/10/2018 130
• Valutazione post-esecuzione
• Aggiorna il valore di allocazione dei piani in cache
• Es. più memoria se «Poor», meno se «Excessive»
• Scenario sensibili a valori parametri
• Alcune query piani con allocazione diversa
• «memory grant feedback» si disabilita quando non
stabile
• memory_grant_feedback_loop_disabled extended event
• Memorizzazione nella cache dei piani
• Non persistente (non salvata nel Query Store)
• OPTION(RECOMPILE) impedisce memorizzazione e
«memory grant feedback»
Batch Mode Memory Grant Feedback
10/10/2018 131
• Scenari join
• Algoritmo «nested loop» migliore con piccole tabelle
candidate come «build»
• Algoritmo «hash» migliore con grandi tabelle candidate
come «build»
• «Adaptive joins» rinvia la scelta dopo scansione primo
input
«Batch mode adaptive joins»
10/10/2018 132
• Problema con «multi-statement table valued functions» (MSTVF)
• SQL Server <= 2012 ottimizza con cardinalità fissa = 1
• SQL Server 2014 & 2016 ottimizza con cardinalità fissa = 100
• SQL Server >= 2017
• Ottimizzazione parte
• Ottimizzazione viene in pausa per eseguire MSTVF (se
candidata)
• Ottimizzazione riprende con cardinalità corretta
«Interleaved Execution»
10/10/2018 133
• Altro argomento intrattabile in poco tempo
• Vero ginepraio di dettagli implementativi 
• Strettamente legato anche a implementazione schema
• In generale
• Mai dimenticarsi che è un linguaggio dichiarativo
• si specifica il «cosa» al posto del «come»…
• …lasciando spazio a continui miglioramenti del «come»!
• Soluzioni «set based» al posto di «cursor based»
• Oltre una certa complessità: «divide et impera»!
10/10/2018 134
Codice T-SQL
• Interpretazione richieste complesse
• equivalenze logiche, individuazione contraddizioni, …
• Ottimizzazione piano di esecuzione
• algoritmi, parallelismo, utilizzo di indici, …
• Riutilizzo dei piani di esecuzione
• anche in modalità adattiva
135
Ottimizzatore delle Query
10/10/2018
• “Any fool can write code that a computer can
understand. Good programmers write code that
humans can understand.”
• Martin Fowler
10/10/2018 136
Fondamentale
• Tutto sommato è abbastanza banale…
• …ma solo a vederla scoraggia chi deve metterci mano!
10/10/2018 137
Esempio
• Stessa query di prima
• Riformattata
• Con qualche alias
10/10/2018 138
Meglio. Molto meglio ☺
• Red Gate SQL Prompt
• Gold Standard ma €325/utente
• https://www.red-gate.com/products/sql-
development/sql-prompt/index
• Apex SQL Refactor
• Anche formattazione, gratuito
• https://www.apexsql.com/sql_tools_complete.aspx
• Poor Man’s T-SQL Formatter
• Open Source (github)
• http://architectshack.com/PoorMansTSqlFormatter.ashx
10/10/2018 139
Strumenti per la formattazione
10/10/2018 140
SELECT…
• Potenziali problemi applicativi con aggiunta colonne
• Rowset più grande del dovuto
• Può prevenire copertura query tramite indice
• Può favorire table scan rispetto a lookup
• In generale evitare di usarlo
• Enumerare tutte le colonne non cambia nulla ☺
• Eccezione: «Sparse Column», EXISTS()
10/10/2018 141
SELECT *
• https://sqlperformance.com
• Specialmente articoli di Paul White
• http://sqlblog.com
• Moltissimi autori
• T-SQL Fundamentals Third Edition
• https://www.microsoftpressstore.com/store/t-sql-
fundamentals-9781509302000
• T-SQL Querying
• https://www.microsoftpressstore.com/store/t-sql-
querying-9780735685048
10/10/2018 142
Approfondimenti
10/10/2018 143
Q&A
10/10/2018 144
www.ugiss.org
ghotz@ugiss.org
@glhotz
Gianluca Hotz
Contatti

Contenu connexe

Tendances

4. install and configure hyper v
4. install and configure hyper v4. install and configure hyper v
4. install and configure hyper vHameda Hurmat
 
2006 LEXUS GX470 Service Repair Manual
2006 LEXUS GX470 Service Repair Manual2006 LEXUS GX470 Service Repair Manual
2006 LEXUS GX470 Service Repair Manualhksmenmdm
 
Operating Systems 1 (11/12) - Input / Output
Operating Systems 1 (11/12) - Input / OutputOperating Systems 1 (11/12) - Input / Output
Operating Systems 1 (11/12) - Input / OutputPeter Tröger
 
ApresentaçãO2 Sistema Operacional
ApresentaçãO2  Sistema OperacionalApresentaçãO2  Sistema Operacional
ApresentaçãO2 Sistema OperacionalCláudia Costa
 
Focus schèmes & compétences P. Clauzard
Focus schèmes & compétences  P. ClauzardFocus schèmes & compétences  P. Clauzard
Focus schèmes & compétences P. Clauzardphilip61
 
03 backup-and-recovery
03 backup-and-recovery03 backup-and-recovery
03 backup-and-recoveryhunny garg
 
Computer organization and architecture.pptx
Computer organization and architecture.pptxComputer organization and architecture.pptx
Computer organization and architecture.pptxDIPTONILRAKSHIT
 
Memory Management in OS
Memory Management in OSMemory Management in OS
Memory Management in OSKumar Pritam
 
Secondary storage management in os
Secondary storage management in osSecondary storage management in os
Secondary storage management in osSumant Diwakar
 
Coletânea de exercícios informatica
Coletânea de exercícios informaticaColetânea de exercícios informatica
Coletânea de exercícios informaticaProf J.Trajano
 
Aula 12 - Escalonamento
Aula 12 - EscalonamentoAula 12 - Escalonamento
Aula 12 - Escalonamentocamila_seixas
 
Operating system 11 system calls
Operating system 11 system callsOperating system 11 system calls
Operating system 11 system callsVaibhav Khanna
 
Gestão de sistemas operacionais - aula 1
Gestão de sistemas operacionais - aula 1Gestão de sistemas operacionais - aula 1
Gestão de sistemas operacionais - aula 1Fernando Ottoni
 
Storage Management using LVM
Storage Management using LVMStorage Management using LVM
Storage Management using LVMPriyank Kapadia
 

Tendances (20)

4. install and configure hyper v
4. install and configure hyper v4. install and configure hyper v
4. install and configure hyper v
 
2006 LEXUS GX470 Service Repair Manual
2006 LEXUS GX470 Service Repair Manual2006 LEXUS GX470 Service Repair Manual
2006 LEXUS GX470 Service Repair Manual
 
Operating Systems 1 (11/12) - Input / Output
Operating Systems 1 (11/12) - Input / OutputOperating Systems 1 (11/12) - Input / Output
Operating Systems 1 (11/12) - Input / Output
 
ApresentaçãO2 Sistema Operacional
ApresentaçãO2  Sistema OperacionalApresentaçãO2  Sistema Operacional
ApresentaçãO2 Sistema Operacional
 
Focus schèmes & compétences P. Clauzard
Focus schèmes & compétences  P. ClauzardFocus schèmes & compétences  P. Clauzard
Focus schèmes & compétences P. Clauzard
 
03 backup-and-recovery
03 backup-and-recovery03 backup-and-recovery
03 backup-and-recovery
 
Operating system
Operating systemOperating system
Operating system
 
Tutorial virtual box
Tutorial virtual boxTutorial virtual box
Tutorial virtual box
 
Computer organization and architecture.pptx
Computer organization and architecture.pptxComputer organization and architecture.pptx
Computer organization and architecture.pptx
 
Memory Management in OS
Memory Management in OSMemory Management in OS
Memory Management in OS
 
Secondary storage management in os
Secondary storage management in osSecondary storage management in os
Secondary storage management in os
 
Virtualização
VirtualizaçãoVirtualização
Virtualização
 
Coletânea de exercícios informatica
Coletânea de exercícios informaticaColetânea de exercícios informatica
Coletânea de exercícios informatica
 
Aula 12 - Escalonamento
Aula 12 - EscalonamentoAula 12 - Escalonamento
Aula 12 - Escalonamento
 
Aula 5
Aula 5Aula 5
Aula 5
 
OS Migration
OS MigrationOS Migration
OS Migration
 
Operating system 11 system calls
Operating system 11 system callsOperating system 11 system calls
Operating system 11 system calls
 
Virtualização - Máquinas Virtuais
Virtualização - Máquinas VirtuaisVirtualização - Máquinas Virtuais
Virtualização - Máquinas Virtuais
 
Gestão de sistemas operacionais - aula 1
Gestão de sistemas operacionais - aula 1Gestão de sistemas operacionais - aula 1
Gestão de sistemas operacionais - aula 1
 
Storage Management using LVM
Storage Management using LVMStorage Management using LVM
Storage Management using LVM
 

Similaire à Best Practices on SQL Server

Azure PaaS databases
Azure PaaS databasesAzure PaaS databases
Azure PaaS databasesGianluca Hotz
 
SQL Server Benchmarking, Baselining and Workload Analysis
SQL Server Benchmarking, Baselining and Workload AnalysisSQL Server Benchmarking, Baselining and Workload Analysis
SQL Server Benchmarking, Baselining and Workload AnalysisGianluca Sartori
 
MySQL Tech Tour 2015 - Soluzioni di alta disponibilità con MySQL
MySQL Tech Tour 2015 - Soluzioni di alta disponibilità con MySQLMySQL Tech Tour 2015 - Soluzioni di alta disponibilità con MySQL
MySQL Tech Tour 2015 - Soluzioni di alta disponibilità con MySQLPar-Tec S.p.A.
 
Infinispan codemotion - Codemotion Rome 2015
Infinispan codemotion - Codemotion Rome 2015Infinispan codemotion - Codemotion Rome 2015
Infinispan codemotion - Codemotion Rome 2015Codemotion
 
JBoss Data Grid Tech Lab
JBoss Data Grid Tech LabJBoss Data Grid Tech Lab
JBoss Data Grid Tech LabUgo Landini
 
Metadata Driven Pipeline with Microsoft Fabric
Metadata Driven Pipeline  with Microsoft FabricMetadata Driven Pipeline  with Microsoft Fabric
Metadata Driven Pipeline with Microsoft FabricMarco Pozzan
 
iot Saturday 2019 - PoC iot in 1 ora
iot Saturday 2019 - PoC iot in 1 oraiot Saturday 2019 - PoC iot in 1 ora
iot Saturday 2019 - PoC iot in 1 oraAlessio Biasiutti
 
SQL Server Modern Query Processing
SQL Server Modern Query ProcessingSQL Server Modern Query Processing
SQL Server Modern Query ProcessingGianluca Hotz
 
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDBPolyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDBSteve Maraspin
 
Alfresco Day Roma 2015: Big Repository
Alfresco Day Roma 2015: Big RepositoryAlfresco Day Roma 2015: Big Repository
Alfresco Day Roma 2015: Big RepositoryAlfresco Software
 
Quanto mi costa SQL Pool Serverless Synapse
Quanto mi costa SQL Pool Serverless SynapseQuanto mi costa SQL Pool Serverless Synapse
Quanto mi costa SQL Pool Serverless SynapseMarco Pozzan
 
Multitenancy con SQL Server e Azure SQL Database
Multitenancy con SQL Server e Azure SQL DatabaseMultitenancy con SQL Server e Azure SQL Database
Multitenancy con SQL Server e Azure SQL DatabaseGianluca Hotz
 
Novità di SQL Server 2017
Novità di SQL Server 2017Novità di SQL Server 2017
Novità di SQL Server 2017Gianluca Hotz
 
Microsoft SQL Server PaaS (Platform as a Service)
Microsoft SQL Server PaaS (Platform as a Service)Microsoft SQL Server PaaS (Platform as a Service)
Microsoft SQL Server PaaS (Platform as a Service)Gianluca Hotz
 
Operational Data Store vs Data Lake
Operational Data Store vs Data LakeOperational Data Store vs Data Lake
Operational Data Store vs Data LakeMongoDB
 
No sql introduzione. Corso Sistemi Informativi Politecnico di Milano 12-11-2013
No sql introduzione. Corso Sistemi Informativi Politecnico di Milano 12-11-2013No sql introduzione. Corso Sistemi Informativi Politecnico di Milano 12-11-2013
No sql introduzione. Corso Sistemi Informativi Politecnico di Milano 12-11-2013Myti S.r.l.
 

Similaire à Best Practices on SQL Server (20)

Azure PaaS databases
Azure PaaS databasesAzure PaaS databases
Azure PaaS databases
 
SQL Server Benchmarking, Baselining and Workload Analysis
SQL Server Benchmarking, Baselining and Workload AnalysisSQL Server Benchmarking, Baselining and Workload Analysis
SQL Server Benchmarking, Baselining and Workload Analysis
 
MySQL Tech Tour 2015 - Soluzioni di alta disponibilità con MySQL
MySQL Tech Tour 2015 - Soluzioni di alta disponibilità con MySQLMySQL Tech Tour 2015 - Soluzioni di alta disponibilità con MySQL
MySQL Tech Tour 2015 - Soluzioni di alta disponibilità con MySQL
 
Presentazione bd2
Presentazione bd2Presentazione bd2
Presentazione bd2
 
Infinispan codemotion - Codemotion Rome 2015
Infinispan codemotion - Codemotion Rome 2015Infinispan codemotion - Codemotion Rome 2015
Infinispan codemotion - Codemotion Rome 2015
 
JBoss Data Grid Tech Lab
JBoss Data Grid Tech LabJBoss Data Grid Tech Lab
JBoss Data Grid Tech Lab
 
Data grid
Data gridData grid
Data grid
 
Metadata Driven Pipeline with Microsoft Fabric
Metadata Driven Pipeline  with Microsoft FabricMetadata Driven Pipeline  with Microsoft Fabric
Metadata Driven Pipeline with Microsoft Fabric
 
Azure sql database
Azure sql databaseAzure sql database
Azure sql database
 
iot Saturday 2019 - PoC iot in 1 ora
iot Saturday 2019 - PoC iot in 1 oraiot Saturday 2019 - PoC iot in 1 ora
iot Saturday 2019 - PoC iot in 1 ora
 
PoC IoT in 1 ora
PoC IoT in 1 oraPoC IoT in 1 ora
PoC IoT in 1 ora
 
SQL Server Modern Query Processing
SQL Server Modern Query ProcessingSQL Server Modern Query Processing
SQL Server Modern Query Processing
 
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDBPolyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
 
Alfresco Day Roma 2015: Big Repository
Alfresco Day Roma 2015: Big RepositoryAlfresco Day Roma 2015: Big Repository
Alfresco Day Roma 2015: Big Repository
 
Quanto mi costa SQL Pool Serverless Synapse
Quanto mi costa SQL Pool Serverless SynapseQuanto mi costa SQL Pool Serverless Synapse
Quanto mi costa SQL Pool Serverless Synapse
 
Multitenancy con SQL Server e Azure SQL Database
Multitenancy con SQL Server e Azure SQL DatabaseMultitenancy con SQL Server e Azure SQL Database
Multitenancy con SQL Server e Azure SQL Database
 
Novità di SQL Server 2017
Novità di SQL Server 2017Novità di SQL Server 2017
Novità di SQL Server 2017
 
Microsoft SQL Server PaaS (Platform as a Service)
Microsoft SQL Server PaaS (Platform as a Service)Microsoft SQL Server PaaS (Platform as a Service)
Microsoft SQL Server PaaS (Platform as a Service)
 
Operational Data Store vs Data Lake
Operational Data Store vs Data LakeOperational Data Store vs Data Lake
Operational Data Store vs Data Lake
 
No sql introduzione. Corso Sistemi Informativi Politecnico di Milano 12-11-2013
No sql introduzione. Corso Sistemi Informativi Politecnico di Milano 12-11-2013No sql introduzione. Corso Sistemi Informativi Politecnico di Milano 12-11-2013
No sql introduzione. Corso Sistemi Informativi Politecnico di Milano 12-11-2013
 

Plus de Gianluca Hotz

SQL Server 2022 Programmability & Performance
SQL Server 2022 Programmability & PerformanceSQL Server 2022 Programmability & Performance
SQL Server 2022 Programmability & PerformanceGianluca Hotz
 
SQL Server 2022 Intelligent Query Processing
SQL Server 2022 Intelligent Query ProcessingSQL Server 2022 Intelligent Query Processing
SQL Server 2022 Intelligent Query ProcessingGianluca Hotz
 
Le novità di SQL Server 2022
Le novità di SQL Server 2022Le novità di SQL Server 2022
Le novità di SQL Server 2022Gianluca Hotz
 
IaaS and PaaS relational databases in the cloud
IaaS and PaaS relational databases in the cloudIaaS and PaaS relational databases in the cloud
IaaS and PaaS relational databases in the cloudGianluca Hotz
 
Data Integrity with SQL Database Ledger
Data Integrity with SQL Database LedgerData Integrity with SQL Database Ledger
Data Integrity with SQL Database LedgerGianluca Hotz
 
Azure SQL Database Ledger
Azure SQL Database LedgerAzure SQL Database Ledger
Azure SQL Database LedgerGianluca Hotz
 
Come utilizzare AWS DMS per migrare SQL Server ad Amazon Aurora
Come utilizzare AWS DMS per migrare SQL Server ad Amazon AuroraCome utilizzare AWS DMS per migrare SQL Server ad Amazon Aurora
Come utilizzare AWS DMS per migrare SQL Server ad Amazon AuroraGianluca Hotz
 
Best Practices for Running Microsoft SQL Server on AWS
Best Practices for Running Microsoft SQL Server on AWSBest Practices for Running Microsoft SQL Server on AWS
Best Practices for Running Microsoft SQL Server on AWSGianluca Hotz
 
Come utilizzare AWS Database Migration Service per migrare SQL Server ad Amaz...
Come utilizzare AWS Database Migration Service per migrare SQL Server ad Amaz...Come utilizzare AWS Database Migration Service per migrare SQL Server ad Amaz...
Come utilizzare AWS Database Migration Service per migrare SQL Server ad Amaz...Gianluca Hotz
 
Azure SQL Database Ledger
Azure SQL Database LedgerAzure SQL Database Ledger
Azure SQL Database LedgerGianluca Hotz
 
SQL Server Modern Query Processing
SQL Server Modern Query ProcessingSQL Server Modern Query Processing
SQL Server Modern Query ProcessingGianluca Hotz
 
SQL Server Failover Cluster Instances con Azure Managed Disks
SQL Server Failover Cluster Instances con Azure Managed DisksSQL Server Failover Cluster Instances con Azure Managed Disks
SQL Server Failover Cluster Instances con Azure Managed DisksGianluca Hotz
 
SQL Server Back to Basics: Sicurezza
SQL Server Back to Basics: SicurezzaSQL Server Back to Basics: Sicurezza
SQL Server Back to Basics: SicurezzaGianluca Hotz
 
SQL Server Failover Cluster Instances con Amazon FSx in AWS
SQL Server Failover Cluster Instances con Amazon FSx in AWSSQL Server Failover Cluster Instances con Amazon FSx in AWS
SQL Server Failover Cluster Instances con Amazon FSx in AWSGianluca Hotz
 
SQL Server Data Virtualization with polybase
SQL Server Data Virtualization with polybaseSQL Server Data Virtualization with polybase
SQL Server Data Virtualization with polybaseGianluca Hotz
 
SQL Server Data Virtualization with Polybase
SQL Server Data Virtualization with PolybaseSQL Server Data Virtualization with Polybase
SQL Server Data Virtualization with PolybaseGianluca Hotz
 
SQL Server Modernization
SQL Server ModernizationSQL Server Modernization
SQL Server ModernizationGianluca Hotz
 
Le novità di sql server 2019
Le novità di sql server 2019Le novità di sql server 2019
Le novità di sql server 2019Gianluca Hotz
 

Plus de Gianluca Hotz (20)

SQL Server 2022 Programmability & Performance
SQL Server 2022 Programmability & PerformanceSQL Server 2022 Programmability & Performance
SQL Server 2022 Programmability & Performance
 
SQL Server 2022 Intelligent Query Processing
SQL Server 2022 Intelligent Query ProcessingSQL Server 2022 Intelligent Query Processing
SQL Server 2022 Intelligent Query Processing
 
Le novità di SQL Server 2022
Le novità di SQL Server 2022Le novità di SQL Server 2022
Le novità di SQL Server 2022
 
IaaS and PaaS relational databases in the cloud
IaaS and PaaS relational databases in the cloudIaaS and PaaS relational databases in the cloud
IaaS and PaaS relational databases in the cloud
 
Data Integrity with SQL Database Ledger
Data Integrity with SQL Database LedgerData Integrity with SQL Database Ledger
Data Integrity with SQL Database Ledger
 
Azure SQL Database Ledger
Azure SQL Database LedgerAzure SQL Database Ledger
Azure SQL Database Ledger
 
Come utilizzare AWS DMS per migrare SQL Server ad Amazon Aurora
Come utilizzare AWS DMS per migrare SQL Server ad Amazon AuroraCome utilizzare AWS DMS per migrare SQL Server ad Amazon Aurora
Come utilizzare AWS DMS per migrare SQL Server ad Amazon Aurora
 
Best Practices for Running Microsoft SQL Server on AWS
Best Practices for Running Microsoft SQL Server on AWSBest Practices for Running Microsoft SQL Server on AWS
Best Practices for Running Microsoft SQL Server on AWS
 
SQL Server in AWS
SQL Server in AWSSQL Server in AWS
SQL Server in AWS
 
Come utilizzare AWS Database Migration Service per migrare SQL Server ad Amaz...
Come utilizzare AWS Database Migration Service per migrare SQL Server ad Amaz...Come utilizzare AWS Database Migration Service per migrare SQL Server ad Amaz...
Come utilizzare AWS Database Migration Service per migrare SQL Server ad Amaz...
 
Azure SQL Database Ledger
Azure SQL Database LedgerAzure SQL Database Ledger
Azure SQL Database Ledger
 
SQL Server Modern Query Processing
SQL Server Modern Query ProcessingSQL Server Modern Query Processing
SQL Server Modern Query Processing
 
SQL Server in AWS
SQL Server in AWSSQL Server in AWS
SQL Server in AWS
 
SQL Server Failover Cluster Instances con Azure Managed Disks
SQL Server Failover Cluster Instances con Azure Managed DisksSQL Server Failover Cluster Instances con Azure Managed Disks
SQL Server Failover Cluster Instances con Azure Managed Disks
 
SQL Server Back to Basics: Sicurezza
SQL Server Back to Basics: SicurezzaSQL Server Back to Basics: Sicurezza
SQL Server Back to Basics: Sicurezza
 
SQL Server Failover Cluster Instances con Amazon FSx in AWS
SQL Server Failover Cluster Instances con Amazon FSx in AWSSQL Server Failover Cluster Instances con Amazon FSx in AWS
SQL Server Failover Cluster Instances con Amazon FSx in AWS
 
SQL Server Data Virtualization with polybase
SQL Server Data Virtualization with polybaseSQL Server Data Virtualization with polybase
SQL Server Data Virtualization with polybase
 
SQL Server Data Virtualization with Polybase
SQL Server Data Virtualization with PolybaseSQL Server Data Virtualization with Polybase
SQL Server Data Virtualization with Polybase
 
SQL Server Modernization
SQL Server ModernizationSQL Server Modernization
SQL Server Modernization
 
Le novità di sql server 2019
Le novità di sql server 2019Le novità di sql server 2019
Le novità di sql server 2019
 

Best Practices on SQL Server

  • 1. www.xedotnet.org Gianluca Hotz @glhotz | Presidente UGISS.ORG | Data Platform MVP Best practices on SQL Server
  • 2. • Gianluca Hotz | @glhotz | ghotz@ugiss.org • Fondatore e Mentor SolidQ • 20+ anni con SQL Server (dalla 4.21 nel 1996) • Modellazione basi di dati, dimensionamento e amministrazione, sviluppo, ottimizzazione • Interessi • Modello relazionale, architettura DBMS, alta disponibilità e Disaster Recovery • Community • 20 anni Microsoft MVP SQL Server (dal 1998) • Fondatore e presidente UGISS • User Group Italiano SQL Server (PASS Chapter) 2 Chi sono 10/10/2018
  • 4. Introduzione Best practices on SQL Server 10/10/2018 4
  • 5. • Compito di preservare i dati e l’integrità fisica/logica • Vita mediamente più lunga di un’applicazione • Nasce OLTP… • … poi arrivano reporting aziendale e BI • … poi iniziano progetti di integrazione tra sistemi • … magari arrivano delle fusioni • Tipicamente usato da molteplici applicazioni • … le informazioni possono crescere a dismisura • … il carico di lavoro può cambiare frequentemente • … collo di bottiglia rischia di impattarle tutte 10/10/2018 5 Database
  • 7. Best Practice di cosa? • Database Engine • SQL Server Agent • Integration Services • Analysis Services • Reporting Services • Master Data Services • Data Quality Services • Data Mining • Edizioni Specifiche • PDW/APS • Edizioni PaaS • SQL Database • SQL DB Managed Inst. • RDS for SQL Server • SQL Data Warehouse 10/10/2018 7
  • 8. • Amministrazione • Prestazioni (dimensionamento, configurazione) • Disponibilità (HA/DR, backup) • Sicurezza (controllo accessi, permessi, crittografia) • Sviluppo • Prestazioni (schema, query, indici) • Manutenzione futura • Sicurezza (SQL Injection, crittografia) • Sono tantissime… • … alcune ormai classificate come «miti» • … complessità scenari/RDBMS non aiutano 10/10/2018 8 Quali Best Practice?
  • 9. • Tormentone nella community SQL Server! • RDBMS è un software estremamente complesso! • Serve conoscenza generica e specifica • architettura • modello relazionale e modellazione basi di dati • linguaggi di interrogazione • Best Practice vanno sempre contestualizzate • spesso sono eccessive… • … ma questo non significa che vadano ignorate! • … a complicare le cose ci sono le diverse edizioni • … e i diversi ambienti (on-premise, IaaS, PaaS) • … e le diverse tipologie di carico di lavoro (OLTP/OLAP) 10/10/2018 9 It Depends!
  • 11. • Move Forward! ☺ • Almeno a SQL Server 2016 SP1! • Diagnostica drasticamente migliorata • Molti limiti rimossi • Molte funzionalità EE disponibili in edizioni inferiori • … ormai meglio direttamente a SQL Server 2017 10/10/2018 11 Tuttavia qualcosa di generico c’è…
  • 12. 10/10/2018 12 Supporto Versioni Versione SQL Server Supporto “Mainstream” Supporto “Extended” Supporto SP SQL Server 2000 SP4 08/04/2008 09/04/2013 SQL Server 2005 SP4 12/04/2011 12/04/2016 SQL Server 2008 SP4 08/07/2014 09/07/2019 SQL Server 2008R2 SP3 08/07/2014 09/07/2019 SQL Server 2012 SP3 09/10/2018 SQL Server 2012 SP4 11/07/2017 12/07/2022 SQL Server 2014 SP2 09/07/2019 09/07/2024 SQL Server 2016 SP1 09/07/2019 SQL Server 2016 SP2 13/07/2021 14/07/2026 SQL Server 2017 11/10/2022 12/10/2027 SP non previsti[1] [1] https://blogs.msdn.microsoft.com/sqlreleaseservices/announcing-the-modern-servicing-model-for-sql-server
  • 13. Amministrazione Best practices on SQL Server 10/10/2018 13
  • 14. • Iniziale • Stima/analisi uso risorse sulla base del carico di lavoro • Molto difficile per sistemi nuovi/custom • Continuo («on-going») • Monitoring proattivo continuo • Approvvigionamento nuove risorse (fisiche e/o virtuali) • Cambio di configurazione • Configurazione nuove funzionalità 10/10/2018 14 Dimensionamento
  • 15. • Solitamente non abbiamo dati sufficienti • Storicamente realizzato simulando il sistema: «Benchmark sizing», generalmente molto costoso • Confronto con benchmark di riferimento • TPC-C, TPC-H, SAP-SD ecc. • Tipicamente sono poco confrontabili • Raccolta delle metriche di sistemi simili • Non sempre possibile Dimensionamento iniziale 10/10/2018 15
  • 16. • Caratteristiche carico di lavoro diverse • Transazionali (OLTP) • Molte attività lettura/scrittura che coinvolgono pochi dati • Decisionali, reporting, Business Intelligence (OLAP) • Più attività di lettura che coinvolgono grossi volumi di dati • Nel modo reale spesso sistemi misti • Es. Reporting o BI integrati nel gestionale oppure… • Query non performanti o mancanza di indici Tipologie di sistemi 10/10/2018 16
  • 17. • Gestisce risorse • Come un Sistema Operativo • Memoria, schedulazione task • Primitive sincronizzazione ecc. • Necessaria buona conoscenza • Per capire bene parametri di configurazione • Per capire quando e come cambiare i «default» • http://blogs.msdn.com/b/sqlosteam/archive/2010/06/23 /sqlos-resources.aspx SQLOS 10/10/2018 17
  • 18. • Uso Intensivo • Molte connessioni in parallelo • Query computazionalmente onerose • Risoluzione singole query con forza bruta • Compressione (non particolarmente alto) • Tecnologie «In-Memory» • In generale • Lasciare i parametri di configurazione di default • Tuning configurazione per scenari specifici • «Max Degree of Parallelism» • «Cost Threshold for Parallelism • «Max Worker Thread» 10/10/2018 18 Processori
  • 19. • Affinità processori • Schedulazione «thread» • I/O affinity • Parametro «Fiber mode» • Parametro «Boost priority» • In generale, non toccare! Configurazione CPU 10/10/2018 19
  • 20. • Gruppo condiviso di «lavoratori» che eseguono Query • Modello concorrenza cooperativo vs. competitivo in Windows • Default in base a numero core/architettura CPU (32/64bit) • http://msdn.microsoft.com/en-us/library/ms190219.aspx • Consumano memoria «MemToLeave» • Non controllabile* • x86: 512KB per worker thread • X64: 2MB per worker thread (4MB per IA64) Opzione «Max Worker Thread» 10/10/2018 20
  • 21. • Inter-query • Query distinte in esecuzione parallela • Intra-query • Parallelizzazione attività di una singola query • Costoso in termini di inizializzazione/uso risorse Parallelismo 10/10/2018 21
  • 22. • Massimo grado parallelismo Intra-query • Alcune regole generiche • Abbassare per sistemi OLTP (in teoria fino a 1) • Da 1 a numero core se core totali/per nodo NUMA <= 8 • Fisso a 8 se core totali/per nodo NUMA > 8 • Alcune operazioni possono beneficiare > 8 • es. reindex ma dipende anche dal «Recovery Model» • Controllo più granulare con «Resource Governor» • «Fine-tuning» per singole query Configurazione «Max degree of parallelism» 10/10/2018 22
  • 23. • Costo minimo stimato per considerare parallelismo • Espresso in secondi ma… • …stimato per esecuzione su sistema modello • Regola generica • Alzare per sistemi OLTP o misti • Indicativamente partire da 20 e tenere sotto controllo Parametro «Cost threshold for parallelism» 10/10/2018 23
  • 24. • Tendenza a consolidare più database/istanze • Sia per tendenza a virtualizzare in generale • Che per aumento costi licenze Enterprise per core! • Valutare di sfruttare al meglio i core • Non lasciarli al 30-50% di utilizzo ma… • Attenzione ai picchi di utilizzo! • Attenzione a teoria delle code! • aumento tempi di risposta esponenziale • Enterprise Edition • svariate tecnologie per sfruttare al meglio risorse Considerazioni uso delle CPU 10/10/2018 24
  • 25. • Uso intensivo • Miriadi di cache (principali Buffer Pool/Procedure Cache) • «In-Memory OLTP» (storage tabelle «Memory-Mased») • «In-Memory OLAP» (indici ColumnStore) • In generale • Quanta più possibile 😎 • Soprattutto con tecnologie «In-Memory» • Supporto edizione Standard (128GB/32GB/32GB) • Best Practice: impostazione manuale • Parametro «Min Server Memory» solitamente no • Parametro «Max Server Memory» quasi sempre si… 10/10/2018 25 Memoria
  • 26. • MemToLeave (VAS Reservation) • Thread stack • Allocazioni >8KB fino a SQL 2008 R2 • Es. extended & COM procedures, linked servers, OLEDB providers, SQLCLR • Buffer Pool • Organizzata in pagine da 8KB • Principalmente Buffer e Procedure Cache (ma anche altre) • Obiettivo primario Buffer Cache: ridurre I/O fisico • In-Memory OLTP Storage SQL Server Memory 101 10/10/2018 26
  • 27. • Quanta più possibile, ma… dipende Dimensionamento Buffer Cache Dimensione buffer cache HitRatio 0% 100% Database con un set di dati “caldi” Database teorico con accessi casuali all’intero set di dati 10/10/2018 27
  • 28. • Gestione dinamica • Reagisce a pressione esterna (applicazioni o Windows) • Problemi velocità deallocazione (Windows non aspetta…) • Convivenza con altre applicazione non banale • Anche con altri componenti del prodotto: SSIS, AS, RS • Best Practice: impostazione manuale • Parametro «Min Server Memory» solitamente no • Parametro «Max Server Memory» quasi sempre si Configurazione Memoria 10/10/2018 28
  • 29. • SQL Server < 2012 • Controllava praticamente solo il Buffer Pool • Tecnicamente solo le allocazioni di singole pagine da 8K • SQL Server >= 2012 • Controlla tutta memoria (qualunque tipo di allocazione) • Eccezione: memoria per «stack» dei «thread» Parametro «Max Server Memory» 10/10/2018 29
  • 30. • Diverse indicazioni per partire • Circa il 10% in meno della memoria disponibile • Formule più precise che tengono conto OS/applicazioni • Numeri preconfezionati • Importante tenere sotto controllo! • Perfmon • SQL Server: Buffer ManagerPage Life Expectancy • SQL Server: Buffer ManagerPage reads/sec • Physical DiskDisk Reads/sec • DMV • sys.dm_os_ring_buffers • ring_buffer_type = 'RING_BUFFER_RESOURCE_MONITOR' Configurazione «Max Server Memory» 10/10/2018 30
  • 31. • Previene paginazione memoria Buffer Cache • Messaggi di errore in ERRORLOG • Eventi «ringbuffer» delle risorse • Privilegio per utente associato al servizio SQL Server • Policy locale "Lock pages in memory” • Può essere sintomo di contesa con altre applicazioni • memoria insufficiente • configurazione «Max Server Memory» inadatta Configurazione «Lock Pages in Memory» 10/10/2018 31
  • 32. • Aggiungere memoria: modo semplice per aumentare le prestazioni (specialmente per sistemi OLTP) • Può essere problematico • Costoso • Massima capacità (numero slot/dimensione DIMM) • Aggiungere storage spesso meno problematico • Estensione del «Buffer Pool» su dischi SSD Buffer Pool Extension 10/10/2018 32
  • 33. • Memoria sotto pressione • «Clean pages» • possono essere liberate • o scritte nelle estensioni BP • «Dirty pages» • devono essere scritte nei file dati • possono essere scritte nelle estensioni BP • Simile «Storage Tiering» ma controllato da SQL Server Buffer Pool Extension: come funziona 10/10/2018 33
  • 34. • DBA: «Devo rilasciare un nuovo database» • SAN Admin: «di quanto spazio hai bisogno?» • Problema: intendersi sul termine «capacità» • Capacità in termini di spazio (Capacity GB/TB) • Capacità di trasmissione (Throughput MB/sec o IOPS) • Tempi di latenza (Latency ms) Capacità Storage 10/10/2018 34
  • 35. • Scenario classico: SAN monolitica • CxO: «La SAN va benissimo! L’abbiamo pagata un occhio della testa e ci girano 200 workstation e una dozzina di altri server senza problemi!» • Problema: molto spesso sovraccarica • Spinto da venditori come sistemi a risorse infinite • Tipicamente collo di bottiglia banda o HBA • SQL Server con tanti core ma dati non arrivano velocemente Risorse infinite? 10/10/2018 35
  • 36. • Parti comuni • SQL Server, Windows OS, Drivers, CPU, PCI-Bus • Storage DAS • Controller, Cache, Shelf, Dischi • Storage SAN • HBA, Switch, FC Ports, Storage Processor, Backplane, Dischi • Qualche livello in più con ambienti virtuali • Nel Cloud sparisce tutto… meglio o peggio? Colli di bottiglia Storage 10/10/2018 36
  • 37. Esempio massimo «throughput» Plateau disco Aggiunta disco Plateau numero dischi per controller Aggiunta controller e disco Plateau numero controller per bus/backplane 10/10/2018 37
  • 38. • Ideale: separare su più volumi dati, log e tempdb • Sfruttare al massimo gli accessi in parallelo • Ottimizzare diversi pattern di accesso • Granularità: tabelle/indici partizionati • Ma… deve esserci effettivamente il «ferro» dietro ☺ • Tipo di volumi? • Mediazione tra prestazioni e protezione (RAID) • Formattazione con «Allocation unit size» da 64KB • In genere una partizione per LUN • Impatto CHKDSK con volumi di grosse dimensioni Posizionamento file database 10/10/2018 38
  • 39. • Diverse tipologie: lettura/scrittura • Diverse modalità di accesso: sequenziale/random • Di diverse dimensioni in base all’operazione • Esempi • Seeks: Random Read 8KB • Scans: Sequential Read 8KB-512KB (Read-Ahead 1-8MB) • Log writes: Sequential Writes up to 60KB • Checkpoint/Lazy Writer: Random Writes 8KB-256KB Pattern di accesso 10/10/2018 39
  • 40. • OLAP • Scan: letture sequenziali 64KB-512KB • Caricamenti (bulk load): scritture sequenziali 128KB-256KB • Ottimizzare «throughput» aggregato (massimizzare MB/sec) • OLTP • Molte operazioni lettura/scrittura random da 8KB • Possibile una certa quantità di «read-ahead» • Scritture in blocco nei file dati da cache • Scritture su transaction log stabili • Ottimizzare massimizzando IOPS tenendo bassa la latenza Regole empiriche 10/10/2018 40
  • 41. • Transaction Log • 1-2 millisecondi • ideale: <= 1 millisecondo • Dati (sistemi OLTP) • 5-20 millisecondi • Ideale: <= 10 millisecondi • Dati (sistemi DSS/OLAP) • <= 25-30 millisecondi • Di riferimento! Occorre comprendere i tipi di I/O di SQL Valori di riferimento per latenza 10/10/2018 41
  • 42. • «Disk Alignment» a 1024K (o multiplo 64K) • Default a partire da Windows Vista/Server 2008 • Default versioni precedenti: disallineato • Aumento prestazioni fino al 30% • Ormai non se ne vedono più ☺ Best Practice partizioni 10/10/2018 42
  • 43. • Da cosa è usato • Oggetti utente (tabelle temporanee, variabili tabella,…) • Oggetti interni (row versioning, worktables, sort,…) • Best Practice • Volume dedicato • Se non si comprendono a fondo le caratteristiche degli accessi I/O può essere meglio utilizzare un volume condiviso con molte meccaniche • Buon candidato SSD locale in molti scenari • Trace Flag 1117 e 1118 (SQL Server < 2016) • Numero di file Database di sistema tempdb 10/10/2018 43
  • 44. • Numero di file tempdb? • «Numero di CPU»? • «½ numero di CPU»? • «½ numero di core senza contare HT»? • «8» • «Nessuno lo sa veramente…»? • Dipende! • Radice del problema: contesa pagine di allocazione Tempdb: classico esempio di «mito» 10/10/2018 44
  • 45. • Sessione SQL PASS «inside tempdb» • https://www.youtube.com/watch?v=SvseGMobe2w • Durata 02:42:43! ☺ • Approccio come Setup SQL 2016 • Numero di core o 8 • Si può aumentare Numero di file tempdb 10/10/2018 45
  • 46. • Impedisce uso di «Mixed Extents» • Riduce contesa pagine allocazione SGAM • Per tutti i database, problema solitamente con tempdb • https://support.microsoft.com/en-us/kb/2154845 • http://www.sqlskills.com/blogs/paul/misconceptions- around-tf-1118 • Non più necessario a partire da 2016 • Sempre attivi per tempdb • Estensione ALTER DATABASE per altri database Best Practice: Trace Flag 1118 10/10/2018 46
  • 47. • In generale l’allocazione va gestita proattivamente! • «Autogrow» come «paracadute» • «Autoshrink» solo scenari «mobile» o non presidiati 10/10/2018 47 Allocazione spazio
  • 48. • In genere, meglio pre-allocare lo spazio • Attesa delle transazioni durante crescita automatica • Può introdurre frammentazione a livello di File System • Crescita automatica non bilanciata tra file stesso filegroup • Buona norma per tutti i database • Considerare crescita automatica come «paracadute» «Autogrow» e allocazione spazio 10/10/2018 48
  • 49. • Forza crescita di tutti i file di un filegroup • Non serve per evitare la pre-allocazione ☺ • Pensata principalmente per tempdb • https://support.microsoft.com/en-us/kb/2154845 • Non più necessario a partire da 2016 • Sempre attivi per tempdb • Estensione ALTER DATABASE per altri database Best Practice: Trace Flag 1117 10/10/2018 49
  • 50. • File non viene inizializzato con zeri • Creazione, allocazione e restore se non esiste • Valutare rischi di sicurezza (più teorici che altro…) • Solo file dati, no log! • Privilegio per utente associato al servizio SQL Server • SE_MANAGE_VOLUME_NAME • Policy locale “Perform Volume Maintenance Tasks” • Integrato nel Setup da SQL 2016+ • Non serve per evitare pre-allocazione! ☺ Configurazione «Instant File Initialization» 10/10/2018 50
  • 51. • In genere, «shrink» operazione straordinaria • Crescita imprevista es. dovuta a query fuori controllo • «Autoshrink» pensata per scenari non presidiati • Es. mobile, workstation utenti • Principalmente per edizione Express • Introduce frammentazione • Se log deve ricrescere, deve essere inizializzato • Non può usare «Instant File Initialization» • Transazioni devono attendere! «Autoshrink» e allocazione spazio 10/10/2018 51
  • 52. • Metodologia architetturale • Per rilasciare sistemi configurati in maniera ottimale • Legata a carichi di lavoro «Data Warehouse» • Configurazione Hardware verificata con «vendor/partner» • Personalizzabile • Non adatta per carichi di lavoro generici • Analogo OLTP non esiste Fast Track DW 10/10/2018 52
  • 53. • «Non posso disabilitarlo?» • «Fortunatamente no!» ☺ • A partire da SQL Server 2014 • In-Memory OLTP (tabelle persistenti solo in memoria) • Delayed Durability / Lazy Commit (commit asincrono) Transaction Log 10/10/2018 53
  • 54. • Transazione può essere • «Fully Durable» • protocollo WAL tradizionale, commit sincrono • «Delayed Durable» • AKA «lazy commit» o commit asincrono • «Eventual Durability» ☺ • Record Transaction Log mantenuti nel buffer • Buffer scritto quando pieno o evento di «Flush» • Possibile perdita della transazione! • in modo consistente • Applicazione deve tollerare la perdita di dati! 54 «Delayed Durability» 10/10/2018
  • 55. • Buffer Transaction Log pieno • Commit transazione «fully durable» • stesso database • Esecuzione manuale procedura sp_flush_log • Attenzione! Shutdown SQL Server • potrebbe non scrivere il buffer • va trattato come un possibile evento di perdita dati 55 «Delayed Durability Flush» 10/10/2018
  • 56. • Livello Database • Livello «Atomic block» («Native Compilation») • Livello «Commit» 56 Controllo «Delayed Durability» ALTER DATABASE … SET DELAYED_DURABILITY = { DISABLED | ALLOWED | FORCED } CREATE PROCEDURE <procedureName> … WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER AS BEGIN ATOMIC WITH ( DELAYED_DURABILITY = ON, TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'English' … ) END COMMIT [ { TRAN | TRANSACTION } ] [ transaction_name | @tran_name_variable ] ] [ WITH ( DELAYED_DURABILITY = { OFF | ON } ) ] 10/10/2018
  • 57. • A livello di riga • In realtà nuovo formato più compatto • Tipi dato storicamente a lunghezza fissa ora variabile • Spazio occupato solo per rappresentare i valori • Potenzialmente utile anche per sistemi OLTP • A livello di pagina • Compressione per prefisso (colonna) • Compressione a dizionario (intera pagina) • Principalmente utile per sistemi OLAP • Vantaggio • più pagine (compresse) nella «Buffer Cache» Compressione dati 10/10/2018 57
  • 58. • Se già è difficile il dimensionamento per un database… • Molte domandi da porsi • Server fisico o virtuale? • Server dedicato solo al database Engine? • Istanza singola o più istanze? • On-premise o Cloud? • Sharding? • In generale per il consolidamento • Database Tier 1 richiedono risorse dedicate • Database Tier 2 richiedono una buona progettazione • Database Tier 3 c’è più flessibilità… 10/10/2018 58 Consolidamento e scalabilità
  • 59. Pattern comuni di scalabilità 10/10/2018 59
  • 60. • Carico di lavoro disomogeneo • Clienti di dimensione diversa • Collocazione geografica e «Time Zone» • Stagionalità diverse • Spesso «Over-provisioning» risorse • Per assorbimento picchi di utilizzo • Poco efficiente dal punto di vista dei costi Problema tipico SaaS 10/10/2018 60
  • 61. • Collezione di DTU (eDTUs) e «Storage» (GBs) condivisi • «Auto-Scale» • Database aggiunti/rimossi a caldo «Elastic Database Pools» Image source: https://docs.microsoft.com/en-us/azure/sql-database/sql-database-what-is-a-dtu 10/10/2018 61
  • 62. • Molteplici database condivisi da più «tenant»? • Tecnica «Scale out» distribuzione dati • Strutturati in maniera identica • In più database indipendenti • In base a «Sharding Key» • Mappature per intervallo di valori o lista 62 «Sharding» 10/10/2018
  • 63. • «Shard Map Management» • Mappatura «Shard Keys» e database • «Shard Keys» liste o intervalli di valori • «Data Dependent Routing» • Supporto apertura connessione in base a «Shard Key» • «Multi-Shard Queries» • Supporto Query che coinvolge più «Shard» • Fusione unico «Result Set» con Semantica UNION ALL 63 «Elastic Database client library» Image source: https://docs.microsoft.com/en-us/azure/sql-database/sql-database-elastic-scale-shard-map-management 10/10/2018
  • 64. • «Split Range» distribuisce una «Shard» su due «Shard» • «Merge Range» accorpa due «Shard» in una «Shard» • «Move Shardlet» 64 «Elastic Database split-merge tool» Image source: https://azure.microsoft.com/en-us/documentation/articles/sql-database-elastic-scale-overview-split-and-merge 10/10/2018
  • 65. • Esecuzione Script T-SQL o applicazione DACPAC • Collezione database personalizzata • Tutti i database di «Elastic Database Pool» • «Shard Set» • Ritenta in caso di fallimento • Schedulazione 65 «Elastic Database Jobs» 10/10/2018
  • 66. • Attività amministrative • es. «deploy» nuovo schema • Ricostruzione degli indici • Aggiornamento di dati in comune a più database • Raccolta dati di telemetria in tabella comune 66 Scenari «Elastic Database Jobs» 10/10/2018
  • 67. • Supporto T-SQL per query distribuite • CREATE EXTERNAL DATA SOURCE • CREATE EXTERNAL TABLE • Partizionamento verticale «cross-database queries» • TYPE = RDBMS • Partizionamento orizzontale «Sharding» • TYPE = SHARD_MAP_MANAGER 67 «Elastic Database Queries» Image source: https://docs.microsoft.com/en-us/azure/sql-database/sql-database-elastic-query-overview 10/10/2018
  • 68. • Best Practice Analyzer (PBA) • Verifica conformità installazione • Fornisce link a spiegazione • Solo vecchie versioni 2008R2/2012  • Funzionalità Policy Based Management • Informalmente sostituisce BPA • https://blogs.msdn.microsoft.com/poojakamath/2018/05/ 03/where-is-my-sql-bpabest-practice-analyzer-for-sql- 201420162017 • Stored procedure sp_Blitz • https://github.com/BrentOzarULTD/SQL-Server-First- Responder-Kit • altre procedure utili per monitoring/troubleshooting Automazione controllo Best Practice 10/10/2018 68
  • 69. • Infrastruttura per • Definizione «policy» • Controllo conformità installazione con «policy» • Serie di «policy» conformi a Best Practice • Categoria di policy per sicurezza! • Enterprise Policy Management Framework • http://aka.ms/epmframework «Policy Based Management» 10/10/2018 69
  • 70. • Classificazione carico di lavoro • In «Workload Group» • Tramite funzione T-SQL di classificazione • Limiti utilizzo • Massimo grado parallelismo • Percentuale massima memoria del pool per singola query • Numero massimo richieste concorrenti • Definizione gruppi di risorse («Pool») • Limiti di utilizzo per memoria, CPU, IOPS (da 2014) • Controllo uso risorse • Assegnazione «Pool» a «Workload Group» • Alcuni Limiti globali Resource Governor 10/10/2018 70
  • 71. • Non sottovalutare manutenzione ordinaria! • Soluzione supportata dalla Community • Backup • Controllo integrità • Manutenzione Indici e Statistiche • https://ola.hallengren.com • Altro? • SQL Server Agent Alerts • Directory Log di SQL Server 10/10/2018 71 Manutenzione
  • 72. • Directory Log di SQL Server • ERRORLOG* • SQLAGENT* • FDLAUNCHERRORLOG* • SQLFT* • Stack Dump in caso di crash! Sono importanti! • ERRORLOG in particolare • Limitare le dimensioni! • Stored procedure sp_cycle_errorlog • Numero di file per rotazione da SSMS 10/10/2018 72 Controllo dei log
  • 73. • Avete dato un’occhiata ai report SSMS ultimamente? • Availability Group Latency • Performance Dashboard • Glenn Berry Diagnostic Information Queries • https://www.sqlskills.com/blogs/glenn/category/dmv- queries • Ma soprattutto…. sp_whoisactive! • Wait Stats, blocking, piani esecuzione ecc. ecc. • Installare su tutte le istanze! ☺ • 28 articoli didattici • http://whoisactive.com 10/10/2018 73 Monitoring & Troubleshooting
  • 74. «Security Layering» 74 Data Encryption Data Access Access Control Proactive monitoring • Transport Layer Security (in transit) • Transparent Data Encryption (at rest) • Cell-Level Encryption (at rest) • Always Encrypted (at rest and in transit) Data Encryption • Dynamic Data Masking • Row-Level Security Data Access • Encrypted Authentication • SQL Firewall* Access Control • Auditing • Threat Detection* Proactive monitoring 10/10/2018
  • 75. Sviluppo Best practices on SQL Server 10/10/2018 75
  • 76. • Discorso veramente troppo lungo • Complesso a livello concettuale/logico • Pieno di dettagli implementativi a livello fisico • In generale: non perdere di vista le basi • Modello relazionale (e limiti di SQL) • Normalizzazione 10/10/2018 76 Schema
  • 77. • Tipi dato complessi • XML, GEOMETRY, GEOGRAPHY, HIERARCHYID, FILESTREAM, FILETABLE, JSON • «Type System» estensibile con integrazione CLR • Integrazione SQL (XPATH/XQUERY, funzioni JSON) • Sparse Column • In-Memory OLTP/OLAP • Graph Processing • Temporal Tables 10/10/2018 77 Tecnologie da valutare
  • 78. • Nome in codice «Hekaton» • Ancora usato nella documentazione • Esigenza: sfruttare al meglio RAM/CPU • Costo della RAM in costante decrescita • Frequenza CPU non cresce più esponenzialmente • Anche se numero di core continua a crescere • Serviva tecnologia che eseguisse stesse operazioni in meno cicli «In-Memory OLTP» 10/10/2018 78
  • 79. • Tabelle «Memory-Optimized» • Moduli T-SQL compilati • Strutture dati lock e latch free • Completamente integrate • Superficie programmabilità • V1 in 2014 limitata • V2 in 2016 molti limiti rimossi • V3 in 2017 ancora meno limiti Componenti principali «In-Memory OLTP» 10/10/2018 79
  • 80. • Struttura • Completamente in memoria • Indici di tipo hash e range (BW-tree) • Compilazione schema e metodi accesso • Persistenza (durability) • Solo Schema o Schema e dati • Storage • Data file e delta file usano tecnologia FILESTREAM • Transaction-log 80 «Memory Optimized Tables» 10/10/2018
  • 81. • Compilazione codice nativo • «Stored Procedures» • «After Triggers» • «Inline TVFs» • «Scalar UDFs» • Massime prestazioni ma… • svariate limitazioni • rimosse in ogni nuova versione 81 Compiled SQL Modules 10/10/2018
  • 82. • Nuovo protocollo per transazioni MVCC • Conforme proprietà ACID • Molteplici versioni delle righe • Completamente lock-free (timestamp based) • Garbage Collector versioni non più utili • Metodi di accesso «latch/spinlock-free» • Operazioni CAS (Compare & Swap) • Logica di «Thread assist/abort» 82 Concorrenza «In-Memory OLTP» 10/10/2018
  • 83. • Protocollo ottimistico • Possibili conflitti tra scritture • Validazione prima della commit potrebbe fallire • Gestione e logica di «retry» necessaria Effetti collaterali MVCC 10/10/2018 83
  • 84. • Formato «Storage» cambiato • Molti miglioramenti • Supporto per aggiornamento e campionamento statistiche • ALTER TABLE eseguito in parallelo e scrittura solo metadati nel T-Log • Miglioramenti T-SQL • Es. UNIQUE, FK, CHECK, TRIGGERS (solo AFTER), LOB (colonne) • Esteso supporto moduli T-SQL compilati nativamente • Es. UNION, UNION ALL, DISTINCT, OUTER JOIN, «Subqueries», OUTPUT, LOB (variabili/parametri), «Inline- TVF» e «Inline-UDF» compilate • Supporto per piani di esecuzione paralleli • https://docs.microsoft.com/en-us/sql/database-engine/whats- new-in-sql-server-2016#InMemory «In-Memory OLTP» in SQL 2016 10/10/2018 84
  • 85. • Supporto colonne calcolate • Incluso indici su colonne calcolate • Supporto funzioni JSON • Sia moduli T-SQL compilati nativamente che vincoli CHECK • Esteso supporto moduli T-SQL compilati nativamente • CROSS APPLY, CASE, TOP (N) WITH TIES, sp_spaceused, sp_rename • Prestazioni • Fase REDO ripristino log delle transazioni effettuata in parallelo «In-Memory OLTP» in SQL 2017 10/10/2018 85
  • 86. • Particolarmente efficienti per DWH • Scansione/aggregazione grossi volumi • Organizzazione per colonne • Compressione a più livelli • Modalità di accesso «batch» • Introdotti in SQL Server 2012 • Estesi significativamente ad ogni nuova versione • Disponibili in tutte le edizioni a partire da • Forza bruta per query imprevedibili • Indice Columnstore non-clustered su tutte le colonne «In-Memory OLAP» («ColumStore indexes») 10/10/2018 86
  • 87. • Solo un indice «non-Clustered Columnstore» per tabella • Richiede sempre spazio extra (tabella rimane un B- Tree/Heap) • Tabella non può esser aggiornata direttamente • Molte limitazioni • Tipi dato • Schema • Interoperabilità con altre funzionalità Indici «Columnstore» in SQL Server 2012 10/10/2018 87
  • 88. • «Clustered Columnstore» • Meccanismo di «storage» primario • Aggiornabile • Nessun altro indice consentito su tabella • «Non-Clustered Columnstore» • Come in SQL Server 2012 • Opzione di compressione «Archival» • Più operatori in modalità «Batch» • Scan, Filter, Project, Join, Group By, Union All • Ancora solo query parallele Indici «Columnstore» in SQL Server 2014 10/10/2018 88
  • 89. • «Clustered Columnstore» • Uno o più indici «non-Clustered Rowstore» supportati • PK e FK possono essere supportati da indici «non-Clustered Rowstore» • «Non-Clustered Columnstore» • Supporto per un solo indici aggiornabile su tabelle «Rowstore» • Supporto per condizione di filtro (es. dati «caldi» di un carico di lavoro OLTP) • Tabelle «In-Memory» possono avere un indice «Columnstore» • «Compression Delay» • Evita frammentazione quando dati caldi cambiano frequentemente con carichi di lavoro OLTP • Ancora più operatori in modalità «Batch» • sort, aggregates with multiple distinct functions, window aggregate functions, window user-defined aggregates, window aggregate analytic functions • Supporto per query «Single-Threaded» (MAXDOP 1) Indici «Columnstore» in SQL Server 2016 10/10/2018 89
  • 90. • Supporto per livelli di isolamento transazionale RCSI e SI • Deframmentazione indici tramite riorganizzazione • Supporto per repliche secondarie AlwaysOn AG • «Pushdown» aggregazioni e predicati su stringhe (durante scansioni) • Disponibile in tutte le edizione di SQL Server 2016 Service Pack 1 Indici «Columnstore» in SQL Server 2016 10/10/2018 90
  • 91. • Supporto per colonne calcolate non persistenti • Supporto per LOB • Solo «Clustered Columnstore» • Già disponibile anche in Azure SQL Database (Premium) • Es. caso di studio utilizzo dati JSON • https://blogs.msdn.microsoft.com/sqlserverstorageengine/20 17/02/09/json-data-in-clustered-column-store-indexes • Supporto «online build/rebuild» indici «non-clustered Columnstore» • Riepilogo funzionalità per versione prodotto • https://docs.microsoft.com/en-us/sql/relational- databases/indexes/columnstore-indexes-what-s-new Indici «Columnstore» in SQL 2017 10/10/2018 91
  • 92. • Tabella «Node» • Rappresenta un entità • Tabella «Edge» • Rappresenta una relazione «many-to-many» • Può avere proprietà • Ha un orientamento (digrafo), connette due nodi • MATCH comando T-SQL • Condizione di ricerca per grafi • «Pattern matching» e attraversamento Concetti «Graph Processing» 10/10/2018 92
  • 94. • Tabelle temporanee locali/globali non supportate • Tipi/variabili tabella non supportate • Tabelle temporali «system-versioned» non supportate • Tabella «memory optimized» non supportate • Non si possono aggiornare direttamente (UPDATE) • due «Node» collegati tramite un «Edge», soluzione • inserire nuove «Edge» che punta a differenti «Node» • cancellare precedente «Edge» • Query «cross-database» con oggetti «Graph» non supportate Limiti «Graph Processing» 10/10/2018 94
  • 95. Modifiche Database Temporali «Temporal table» (dati correnti) Insert / Bulk Insert * Versioni vecchie Update */ Delete * «History table» 10/10/2018 95
  • 96. Interrogazioni Database Temporali «Temporal table» (dati correnti) Query temporali * FOR SYSTEM_TIME ALL, AS OF, BETWEEN … AND …, FROM … TO, CONTAINED IN «History table» Query normali (dati correnti) * Include versioni storiche 10/10/2018 96
  • 97. • Idealmente: serializzazione delle transazioni • massima consistenza • minor concorrenza • Se le transazioni non sono coordinate • perdita di aggiornamenti (lost updates) • Se transazioni sono parzialmente isolate • letture inconsistenti («dirty reads») • letture non ripetibili («non-repeatable reads») • letture fantasma («phantoms») • conflitto in aggiornamento («update conflict») 97 Isolamento delle transazioni 10/10/2018
  • 98. • Aggiornamento non sincronizzato 98 Perdita di aggiornamenti T2 T1 Tempo X=10 Legge X (10) Legge X (10) Calcola X=X+10 (20) Calcola X=X+15 (25) Scrive X X=20 X=25X=25 Scrive X 10/10/2018
  • 99. • T2 vede le modifiche non confermate di T1 99 Letture inconsistenti Calcola X=X+15 (25) T2 T1 Tempo X=10 Legge X (25) Legge X (10) X=25 Scrive X X=10 Rollback Utilizza il valore di X che non è mai stato confermato 10/10/2018
  • 100. • Lettura successiva inconsistente 100 Letture non ripetibili T2 T1 Tempo X=10 Legge X (10) Legge X (10) Calcola X=X+15 (25) X=25 Scrive X Commit Legge X (25) 10/10/2018
  • 101. • Lettura intervallo successiva inconsistente 101 Letture fantasma Part3, 50 Insert Select count (*) where cost > 30 (2) T2 T1 Tempo Part1,40 Part2, 70 Part3, 50 Part1,40 Part2, 70 Select count (*) where cost > 30 (3) 10/10/2018
  • 102. • 4 livelli supportati per standard ANSI • «Read Uncommitted», «Read Committed», «Repeatable Read», «Serializable» • Predefinito «Read Committed» in due modalità • pessimistico, usa protocollo di «Locking» • ottimistico, usa «Row Versioning» • Aggiunta di un ulteriore livello «Snapshot» • simile a «Serializable» ma ottimistico in scrittura • genera errore alla «Commit» in caso di conflitto 102 Livelli di isolamento in SQL Server 10/10/2018
  • 103. • Tipologie di lock • Condivisi (S) • Esclusivi (X) • Aggiornamento (U) • Intenzione (I) • Granularità • Riga/chiave • Intervallo tra chiavi • Pagina • Tabella • «Extent» • Database 103 Gestione dei «Lock» Tabella Pagina Pagina Pagina Riga Riga Riga 10/10/2018
  • 104. • Sottoinsieme della matrice di compatibilità 104 Compatibilità «Lock» Lock richiesto IS S U IX X SchS SchM BU IS Si Si Si Si No Si No No S Si Si Si No No Si No No U Si Si No No No Si No No IX Si No No Si No Si No No X No No No No No Si No No SchS Si Si Si Si Si Si No Si SchM No No No No No No No No BU No No No No No Si No Si Lock già rilasciato 10/10/2018
  • 105. 105 «Read Committed» (pessimistico) CREATE TABLE t1 ( c1 int unique, c2 int) INSERT INTO t1 VALUES (1, 5) Transazione 1 BEGIN TRAN UPDATE t1 SET c2 = 9 WHERE c1 = 1 COMMIT TRAN Tempo Transaction 2 (Read Committed) BEGIN TRAN SELECT c2 FROM t1 WHERE c1 = 1 -- SQL Server risponde 9 COMMIT TRAN Bloccato! 10/10/2018
  • 106. 106 «Read Committed Snapshot» (ottimistico) CREATE TABLE t1 ( c1 int unique, c2 int) INSERT INTO t1 VALUES (1, 5) Transazione 1 BEGIN TRAN UPDATE t1 SET c2 = 9 WHERE c1 = 1 COMMIT TRAN Tempo Transaction 2 (Read Committed Snapshot) BEGIN TRAN SELECT c2 FROM t1 WHERE c1 = 1 -- SQL Server risponde 5 SELECT c2 FROM t1 WHERE c1 = 1 -- SQL Server risponde 9 COMMIT TRAN 10/10/2018
  • 107. 107 «Snapshot» (in lettura) CREATE TABLE t1 (c1 int unique, c2 int) INSERT INTO t1 VALUES (1, 5) Transazione 2 (Snapshot Isolation) SET TRANSACTION ISOLATION LEVEL SNAPSHOT BEGIN TRAN SELECT c2 FROM t1 WHERE c1 = 1 -- SQL Server risponde 5 SELECT c2 FROM t1 WHERE c1 = 1 -- SQL Server risponde 5 COMMIT TRAN SELECT c2 FROM t1 WHERE c1 = 1 -- SQL Server risponde 9 Transazione 1 BEGIN TRAN UPDATE t1 SET c2 = 9 WHERE c1 = 1 COMMIT TRAN Tempo 10/10/2018
  • 108. 108 «Snapshot» (in aggiornamento) Tempo CREATE TABLE t1 ( c1 int unique, c2 int) INSERT INTO t1 VALUES (1,5) transazione 1 (Snapshot Isolation) SET TRANSACTION ISOLATION LEVEL SNAPSHOT BEGIN TRAN SELECT c2 FROM t1 WHERE c1 = 1 -- SQL Server risponde 5 UPDATE t1 SET c2 = 15 WHERE c1 = 1 Transazione 2 BEGIN TRAN UPDATE t1 SET c2 = 9 WHERE c1 = 1 COMMIT TRAN Bloccato! Rollback perché conflitto tra aggiornamenti 10/10/2018
  • 109. 109 Livelli, fenomeni, concorrenza Livelli di isolamento Dirty Read Non- Repeatable Read Phantoms Update Conflict Modello concorrenza Read Uncommitted Si Si Si No Read Committed 1 Locking 2 Snapshot No No Si Si Si Si No No Pessimistico Ottimistico Repeatable Read No No Si No Pessimistico Snapshot No No No Si Ottimistico Serializable No No No No Pessimistico Fenomeni permessi 10/10/2018
  • 110. • Mediazione • livello alto: più consistenza, meno prestazioni • livello basso: meno consistenza, più prestazioni • Modello pessimistico o ottimistico? • dipende… quasi sempre va bene ottimistico • è bene censire gli altri casi • Scelta in base alle necessità applicative! • non alle prestazioni! 110 Scelta livello di isolamento 10/10/2018
  • 111. • «Shared Lock» rilasciati durante «scan» • Righe possono muoversi fisicamente • Es. aggiornamento indice «Clustered» • Fenomeni problematici • Rilettura stessa riga • Mancata lettura di una riga 111 Altri problemi «Read Committed» 10/10/2018
  • 112. • Evento normale • tecniche per mitigarne la frequenza • non sempre si possono eliminare completamente • Risoluzione automatica • controllo cicli ad intervalli regolari • transazione meno costosa per annullamento viene scelta come vittima («rollback») • controllo più frequente quando si verificano «Deadlock» • Applicazioni • ricevono errore 1205 • devono gestire il problema, es. riprovando 112 «Deadlock» (blocco critico) 10/10/2018
  • 113. • Coinvolge più risorse • Processi si bloccano a vicenda in modo ciclico 113 «Cycle Deadlock» Resource Granted Lock Resource Granted Lock SPID 1 SPID 2 Waiting Lock Waiting Lock 10/10/2018
  • 114. • Coinvolge una risorsa • Entrambi i processi hanno un «Lock» sulla risorsa • tipicamente «Shared» • con livello di isolamento più alto di «Read Committed» • Entrambi cercano di convertire il «Lock» • con uno incompatibile 114 «Conversion Deadlock» Resource SPID 2SPID 1 Granted Lock Granted Lock Convert Convert 10/10/2018
  • 115. • Usare livello di isolamento appropriato • Verificare possibilità di usare livelli «Snapshot» • Controllare gli indici • Controllare normalizzazione della base dati • Le transazioni dovrebbero • durare poco • non richiedere interazione utenti (ormai tutto stateless) • accedere alle risorse nello stesso ordine 115 Minimizzare i «Deadlock» 10/10/2018
  • 116. • Fondamentale! • Per avere una baseline • Per capire dove spendono tempo le query • Analisi uso risorse • Numero di pagine lette (da disco e da cache) • Memoria utilizzata (se query massiva) • Analisi tempi di esecuzione • Tempo di generazione piano esecuzione (compile time) • Tempo di processamento effettivo (CPU time) • Tempo di attesa risorse (Wait Stats) 10/10/2018 116 Analisi delle Query
  • 117. • Fondamentale! • Per migliorare le prestazioni • Per determinare se si sono verificate regressioni • SQL Server Management Studio • Visualizzazione grafica/Live • Confronto tra piani • Strumenti Free di terze parti • SentryOne Plan Explorer • https://www.sentryone.com/plan-explorer • ApexSQL Plan • https://www.apexsql.com/sql_tools_plan.aspx 10/10/2018 117 Analisi dei piani di esecuzione
  • 118. • SQL Server Execution Plans, 3rd Edition • https://www.red-gate.com/products/dba/sql- monitor/entrypage/execution-plans 10/10/2018 118 Libri consigliati
  • 119. • Tempi di esecuzione query • «CPU time» e «Elapsed time» • SQL Server 2012 SP4, 2016 SP1, 2017, 2014 (TBD?) • Top 10 «Wait Stats» a livello di query • Attenzione all’accuratezza • https://www.brentozar.com/archive/2017/07/sql-2016- sp1-shows-wait-stats-execution-plans • https://blogs.msdn.microsoft.com/sql_server_team/makin g-parallelism-waits-actionable • SQL Server 2016 SP1, 2017 (compatibilità 140!) • «Trace Flags» attive • Include il livello: global, session o query • SQL Server 2012 SP4, 2016 SP1, 2017 Miglioramenti piani di esecuzione 10/10/2018 119
  • 120. • sys.dm_exec_query_statistics_xml(session) • Piano di esecuzione con statistiche transitorie «in-flight» (es. n° righe, CPU) • Funziona con profilazione • Standard (eseguire SET STATISTICS XML ON prima di eseguire la query) • «lightweight statistics» (attivare Trace Flag 7412) • Disponibile in SQL Server 2016 SP1, 2017 Profilazione esecuzione query 10/10/2018 120
  • 121. • Registra piani di esecuzione e metriche prestazioni • Per database • In memoria consolidando su disco in modalità asincrona • Integrato con SSMS e disponibile via DMV • Da SQL Server 2017: anche Wait Stats!! • Riduce drasticamente complessità «troubleshooting» • Identificare «Top Query» per tempo/memoria/CPU/IO • Analizzare utilizzo risorse per un determinato database • Audit storia piani di esecuzione di una determinata query • Identificare regressione piani di esecuzione • Forzatura piano specifico da storico QUERY STORE 10/10/2018 121
  • 122. QUERY STORE TOP CONSUMER 10/10/2018 122
  • 123. QUERY STORE TOP «REGRESSED QUERIES» 10/10/2018 123
  • 124. • «Wait Stats» integrate con Query Store! • Nuova DMV sys.query_store_wait_stats • Organizzate in categorie • ALTER DATABASE … SET QUERY_STORE (WAIT_STATS_CAPTURE_MODE = ON) Query Store in SQL Server 2017 10/10/2018 124
  • 125. 10/10/2018 125 Attenzione a contestualizzare sempre! • «Come fa la query a essere lenta in produzione?» • «Sul mio Portatile la Query è velocissima!»
  • 126. • Essenziale per generare piani esecuzione efficienti, predice • Numero righe risultati intermedi (es. join, filtri, aggregazioni) • Numero righe finale • Fino a SQL 2012 in gran parte basato su SQL 7.0 • Abilitazione Fix QFE con Trace Flag per evitare regressioni • Alcuni problemi necessitavano di un ridisegno rilevante • Introdotto in SQL Server 2014 può causare regressioni • Impatto su scenari specifici (es. data ordine, join) • Maggior parte delle query dovrebbe comunque beneficiarne Cardinality Estimator 10/10/2018 126
  • 127. • Nessuna opzione indipendente in SQL Server 2014  • Attivo con livello di compatibilità database a 120 • Trace Flag specifici per singole query (troubleshooting) • A partire da SQL Server 2016 • ALTER DATABASE SCOPED CONFIGURATION • LEGACY_CARDINALITY_ESTIMATION • ma anche QUERY_OPTIMIZER_HOTFIXES • A partire da SQL Server 2017 • USE HINT('QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n') • https://support.microsoft.com/en-us/help/4342424/update- to-query-optimizer-compatibility-level-n-in-use-hint-option • Impostare o non impostare… • Cambiamento con più potenzialità di regressioni da anni • …ma era ora ☺ fare quanti più test possibili Configurazione Cardinality Estimator 10/10/2018 127
  • 128. • Aggiornamento database a 2016 • Mantenendo «Database Compatibility Level» originale • Abilitare «Query Store» per il database • Tutti i piani vengono congelati al livello originale • Aspettare raccolta carico di lavoro rappresentativo • Cambiare il livello di compatibilità a 130+ • Valutare problemi specifici di regressione con SSMS • Forzare piani pre-aggiornamento registrati in «Query Store» • Usare HINT specifico da 2017 CU10+ per singole query REGRESSIONE PIANI ESECUZIONE IN 2016+ 10/10/2018 128
  • 129. «Adaptive Query Processing» in SQL 2017 10/10/2018 129
  • 130. • «Excessive Grant» • Troppa memoria allocata rispetto a quanto utilizzata • Impatto: «blocking», «out-of-memory», concorrenza ridotta • «Poor Grant» • Memoria allocata insufficiente con conseguente «spill» nel tempdb • Impatto: query lenta, eccessivo utilizzo del disco (tempdb) • «Grant increase» • Incremento memoria allocata dinamicamente troppo grande • Impatto: instabilità del server, performance non predicibili «Batch Memory Grant» 10/10/2018 130
  • 131. • Valutazione post-esecuzione • Aggiorna il valore di allocazione dei piani in cache • Es. più memoria se «Poor», meno se «Excessive» • Scenario sensibili a valori parametri • Alcune query piani con allocazione diversa • «memory grant feedback» si disabilita quando non stabile • memory_grant_feedback_loop_disabled extended event • Memorizzazione nella cache dei piani • Non persistente (non salvata nel Query Store) • OPTION(RECOMPILE) impedisce memorizzazione e «memory grant feedback» Batch Mode Memory Grant Feedback 10/10/2018 131
  • 132. • Scenari join • Algoritmo «nested loop» migliore con piccole tabelle candidate come «build» • Algoritmo «hash» migliore con grandi tabelle candidate come «build» • «Adaptive joins» rinvia la scelta dopo scansione primo input «Batch mode adaptive joins» 10/10/2018 132
  • 133. • Problema con «multi-statement table valued functions» (MSTVF) • SQL Server <= 2012 ottimizza con cardinalità fissa = 1 • SQL Server 2014 & 2016 ottimizza con cardinalità fissa = 100 • SQL Server >= 2017 • Ottimizzazione parte • Ottimizzazione viene in pausa per eseguire MSTVF (se candidata) • Ottimizzazione riprende con cardinalità corretta «Interleaved Execution» 10/10/2018 133
  • 134. • Altro argomento intrattabile in poco tempo • Vero ginepraio di dettagli implementativi  • Strettamente legato anche a implementazione schema • In generale • Mai dimenticarsi che è un linguaggio dichiarativo • si specifica il «cosa» al posto del «come»… • …lasciando spazio a continui miglioramenti del «come»! • Soluzioni «set based» al posto di «cursor based» • Oltre una certa complessità: «divide et impera»! 10/10/2018 134 Codice T-SQL
  • 135. • Interpretazione richieste complesse • equivalenze logiche, individuazione contraddizioni, … • Ottimizzazione piano di esecuzione • algoritmi, parallelismo, utilizzo di indici, … • Riutilizzo dei piani di esecuzione • anche in modalità adattiva 135 Ottimizzatore delle Query 10/10/2018
  • 136. • “Any fool can write code that a computer can understand. Good programmers write code that humans can understand.” • Martin Fowler 10/10/2018 136 Fondamentale
  • 137. • Tutto sommato è abbastanza banale… • …ma solo a vederla scoraggia chi deve metterci mano! 10/10/2018 137 Esempio
  • 138. • Stessa query di prima • Riformattata • Con qualche alias 10/10/2018 138 Meglio. Molto meglio ☺
  • 139. • Red Gate SQL Prompt • Gold Standard ma €325/utente • https://www.red-gate.com/products/sql- development/sql-prompt/index • Apex SQL Refactor • Anche formattazione, gratuito • https://www.apexsql.com/sql_tools_complete.aspx • Poor Man’s T-SQL Formatter • Open Source (github) • http://architectshack.com/PoorMansTSqlFormatter.ashx 10/10/2018 139 Strumenti per la formattazione
  • 141. • Potenziali problemi applicativi con aggiunta colonne • Rowset più grande del dovuto • Può prevenire copertura query tramite indice • Può favorire table scan rispetto a lookup • In generale evitare di usarlo • Enumerare tutte le colonne non cambia nulla ☺ • Eccezione: «Sparse Column», EXISTS() 10/10/2018 141 SELECT *
  • 142. • https://sqlperformance.com • Specialmente articoli di Paul White • http://sqlblog.com • Moltissimi autori • T-SQL Fundamentals Third Edition • https://www.microsoftpressstore.com/store/t-sql- fundamentals-9781509302000 • T-SQL Querying • https://www.microsoftpressstore.com/store/t-sql- querying-9780735685048 10/10/2018 142 Approfondimenti