Ho deciso di scavare un po 'su questa domanda e ho scoperto alcuni documenti interessanti che parlavano di come e quando usare o forse meglio, non (forzare) l'uso di un indice non cluster.
Come suggerito dai commenti di John Eisbrener , uno dei più citati, anche in altri blog, è questo interessante articolo di Kimberly L. Tripp:
ma non è l'unico, se sei interessato puoi dare un'occhiata a queste pagine:
Come puoi vedere, tutti si muovono attorno al concetto di punto di ribaltamento .
Citato dall'articolo di KL Tripp
Qual è il punto critico?
È il punto in cui il numero di righe restituite non è " abbastanza selettivo ". SQL Server sceglie di NON utilizzare l'indice non cluster per cercare le righe di dati corrispondenti e invece esegue una scansione della tabella.
Quando SQL Server utilizza un indice non cluster su un heap, in pratica ottiene un elenco di puntatori alle pagine della tabella di base. Quindi utilizza questi puntatori per recuperare le righe con una serie di operazioni denominate Ricerche ID riga (RID). Ciò significa che almeno utilizzerà tutte le letture di pagina quante sono state restituite le righe e forse altre. Il processo è in qualche modo simile con un indice cluster come tabella di base, con lo stesso risultato: più letture.
Ma quando si verifica quel punto critico?
Naturalmente come la maggior parte delle cose in questa vita, dipende ...
No sul serio, si verifica tra il 25% e il 33% del numero di pagine nella tabella, a seconda di quante righe per pagina. Ma ci sono altri fattori che dovresti considerare:
Citato dall'articolo di ITPRoToday
Altri fattori che influenzano il punto di ribaltamento Sebbene il costo delle ricerche RID sia il fattore più importante che influenza il punto di ribaltamento, ci sono una serie di altri fattori:
- L'I / O fisico è molto più efficiente durante la scansione di un indice cluster. I dati dell'indice cluster vengono posizionati in sequenza sul disco in ordine di indice. Di conseguenza, sul disco è presente una corsa della testa laterale molto ridotta, che migliora le prestazioni di I / O.
- Quando il motore di database esegue la scansione di un indice cluster, sa che esiste un'alta probabilità che le prossime pagine sulla traccia del disco contengano ancora i dati di cui ha bisogno. Quindi, inizia a leggere in anticipo in blocchi da 64 KB anziché nelle normali pagine da 8 KB. Ciò comporta anche un I / O più veloce.
Ora, se eseguo di nuovo le mie query utilizzando le statistiche IO:
SET STATISTICS IO ON;
SELECT id, foo, bar, nki FROM my_table WHERE nki < 20000 ORDER BY nki ;
SET STATISTICS IO OFF;
Logical reads: 312
SET STATISTICS IO ON;
SELECT id, foo, bar, nki FROM my_table WITH(INDEX(IX_my_TABLE));
SET STATISTICS IO OFF;
Logical reads: 41293
La seconda query richiede più letture logiche rispetto alla prima.
Devo evitare l'indice non cluster?
No, un indice cluster può essere utile, ma vale la pena impiegare del tempo e fare uno sforzo in più per analizzare ciò che stai cercando di ottenere con esso.
Citato dall'articolo di KL Tripp
Quindi cosa dovresti fare? Dipende. Se conosci bene i tuoi dati e fai alcuni test approfonditi che potresti prendere in considerazione usando un suggerimento (ci sono alcune cose intelligenti che puoi fare programmaticamente in sps, proverò a dedicare un post a questo presto). Tuttavia, una scelta molto migliore (se possibile) è quella di considerare la copertura (questo è davvero il mio punto principale :). Nelle mie query, la copertura non è realistica perché le mie query vogliono tutte le colonne (il male SELEZIONA *) ma, se le tue query sono più strette E hanno priorità alta, stai meglio con un indice di copertura (in molti casi) su un suggerimento perché un indice che copre una query, mai suggerimenti.
Questa è la risposta al puzzle per ora, ma c'è sicuramente molto altro in cui tuffarsi. Il Tipping Point può essere un'ottima cosa - e di solito funziona bene. Ma, se stai scoprendo che puoi forzare un indice e ottenere prestazioni migliori, potresti voler investigare e vedere se è questo. Quindi considera la probabilità che un suggerimento sia di aiuto e ora sai dove concentrarti.