La "regola del prefisso più a sinistra" di Index si applica a SQL Server?

Aug 24 2020

In MySQL, il prefisso più a sinistra è applicabile nel caso di indice a più colonne, menzionato in

  • https://dev.mysql.com/doc/refman/8.0/en/mysql-indexes.html
  • https://dev.mysql.com/doc/refman/8.0/en/multiple-column-indexes.html

Supponiamo che un indice sia composto da (col1, col2, col3). Combinazioni idonee per la ricerca nell'indice:

  • (col1)
  • (col1, col2)
  • (col1, col2, col3)

Combinazioni non idonee per la ricerca nell'indice:

  • (col2)
  • (col2, col3)
  • (col3)

SQL Server utilizza la stessa regola anche per i meccanismi di Index Seek? C'è un documento ufficiale a cui posso fare riferimento? Ho provato a cercarlo in giro ma senza fortuna :( Grazie in anticipo a tutti!

Risposte

2 VenkataramanR Aug 24 2020 at 11:23

SQL Server segue anche un approccio simile per gli indici compositi, in cui solo le colonne da sinistra sono considerate per la ricerca dell'indice. Di seguito la documentazione ufficiale dello stesso:

L'indice su (a,b,c) sarà utile per le query di ricerca inferiori

  • un
  • un, b
  • a,b,c

Ulteriori informazioni sulle pratiche di Index Design su MSDN

Considera l'ordine delle colonne se l'indice conterrà più colonne. La colonna utilizzata nella clausola WHERE in una condizione di ricerca uguale a (=), maggiore di (>), minore di (<) o BETWEEN o che partecipa a un join deve essere inserita per prima. Le colonne aggiuntive devono essere ordinate in base al loro livello di distinzione, ovvero dalla più distinta alla meno distinta.

Ad esempio, se l'indice è definito come Cognome, Nome l'indice sarà utile quando il criterio di ricerca è WHERE Cognome = 'Rossi' o WHERE Cognome = Rossi AND Nome LIKE 'J%'. Tuttavia, Query Optimizer non utilizzerà l'indice per una query che esegue la ricerca solo su FirstName (WHERE FirstName = 'Jane')

6 GordonLinoff Aug 24 2020 at 08:13

Quella regola è fondamentalmente la regola per la scansione degli indici b-tree.

Detto questo, esiste un metodo di scansione alternativo, che Oracle chiama "skip scan". Ciò consente la scansione di un indice sulle chiavi che non si trovano all'estrema sinistra nell'indice. Alcuni database lo implementano, in misura maggiore o minore. Ecco una buona introduzione all'argomento. Non credo che SQL Server implementi skip-scan.

Sebbene gli skip-scan siano potenti, la loro utilità dipende dalla cardinalità della prima chiave nell'indice. Se la prima chiave ha un'elevata cardinalità, allora non sono molto efficaci.