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

Perché questa istruzione Sql (con 2 join di tabelle) richiede 5 minuti per essere completata?

Questo non è giusto.

Ho due possibilità:

1) Le statistiche non sono aggiornate sulle tabelle. Ricostruisci gli indici e aggiorna le statistiche.

2) Come hai detto, i record della tabella Geografia sono grandi e coprono molte pagine (non quel record che copre più pagine poiché non può, ma il record è vicino al segno 8K). In questo caso, abbastanza divertente, potrebbe essere utile creare un altro indice non cluster sull'indice cluster.

AGGIORNAMENTO

Sono contento che abbia funzionato. Ora qualche spiegazione.

Prima di tutto, se qualcosa non va bene e il piano di esecuzione sembra strano, guarda sempre le statistiche e ricostruisci gli indici.

La creazione di un indice non cluster per l'indice cluster in genere non dovrebbe fornire alcun vantaggio, ma quando la tabella ha molti record e il record è vicino al limite di 8 KB, è utile. Come sai, SQL quando va sul disco per caricare un record, carica una pagina 8K. In modo simile andando agli indici caricherà una pagina di 8K. Ora, dato che l'indice è un numero intero di 4 byte, ciò significa caricare l'ID per 2000 record mentre caricherà una manciata di record se utilizza l'indice cluster (tieni presente che tutto ciò di cui abbiamo bisogno è l'ID per il bit JOIN). Ora, essendo questa una ricerca binaria, non mi aspetto che aiuti enormemente solo un po'. Quindi forse qualcos'altro non va bene, ma difficile da indovinare non avendo visto il sistema.