Indici

Migliorare le prestazioni delle query in SQL Server

Dean Smith

Founder, Atamai Analytics

Cos’è un indice?

  • Struttura che accelera l’accesso ai dati di una tabella
  • Permette di trovare dati senza scansionare tutta la tabella
  • Utile per query con filtri
  • Si applica alle colonne
  • Di solito creato da un amministratore del database
Migliorare le prestazioni delle query in SQL Server

Indici cluster e non cluster

Indice cluster

  • Analogia: dizionario
  • Le pagine dati sono ordinate per le colonne indicizzate
  • Solo uno per tabella
  • Velocizza le ricerche
Migliorare le prestazioni delle query in SQL Server

Indici cluster e non cluster

Indice cluster

  • Analogia: dizionario
  • Le pagine dati sono ordinate per le colonne indicizzate
  • Solo uno per tabella
  • Velocizza le ricerche

Indice non cluster

  • Analogia: libro di testo con indice in fondo
  • Struttura con un livello ordinato di puntatori verso pagine dati non ordinate
  • Una tabella può averne più di uno
  • Migliora insert e update
Migliorare le prestazioni delle query in SQL Server

Indice cluster: struttura B-tree

 

  • NODO RADICE

 

  • NODI RAMO

 

  • NODI PAGINA
Migliorare le prestazioni delle query in SQL Server

Indice cluster: struttura B-tree

NODO RADICE:                          
                                    A G O W
NODI RAMO:
                A B E F             G H J K             O P S T
NODI PAGINA:
          Pagina 1           Pagina 2           Pagina 3            Pagina 4
       Colonna Indice |... Colonna Indice |... Colonna Indice | ... Colonna Indice | ...
       A | ...            E | ...            I | ...             M | ...
       B | ...            F | ...            J | ...             N | ...
       C | ...            G | ...            K | ...             O | ...
       D | ...            H | ...            L | ...             P | ...
       ...                ...                ...                 ...
Migliorare le prestazioni delle query in SQL Server

Tabella Customers senza indice cluster

SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
NODI PAGINA:
            Pagina 1
         CustomerID |...
         ALFKI | ... 
         ANATR | ...
         BLONP | ... 
         BSBEV | ...
         ...                 
Migliorare le prestazioni delle query in SQL Server

Tabella Customers senza indice cluster

SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
NODI PAGINA:
            Pagina 1            Pagina 2
         CustomerID |...     CustomerID|...
         ALFKI | ...         FOLIG | ...
         ANATR | ...         FRANK | ...
         BLONP | ...         GALED | ...
         BSBEV | ...         GREAL | ...
         ...                 ...
Migliorare le prestazioni delle query in SQL Server

Tabella Customers senza indice cluster

SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
NODI PAGINA:
            Pagina 1            Pagina 2            Pagina 3
         CustomerID |...     CustomerID|...      CustomerID | ... 
         ALFKI | ...         FOLIG | ...         LILAS | ...  
         ANATR | ...         FRANK | ...         LINOD | ...  
         BLONP | ...         GALED | ...         MEREP | ...  
         BSBEV | ...         GREAL | ...         MORGK | ...   
         ...                 ...                 ...          
Migliorare le prestazioni delle query in SQL Server

Tabella Customers senza indice cluster

SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
NODI PAGINA:
            Pagina 1            Pagina 2            Pagina 3             Pagina 4
         CustomerID |...     CustomerID|...      CustomerID | ...     CustomerID | ...
         ALFKI | ...         FOLIG | ...         LILAS | ...          OCEAN | ...
         ANATR | ...         FRANK | ...         LINOD | ...          PARIS | ...
         BLONP | ...         GALED | ...         MEREP | ...           
         BSBEV | ...         GREAL | ...         MORGK | ...          
         ...                 ...                 ...                  ...
Migliorare le prestazioni delle query in SQL Server

Tabella Customers con indice cluster

SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
NODO RADICE:                          
                                         ALFKI FOLIG OLDWO WOLZA
NODI RAMO:
              ALFKI BONAP DRACD FISSA    FOLIG GALED LILAS NORTS    OCEAN OLDWO QUICK WOLZA
NODI PAGINA:
                    Pagina 1            Pagina 2            Pagina 3             Pagina 4
                 CustomerID |...     CustomerID|...      CustomerID | ...     CustomerID | ...
                 ALFKI | ...         FOLIG | ...         LILAS | ...          OCEAN | ...
                 ANATR | ...         FRANK | ...         LINOD | ...          PARIS | ...
                 BLONP | ...         GALED | ...         MEREP | ...          PICCO | ...
                 BSBEV | ...         GREAL | ...         MORGK | ...          QUICK | ...
                 ...                 ...                 ...                  ...
Migliorare le prestazioni delle query in SQL Server

Tabella Customers con indice cluster

SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
NODO RADICE:                          
                                                     OLDWO WOLZA
NODI RAMO:
              ALFKI BONAP DRACD FISSA    FOLIG GALED LILAS NORTS    OCEAN OLDWO QUICK WOLZA
NODI PAGINA:
                    Pagina 1            Pagina 2            Pagina 3             Pagina 4
                 CustomerID |...     CustomerID|...      CustomerID | ...     CustomerID | ...
                 ALFKI | ...         FOLIG | ...         LILAS | ...          OCEAN | ...
                 ANATR | ...         FRANK | ...         LINOD | ...          PARIS | ...
                 BLONP | ...         GALED | ...         MEREP | ...          PICCO | ...
                 BSBEV | ...         GREAL | ...         MORGK | ...          QUICK | ...
                 ...                 ...                 ...                  ...
Migliorare le prestazioni delle query in SQL Server

Tabella Customers con indice cluster

SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
NODO RADICE:                          
                                                     OLDWO WOLZA
NODI RAMO:
                                                                          OLDWO QUICK 
NODI PAGINA:
                    Pagina 1            Pagina 2            Pagina 3             Pagina 4
                 CustomerID |...     CustomerID|...      CustomerID | ...     CustomerID | ...
                 ALFKI | ...         FOLIG | ...         LILAS | ...          OCEAN | ...
                 ANATR | ...         FRANK | ...         LINOD | ...          PARIS | ...
                 BLONP | ...         GALED | ...         MEREP | ...          PICCO | ...
                 BSBEV | ...         GREAL | ...         MORGK | ...          QUICK | ...
                 ...                 ...                 ...                  ...
Migliorare le prestazioni delle query in SQL Server

Tabella Customers con indice cluster

SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
NODO RADICE:                          
                                                     OLDWO WOLZA
NODI RAMO:
                                                                          OLDWO QUICK 
NODI PAGINA:
                                                                                 Pagina 4
                                                                              CustomerID | ...
                                                                              OCEAN | ...
                                                                              PARIS | ...
                                                                              PICCO | ...
                                                                              QUICK | ...
                                                                              ...
Migliorare le prestazioni delle query in SQL Server

Tabella Customers con indice cluster

SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
NODO RADICE:                          
                                                     OLDWO WOLZA
NODI RAMO:
                                                                          OLDWO QUICK 
NODI PAGINA:
                                                                                 Pagina 4
                                                                              CustomerID | ...



                                                                             PARIS | ...


Migliorare le prestazioni delle query in SQL Server

Indice cluster: esempio

SET STATISTICS IO ON
SELECT * 
FROM PlayerStats 
WHERE Team = 'OKC'

Tabella PlayerStats senza indice

Tabella 'PlayerStats'. ..., letture logiche 12, ...

 

Tabella PlayerStats con indice cluster su Team

Tabella 'PlayerStats'. ..., letture logiche 2, ...
Migliorare le prestazioni delle query in SQL Server

Passiamo alla pratica !

Migliorare le prestazioni delle query in SQL Server

Preparing Video For Download...