SlideShare a Scribd company logo
#sqlsatPordenone
#sqlsat367February 28, 2015
Back to the Roots: SQL Server
Indexing
Davide Mauri
@mauridb
dmauri@solidq.com
#sqlsatPordenone
#sqlsat367February 28, 2015
Sponsors
#sqlsatPordenone
#sqlsat367February 28, 2015
Organizers
#sqlsatPordenone
#sqlsat367February 28, 2015
Davide Mauri
 20 Years of experience on the SQL Server Platform
 Specialized in Data Solution Architecture, Database
Design, Performance Tuning, Business Intelligence
 Projects, Consulting, Mentoring & Training
 Regular Speaker @ SQL Server events
 Microsoft SQL Server MVP
 President of UGISS (Italian SQL Server UG)
 Mentor @ SolidQ
 Find me here:
 Blog: http://sqlblog.com/blogs/davide_mauri/default.aspx
 Twitter: @mauridb
#sqlsatPordenone
#sqlsat367February 28, 2015
Agenda
 Indici e chiavi
 Architettura dello storage
 Tipi di indici
 Utilizzo degli indici
 Gestione e manutenzione
 Query Tuning
#sqlsatPordenone
#sqlsat367February 28, 2015
Dopo il modello dei dati sono gli strumenti che
– utilizzati in modo corretto - permettono di
ottenere le performance più alte!
Perché una sessione sugli indici?
#sqlsatPordenone
#sqlsat367February 28, 2015
Indici e chiavi
 Primary key
 Insieme (minimo) delle colonne che permettono
l’identificazione univoca di una riga tra tutte le
altre
 Foreign Key
 Chiavi Primarie “migrate” in una tabella collegata
#sqlsatPordenone
#sqlsat367February 28, 2015
Indici e chiavi
 Index keys
 Insieme delle colonne che compongono l’indice
 ATTENZIONE!
 INDICI e CHIAVI (PK e FK) non hanno nulla in
comune!!!!!
 Semplicemente – per motivi di performance – le
chiavi (PK e FK) usano gli indici.
#sqlsatPordenone
#sqlsat367February 28, 2015
Architettura dello storage
 I dati presenti in tabelle (ed indici) sono
memorizzati in pagine
 grosse circa 8Kb
 L’unità di I/O più piccola per SQL Server è la
pagina
 Le pagine sono raggruppate in extent
 Extent = 8 pagine da 8 Kb
#sqlsatPordenone
#sqlsat367February 28, 2015
Tipi di indici
 «Row-Store»
 Clustered
 Non-Clustered
 Included Columns, Filtered Indexes
 «Column-Store»
 Clustered
 Non-Clustered
 «Beyond Relational»
 XML / Full Text / Spatial / UDT
#sqlsatPordenone
#sqlsat367February 28, 2015
Clustered Indexes
 Strutture ad albero rovesciato
 B+ Trees
Root
Non-LeafNon-Leaf Non-Leaf
Leaf
(Table Data)
Leaf
(Table Data)
Leaf
(Table Data)
Leaf
(Table Data)
Leaf
(Table Data)
#sqlsatPordenone
#sqlsat367February 28, 2015
Clustered Indexes
 Le pagine non-foglia permettono di capire in
quali pagine sottostanti sta il dato che si sta
cercando
 Le pagine foglia contengono i dati della tabella
 L’indice cluster ordina “fisicamente” i dati
 Un solo indice cluster per tabella
#sqlsatPordenone
#sqlsat367February 28, 2015
Clustered Indexes
 Di default è messo sulla PK
 Ma si può spostare!!!
 Può essere costruito su colonne non
univoche
 Una tabella senza indice cluster si chiama
“Heap”
#sqlsatPordenone
#sqlsat367February 28, 2015
Non-Clustered (Row-Store) Indexes
 Anche in questo caso B+ Trees
Root
Non-LeafNon-Leaf Non-Leaf
Leaf
(Index Data)
Leaf
(Index Data)
Leaf
(Index Data)
Leaf
(Index Data)
Leaf
(Index Data)
#sqlsatPordenone
#sqlsat367February 28, 2015
Non-Clustered (Row-Store) Indexes
 GRANDI DIFFERENZE con il cluster
 Le pagine foglia NON contengono tutti i dati…
 …ma solo i valori delle chiavi dell’indice
 E’ una struttura dati separata
 Quindi “pesa” e comporta un overhead
 Le pagine foglia contengono dei puntatori alle
pagine dati della tabella
 I puntatori sono diversi a seconda dell’esistenza o
