Wann sollten Indizes zu # temp-Tabellen hinzugefügt werden?

8

Beim Testen gespeicherter Prozeduren in SSMS wird manchmal angegeben, dass ein Index für #someTempTable____________________000000000000005B] (someField)etc etc fehlt

Wenn ich sie so zum sp hinzufüge:

CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[#someTable] ([someField])
GO

Ich sehe nie eine Geschwindigkeitsverbesserung. Daher füge ich solche Indizes oft nicht hinzu. Wann sollte ich solche Indizes hinzufügen?

OO
quelle

Antworten:

12

Fügen Sie einen Index hinzu, wenn Sie Ihre temporäre Tabelle und ihren Index während des Abfragelaufs mindestens zweimal verwenden.

Oder um übliche Indexaufgaben wie die Eindeutigkeit beizubehalten

Wenn Ihre in die temporäre Tabelle geladenen Daten bereits sortiert sind, erstellen Sie eine temporäre Tabelle mit demselben Clustered-Index wie die Art der Daten

ABER

Berücksichtigen Sie die Funktion von SQL Server zur Wiederverwendung von temporären Tabellen. Wenn Sie einen Index für temporäre Tabellen erstellen möchten, versuchen Sie dies in der Anweisung CREATE TABLE. Wenn Sie nach der Tabellenerstellung explizit einen Index hinzufügen, wird verhindert, dass SQL Server diese Tabelle beim nächsten Mal wiederverwendet

Oleg Dok
quelle
Sie können der Anweisung CREATE TABLE keinen Index hinzufügen. Dort können nur Einschränkungen hinzugefügt werden.
Erik Dekker
@ErikDekker Einige Einschränkungen zu erstellen bedeutet auch, Indizes zu erstellen
Oleg Dok
Ich kenne. Die Frage war jedoch, einen nicht gruppierten Index hinzuzufügen. Das kann nicht direkt in der create-Anweisung gemacht werden ;-)
Erik Dekker
@ErikDekker Sie können angeben, welcher Indextyp für die Einschränkung erstellt wird
Oleg Dok
5

Dies ist ohne viel mehr Informationen schwer zu beantworten. Im Allgemeinen würde ich sagen, "es kommt darauf an".

Im Allgemeinen füge ich Indizes zu temporären Tabellen hinzu, wenn der Nutzen des Index größer ist als die ursprünglichen Ausführungskosten zuzüglich der Kosten für die Erstellung des Index. Sie müssten einen Benchmark am Beispiel von SET STATISTICS IO durchführen. Ich möchte auch die Ausführungspläne überprüfen, die vor und nach dem Hinzufügen des Index verwendet werden. Manchmal sind empfohlene Indizes keine wirklich guten empfohlenen Indizes :-)

JohnS
quelle
Welche Art von Informationen würden Sie meiner Frage hinzufügen, um sie hilfreicher zu machen?
OO
Ein Beispiel für die Verwendung Ihrer temporären Tabelle wäre hilfreich. Wie oft wird es ausgeführt? Wie oft würden Sie aus der lokalen temporären Tabelle lesen? Ich würde auch gerne die logischen Lese- und Schreibvorgänge sowie die Ausführungspläne für den Code sehen. Wenn Sie eine Basislinie des Vorher und Nachher hätten, würden Sie wissen, ob der Index wirklich hilfreich ist.
JohnS
Ich bin mir nicht sicher, wie ich das alles machen soll, aber ich kann damit beginnen, den tatsächlichen Erklärungsplan der gespeicherten Prozedur zu veröffentlichen, die die nicht indizierten temporären Tabellen verwendet, wenn Sie der Meinung sind, dass dies hilfreich wäre?
OO
Klar, lass uns loslegen. Hier ist auch ein Link , der Ihnen zeigt, wie SET STATISTICS funktioniert. Können Sie dies gegen eine Entwicklungsbox ausführen? Sie möchten beide Szenarien mit und ohne den neuen Index auswerten. Sie möchten auch den Ausführungsplan für beide Ausführungen abrufen.
JohnS
Verstanden. Wie soll ich den Erklärungsplan einfügen? Als XML?
OO
3

Angesichts der Tatsache, dass die von Ihnen angegebene temporäre Tabelle einen lokalen Bereich hat (wie durch das einzelne # gekennzeichnet), ist es im Allgemeinen nicht am besten, einen Index hinzuzufügen, da die Tabelle nur für die Dauer der Verbindung aktiv ist.

OliverAsmus
quelle
Selbst wenn es in einer gespeicherten Prozedur mit mehr als 2000 Zeilen mehrmals verwendet wird?
OO
Sicher - ich habe sie schon relativ einfach in gespeicherten Prozessen dieser Größe verwendet. Sofern keine Abfragehinweise vorhanden sind, sollte der Optimierer in der Lage sein, dies zu kompensieren.
OliverAsmus
1

Sie sollten die Statistiken nach einer erheblich großen Änderung in der Tabelle aktualisieren, z. B.: tempTable erstellen, Index hinzufügen, 10.000 Datensätze einfügen ... STATISTIKEN AKTUALISIEREN.

Radarbob
quelle