Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Devo indicizzare un campo bit in SQL Server?

Considera cos'è un indice in SQL e l'indice è in realtà un blocco di memoria che punta ad altri blocchi di memoria (cioè puntatori a righe). L'indice è suddiviso in pagine in modo che parti dell'indice possano essere caricate e scaricate dalla memoria a seconda dell'utilizzo.

Quando chiedi un insieme di righe, SQL utilizza l'indice per trovare le righe più rapidamente rispetto alla scansione della tabella (guardando ogni riga).

SQL ha indici cluster e non cluster. La mia comprensione degli indici cluster è che raggruppano valori di indice simili nella stessa pagina. In questo modo, quando chiedi tutte le righe che corrispondono a un valore di indice, SQL può restituire quelle righe da una pagina di memoria raggruppata. Questo è il motivo per cui provare a raggruppare l'indice di una colonna GUID è una cattiva idea:non si tenta di raggruppare valori casuali.

Quando si indicizza una colonna intera, l'indice di SQL contiene un set di righe per ogni valore di indice. Se hai un intervallo da 1 a 10, avresti 10 puntatori di indice. A seconda di quante righe ci sono, questo può essere impaginato in modo diverso. Se la tua query cerca l'indice che corrisponde a "1" e quindi dove Nome contiene "Fred" (supponendo che la colonna Nome non sia indicizzata), SQL ottiene molto rapidamente il set di righe che corrispondono a "1", quindi la tabella esegue la scansione per trovare il resto.

Quindi ciò che SQL sta realmente facendo è cercare di ridurre il working set (numero di righe) su cui deve scorrere.

Quando indicizzi un campo di bit (o un intervallo ristretto), riduci il working set solo del numero di righe che corrispondono a quel valore. Se hai un piccolo numero di righe corrispondenti, ridurrebbe molto il tuo set di lavoro. Per un numero elevato di righe con distribuzione 50/50, potrebbe farti guadagnare pochissimo in termini di prestazioni rispetto a mantenere aggiornato l'indice.

Il motivo per cui tutti dicono di testare è perché SQL contiene un ottimizzatore molto intelligente e complesso che può ignorare un indice se decide che la scansione delle tabelle è più veloce, o può utilizzare un ordinamento o può organizzare le pagine di memoria come preferisce.