meno di un indice cluster
#sqlsatPordenone
#sqlsat367February 28, 2015
Non-Clustered (Row-Store) Indexes
 I puntatori possono essere
 Row Ids (se Heap)
 Clustering Keys (se esiste indice cluster)
 Ergo:
 Gli indici non-cluster sono costruiti sull’indice
cluster
 Nelle loro pagine foglia portano con se la
clustering key
#sqlsatPordenone
#sqlsat367February 28, 2015
Non-Clustered (Row-Store) Indexes
 Se indice cluster non univoco?
 Univocità mantenuta in automatico da SQL…
 …costa 4 byte per riga!
 ATTENZIONE! Più è grande la chiave di
cluster….
 …più spazio occupato nell’indice non cluster!
#sqlsatPordenone
#sqlsat367February 28, 2015
Non-Clustered (Row-Store) Indexes
 Included Columns
 Colonne i cui valori non sono indicizzati MA sono
inclusi nelle pagine foglia dell’indice
 Permettono di migliorare le prestazioni di
ricerca e restituzione dati
 «Indici di copertura»
 Maggior spazio occupato
 Maggior «fatica» nelle fasi di modifica
#sqlsatPordenone
#sqlsat367February 28, 2015
Utilizzo: Indice Cluster
 Ordinamenti
 Group by
 Range Search
 Insert
 Se e solo se l’indice è costruito su valori sempre
crescenti
 Assicura che le pagine dei dati siano i memoria
 E se non avete *troppe* insert (>15000Batch/sec)
#sqlsatPordenone
#sqlsat367February 28, 2015
Utilizzo: Non Cluster (Row-Store)
 Solo se altissima selettività
 Selettività = righe interessate / righe totali
 Overhead dato dall’operazione di “Bookmark
lookup”
 Nell’execution-plan in SQL 2005 non è visibile
come operatore ad-hoc ma come join tra cluster
(o heap) e non-cluster
#sqlsatPordenone
#sqlsat367February 28, 2015
Utilizzo: Di Copertura
 Indici di copertura (Covering Index)
 Non-Cluster
 “Misto” (Non-Cluster + Cluster)
 Indici che, da solo, è in grado di soddisfare una
query
 “Copre” tutti i campi della query
 Prima chiave dell’indice = prima colonna nella
clausola where
 Migliora di MOLTO le prestazioni in lettura!
#sqlsatPordenone
#sqlsat367February 28, 2015
Utilizzo: Di Copertura
 Tramite le “Included Colums” è possible creare
indici di copertura più efficienti
 Non metto tutte le colonne della query come chiavi
 Metto solo quelle usate per ricerca i valori (WHERE,
GROUP BY)
 Le colonne usate in SELECT … FROM le “includo”
 Impatta solo sulle dimensioni delle pagine foglia
#sqlsatPordenone
#sqlsat367February 28, 2015
Column-Store Indexes
 In-memory column-store index
 La riga di dati viene decomposta nelle singole
colonne
 Dati memorizzati in segmenti e dizionari
Source: http://dl.acm.org/citation.cfm?id=1989448
#sqlsatPordenone
#sqlsat367February 28, 2015
Column-Store Indexes
 Permettono l’utilizzo di un nuovo modello di
esecuzione «batch mode execution»
 Vector-Based Execution
 Vettore di circa 1000 righe
 Non è importante l’ordine delle colonne
 E’ una buona idea mettere TUTTE le colonne
nell’indice
 Grossa differenza con i «row-store» indexes
#sqlsatPordenone
#sqlsat367February 28, 2015
Clustered Column-Store Index
 Se usato è l’unico indice che può esistere
sulla tabella
 Tutte le colonne della tabelle sono
automaticamente incluse
 Supporta uno speciale livello di compression
chiamato “Archivial”
 Utilizza un ulteriore tipo di file «Delta Store»
per gestire le modifiche ai dati
#sqlsatPordenone
#sqlsat367February 28, 2015
Non-Clustered Column-Store Index
 Rende la tabella read-only
 Aggiornabile solo tramite partition switching
 Uno solo per tabella
#sqlsatPordenone
#sqlsat367February 28, 2015
Utilizzo: Column-Store Indexes
 Tipicamente in un Data Warehouse / Data
Mart
 Oppure soluzione DSS (Decision Support
System)
 Ideale con uno Star Schema
 Ideale per query con group by
#sqlsatPordenone
#sqlsat367February 28, 2015
Demo
 Index in Action!
#sqlsatPordenone
#sqlsat367February 28, 2015
Performance Considerations
 Obbiettivo: abbassare il più possibile le
