Nicht gruppierte Indizes - Schlüssel und Nichtschlüssel

8

Ich möchte nur sicherstellen, dass ich mit diesen Konzepten auf dem richtigen Weg bin, daher wäre jedes Feedback sehr willkommen.

Hier ist meine Theorie aus der Abfrage, die ich gerade optimiert habe, durch Ausprobieren und Lesen der MSDN-Dokumentation.

Die Abfrage

DECLARE @pic_id int
SET pic_id = 1

SELECT ROW_NUMBER() OVER (ORDER BY pic_date desc) AS row_num, *
FROM tbl_pics
WHERE deleted = 0 AND map_id = 1 AND (hidden = 0 OR pic_id = @pic_id)

Der Index

CREATE NONCLUSTERED INDEX [IX_tbl_pics] ON [dbo].[tbl_pics] 
(
    [map_id] ASC,
    [deleted] ASC,
    [pic_date] DESC
)
INCLUDE ( [hidden], [pic_id] )

Es gibt auch einen PK-Index für pic_id

Die Theorie

Die Schlüsselspalten sind so, weil sie entweder in einer WHERE-Klausel (aber nicht in einer OR-Situation) oder in ORDER BY verwendet werden.

Die Nichtschlüsselspalten (INCLUDE) als solche, weil sie in WHERE verwendet werden, aber weil sie in einem ODER-Szenario verwendet werden, können sie keine Schlüsselspalte sein (können nicht = werden die Leistung nicht verbessern).

Sind diese Annahmen richtig? Wenn nicht, was vermisse ich?

Vielen Dank!

Darthtong
quelle

Antworten:

8

Sie fordern den Abfrageoptimierer auf, einen Plan zu erstellen, der die Abfrage beantworten kann:

SELECT *
FROM tbl_pics
WHERE deleted = 0 AND map_id = 1 AND hidden = 0;

Der Rest ist Flusen (einschließlich der OR pic_id = @pic_id). Dies wird aufgrund der geringen Selektivität der beteiligten Prädikate garantiert ein Tabellenscan sein (ich bin sicher deletedund bin hidden0/1, und map_ipich bezweifle, dass dies signifikante Auswirkungen hat). Das einzige Prädikat, das die Abfrage speichern könnte , ist pic_id = @pic_id, dass Sie die Chance beendet haben, indem Sie sie in einen ODER-Zustand versetzt haben. Kein Sekundärindex kann realistisch helfen. Das Hinzufügen von ROW_NUMBER führt höchstwahrscheinlich zu einer Sortierung, aber der eigentliche Schaden ist der Scan.

Dies ist eine verlorene Sache. Überlegen Sie sich realistische Anforderungen.

Remus Rusanu
quelle
6

Ist der Primärschlüssel auch der Clustered-Index? INCLUDE (pic_id)In diesem Fall gibt es keinen Grund dafür, da der eindeutige Clustered-Index bereits als Lesezeichen im Nonclustered-Index verwendet wird.

Was das betrifft, worüber Sie mit dem OP sprechen, ist dies effektiv ein zweiter Teil des WO, aber Sie verlassen sich nur auf die Selektivität des Ersten, der den größten Teil der Arbeit erledigt (während Sie sich auf das INCLUDE verlassen, um nicht dorthin zu gehen) Der Tisch).

Aber wenn Sie * da drin haben, müssen Sie vielleicht trotzdem zum Tisch gehen.

Auf der anderen Seite entwerfe ich meine Indizes möglicherweise nicht auf der Grundlage einer einzelnen Abfrage, es sei denn, diese Abfrage wird sehr häufig verwendet, ohne mehr Last zu berücksichtigen. Und immer noch einen Blick auf den Hinrichtungsplan zu werfen, konnte nicht schaden.

Cade Roux
quelle