Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Warum dauert die Ausführung dieser SQL-Anweisung (mit 2 Tabellenverknüpfungen) 5 Minuten?

Das ist nicht richtig.

Ich habe zwei Möglichkeiten:

1) Statistiken sind auf den Tabellen veraltet. Erstellen Sie Indizes neu und aktualisieren Sie Statistiken.

2) Wie Sie sagten, sind Geographie-Tabellendatensätze groß und erstrecken sich über viele Seiten (nicht dieser eine Datensatz, der sich über mehrere Seiten erstreckt, da dies nicht möglich ist, aber der Datensatz liegt nahe an der 8-KB-Marke). In diesem Fall könnte es lustigerweise hilfreich sein, einen weiteren nicht geclusterten Index für den geclusterten Index zu erstellen.

AKTUALISIEREN

Ich freue mich, dass es funktioniert hat. Nun eine Erklärung.

Erstens, wenn etwas nicht wirklich stimmt und der Ausführungsplan komisch aussieht, schaut immer auf die Statistiken und baut die Indizes neu auf.

Das Erstellen eines nicht gruppierten Index für den gruppierten Index sollte normalerweise keinen Vorteil bringen, aber wenn die Tabelle viele Datensätze enthält und der Datensatz nahe an seiner 8-KB-Grenze liegt, ist es hilfreich. Wie Sie wissen, lädt SQL, wenn es auf die Festplatte geht, um einen Datensatz zu laden, eine 8K-Seite. Auf ähnliche Weise wird beim Aufrufen von Indizes eine 8K-Seite geladen. Da der Index nun eine 4-Byte-Ganzzahl ist, bedeutet dies, dass die ID für 2000 Datensätze geladen wird, während er eine Handvoll Datensätze laden wird, wenn er einen gruppierten Index verwendet (denken Sie daran, dass wir nur die ID für das JOIN-Bit benötigen). Da dies eine binäre Suche ist, erwarte ich nicht, dass sie nur ein bisschen hilft. Vielleicht ist also etwas anderes nicht ganz richtig, aber schwer zu erraten, wenn man das System nicht gesehen hat.