operazioni di I/O
 In lettura
 In scrittura
 Tanti indici
 (potenzialmente) più velocità in lettura
 (sicuramente) meno velocità in scrittura
#sqlsatPordenone
#sqlsat367February 28, 2015
Performance Considerations
 Regola Aurea per OLTP
 POCHI MA BUONI
 Regola Aurea per OLAP
 Tanti quanti ve ne servono, tanto il caricamento è
one-shot
 A meno che non dobbiate fare Real-Time BI
 Allora: Ottimo Hardware e, se possibile, Column Store
#sqlsatPordenone
#sqlsat367February 28, 2015
Query Tuning
 Possibilità di VEDERE se per UNA query
mancano degli indici
 XML SHOWPLAN
 MissingIndexesStatistics
 DMVs:
 sys.dm_db_missing_index_*
 Altre DMVs & DMFs molto Utili
 sys.indexes & sys.indexes_columns
 sys.dm_db_index_usage_stats
 sys.dm_db_index_physical_stats()
#sqlsatPordenone
#sqlsat367February 28, 2015
Query Tuning
 Serve TEMPO e PAZIENZA
 Analisi I/O, TIME, Execution Plans, Cardinality
Estimation
 Oltre che un ambiente di TEST il più possibile
uguale a quello di produzione
 Le performance dell’I/O sono determinanti
#sqlsatPordenone
#sqlsat367February 28, 2015
Query Tuning
 Occhio alle stored procedure
 Se i dati sono molto disomogenei come
distribuzione valutare l’uso di WITH RECOMPILE
 In alcuni casi (UPDATE/DELETE) gli indici
aiutano a diminuire le dimensione dei lock!
#sqlsatPordenone
#sqlsat367February 28, 2015
Di cosa non abbiamo parlato
 XTP HASH & BW-TREE (RANGE) INDEX
 Indexes DMVS
 Usage
 Physical & Operational Info
 Missing Indexes
 http://sys2dmvs.codeplex.com/
 https://sqlserverperformance.wordpress.com/
#sqlsatPordenone
#sqlsat367February 28, 2015
Q&A
 Questions?
#sqlsatPordenone
#sqlsat367February 28, 2015
THANKS!
#sqlsatPordenone
#sqlsat367
Feedback form: http://speakerscore.com/sqlsat367

More Related Content

Similar to Back to the roots - SQL Server Indexing

Entity Framework 7, Back To The Future!
Entity Framework 7, Back To The Future!Entity Framework 7, Back To The Future!
Entity Framework 7, Back To The Future!
Michael Denny
 

Similar to Back to the roots - SQL Server Indexing (20)

[ITA] SQL Saturday 257 - Put databases under source control
[ITA] SQL Saturday 257 - Put databases under source control[ITA] SQL Saturday 257 - Put databases under source control
[ITA] SQL Saturday 257 - Put databases under source control
 
SQL Server2000
SQL Server2000SQL Server2000
SQL Server2000
 
Introduction Dax
Introduction DaxIntroduction Dax
Introduction Dax
 
[ITA] SQL Saturday 264 - Put databases in ALM backgrounds
[ITA] SQL Saturday 264 - Put databases in ALM backgrounds[ITA] SQL Saturday 264 - Put databases in ALM backgrounds
[ITA] SQL Saturday 264 - Put databases in ALM backgrounds
 
Entity Framework 7, Back To The Future!
Entity Framework 7, Back To The Future!Entity Framework 7, Back To The Future!
Entity Framework 7, Back To The Future!
 
Optimizing dax
Optimizing daxOptimizing dax
Optimizing dax
 
Optimizing dax
Optimizing daxOptimizing dax
Optimizing dax
 
Metadata Driven Pipeline with Microsoft Fabric
Metadata Driven Pipeline  with Microsoft FabricMetadata Driven Pipeline  with Microsoft Fabric
Metadata Driven Pipeline with Microsoft Fabric
 
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
 
Azure SQL Database Ledger
Azure SQL Database LedgerAzure SQL Database Ledger
Azure SQL Database Ledger
 
Azure SQL Database Ledger
Azure SQL Database LedgerAzure SQL Database Ledger
Azure SQL Database Ledger
 
Power bi Clean and Modelling (SQL Saturday #675)
Power bi Clean and Modelling  (SQL Saturday #675)Power bi Clean and Modelling  (SQL Saturday #675)
Power bi Clean and Modelling (SQL Saturday #675)
 
Novità di SQL Server 2017
Novità di SQL Server 2017Novità di SQL Server 2017
Novità di SQL Server 2017
 
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
 
Hosting: gli indici SQL, cosa sono e come funzionano #TipOfTheDay
Hosting: gli indici SQL, cosa sono e come funzionano  #TipOfTheDayHosting: gli indici SQL, cosa sono e come funzionano  #TipOfTheDay
Hosting: gli indici SQL, cosa sono e come funzionano #TipOfTheDay
 
Azure Synapse Analytics for your IoT Solutions
Azure Synapse Analytics for your IoT SolutionsAzure Synapse Analytics for your IoT Solutions
Azure Synapse Analytics for your IoT Solutions
 
Datamart.pdf
Datamart.pdfDatamart.pdf
Datamart.pdf
 
noSQL La nuova frontiera dei Database [DB05-S]
noSQL La nuova frontiera dei Database [DB05-S]noSQL La nuova frontiera dei Database [DB05-S]
noSQL La nuova frontiera dei Database [DB05-S]
 
AWR analysis (o di come utilizzare l’AWR per condurre un’analisi di un databa...
AWR analysis (o di come utilizzare l’AWR per condurre un’analisi di un databa...AWR analysis (o di come utilizzare l’AWR per condurre un’analisi di un databa...
AWR analysis (o di come utilizzare l’AWR per condurre un’analisi di un databa...
 
xVelocity in Deep
xVelocity in DeepxVelocity in Deep
xVelocity in Deep
 

More from Davide Mauri

More from Davide Mauri (20)

Azure serverless Full-Stack kickstart
Azure serverless Full-Stack kickstartAzure serverless Full-Stack kickstart
Azure serverless Full-Stack kickstart
 
Agile Data Warehousing
Agile Data WarehousingAgile Data Warehousing
Agile Data Warehousing
 
Dapper: the microORM that will change your life
Dapper: the microORM that will change your lifeDapper: the microORM that will change your life
Dapper: the microORM that will change your life
 
When indexes are not enough
When indexes are not enoughWhen indexes are not enough
When indexes are not enough
 
Building a Real-Time IoT monitoring application with Azure
Building a Real-Time IoT monitoring application with AzureBuilding a Real-Time IoT monitoring application with Azure
Building a Real-Time IoT monitoring application with Azure
 
SSIS Monitoring Deep Dive
SSIS Monitoring Deep DiveSSIS Monitoring Deep Dive
SSIS Monitoring Deep Dive
 
Azure SQL & SQL Server 2016 JSON
Azure SQL & SQL Server 2016 JSONAzure SQL & SQL Server 2016 JSON
Azure SQL & SQL Server 2016 JSON
 
SQL Server & SQL Azure Temporal Tables - V2
SQL Server & SQL Azure Temporal Tables - V2SQL Server & SQL Azure Temporal Tables - V2
SQL Server & SQL Azure Temporal Tables - V2
 
SQL Server 2016 Temporal Tables
SQL Server 2016 Temporal TablesSQL Server 2016 Temporal Tables
SQL Server 2016 Temporal Tables
 
SQL Server 2016 What's New For Developers
SQL Server 2016  What's New For DevelopersSQL Server 2016  What's New For Developers
SQL Server 2016 What's New For Developers
 
Azure Stream Analytics
Azure Stream AnalyticsAzure Stream Analytics
Azure Stream Analytics
 
Azure Machine Learning
Azure Machine LearningAzure Machine Learning
Azure Machine Learning
 
Dashboarding with Microsoft: Datazen & Power BI
Dashboarding with Microsoft: Datazen & Power BIDashboarding with Microsoft: Datazen & Power BI
Dashboarding with Microsoft: Datazen & Power BI
 
Azure ML: from basic to integration with custom applications
Azure ML: from basic to integration with custom applicationsAzure ML: from basic to integration with custom applications
Azure ML: from basic to integration with custom applications
 
Event Hub & Azure Stream Analytics
Event Hub & Azure Stream AnalyticsEvent Hub & Azure Stream Analytics
Event Hub & Azure Stream Analytics
 
SQL Server 2016 JSON
SQL Server 2016 JSONSQL Server 2016 JSON
SQL Server 2016 JSON
 
SSIS Monitoring Deep Dive
SSIS Monitoring Deep DiveSSIS Monitoring Deep Dive
SSIS Monitoring Deep Dive
 
Real Time Power BI
Real Time Power BIReal Time Power BI
Real Time Power BI
 
Schema less table & dynamic schema
Schema less table & dynamic schemaSchema less table & dynamic schema
Schema less table & dynamic schema
 
Iris Multi-Class Classifier with Azure ML
Iris Multi-Class Classifier with Azure MLIris Multi-Class Classifier with Azure ML
Iris Multi-Class Classifier with Azure ML
 

Back to the roots - SQL Server Indexing