Ich habe mich entschlossen, mich ein wenig mit dieser Frage zu befassen, und ich habe einige interessante Dokumente herausgefunden, die darüber sprechen, wie und wann oder vielleicht besser, die Verwendung eines nicht gruppierten Index nicht erzwingen.
Wie aus den Kommentaren von John Eisbrener hervorgeht , ist dieser interessante Artikel von Kimberly L. Tripp einer der am häufigsten zitierten , selbst in anderen Blogs:
Aber es ist nicht die einzige. Wenn Sie interessiert sind, können Sie sich diese Seiten ansehen:
Wie Sie sehen können, bewegen sich alle um das Konzept des Wendepunkts .
Zitiert aus dem Artikel von KL Tripp
Was ist der Wendepunkt?
Es ist der Punkt, an dem die Anzahl der zurückgegebenen Zeilen " nicht mehr selektiv genug " ist. SQL Server verwendet NICHT den nicht gruppierten Index, um die entsprechenden Datenzeilen nachzuschlagen, und führt stattdessen einen Tabellenscan durch.
Wenn SQL Server einen nicht gruppierten Index für einen Heap verwendet, wird im Grunde eine Liste von Zeigern auf die Seiten der Basistabelle abgerufen. Anschließend werden diese Zeiger verwendet, um die Zeilen mit einer Reihe von Operationen abzurufen, die als Row ID Lookups (RID) bezeichnet werden. Dies bedeutet, dass mindestens so viele Seitenlesevorgänge verwendet werden wie die Anzahl der zurückgegebenen Zeilen und möglicherweise noch mehr. Der Prozess ist mit einem Clustered-Index wie der Basistabelle etwas ähnlich, mit dem gleichen Ergebnis: mehr Lesevorgänge.
Aber wann tritt dieser Wendepunkt auf?
Natürlich, wie die meisten Dinge in diesem Leben, kommt es darauf an ...
Nein im Ernst, es tritt zwischen 25% und 33% der Anzahl der Seiten in der Tabelle auf, abhängig von der Anzahl der Zeilen pro Seite. Es gibt jedoch noch weitere Faktoren, die Sie berücksichtigen sollten:
Zitiert aus dem ITPRoToday-Artikel
Andere Faktoren, die den Wendepunkt beeinflussen Obwohl die Kosten für RID-Suchvorgänge der wichtigste Faktor sind, der den Wendepunkt beeinflusst, gibt es eine Reihe anderer Faktoren:
- Physische E / A sind beim Scannen eines Clustered-Index wesentlich effizienter. Clustered-Indexdaten werden nacheinander in Indexreihenfolge auf der Festplatte abgelegt. Folglich gibt es sehr wenig seitlichen Kopfweg auf der Platte, was die E / A-Leistung verbessert.
- Wenn das Datenbankmodul einen Clustered-Index scannt, weiß es, dass es sehr wahrscheinlich ist, dass die nächsten Seiten auf der Festplattenspur noch die benötigten Daten enthalten. Es beginnt also mit dem Lesen in 64-KB-Blöcken anstelle der normalen 8-KB-Seiten. Dies führt auch zu einer schnelleren E / A.
Wenn ich nun meine Abfragen erneut mit Statistik-E / A ausführe:
SET STATISTICS IO ON;
SELECT id, foo, bar, nki FROM my_table WHERE nki < 20000 ORDER BY nki ;
SET STATISTICS IO OFF;
Logical reads: 312
SET STATISTICS IO ON;
SELECT id, foo, bar, nki FROM my_table WITH(INDEX(IX_my_TABLE));
SET STATISTICS IO OFF;
Logical reads: 41293
Die zweite Abfrage erfordert mehr logische Lesevorgänge als die erste.
Sollte ich nicht gruppierten Index vermeiden?
Nein, ein Clustered-Index kann nützlich sein, aber es lohnt sich, sich Zeit zu nehmen und zusätzliche Anstrengungen zu unternehmen, um zu analysieren, was Sie damit erreichen möchten.
Zitiert aus dem Artikel von KL Tripp
Also, was solltest du tun? Es hängt davon ab, ob. Wenn Sie Ihre Daten gut kennen und einige umfangreiche Tests durchführen, sollten Sie einen Hinweis verwenden (es gibt einige clevere Dinge, die Sie programmgesteuert in sps ausführen können. Ich werde versuchen, diesem bald einen Beitrag zu widmen). Eine viel bessere Wahl (wenn überhaupt möglich) ist es jedoch, eine Abdeckung in Betracht zu ziehen (das ist wirklich mein Hauptpunkt :). In meinen Abfragen ist das Abdecken unrealistisch, weil meine Abfragen alle Spalten (das böse SELECT *) wollen. Wenn Ihre Abfragen jedoch enger sind UND eine hohe Priorität haben, ist es besser, einen Abdeckungsindex (in vielen Fällen) als einen Hinweis zu verwenden, weil Ein Index, der eine Abfrage abdeckt, gibt niemals Tipps.
Das ist die Antwort auf das Rätsel, aber es gibt definitiv noch viel mehr zu tun. Der Wendepunkt kann eine sehr gute Sache sein - und er funktioniert normalerweise gut. Wenn Sie jedoch feststellen, dass Sie einen Index erzwingen und eine bessere Leistung erzielen können, sollten Sie einige Nachforschungen anstellen und prüfen, ob dies der Fall ist. Überlegen Sie dann, wie wahrscheinlich es ist, dass ein Hinweis hilft, und jetzt wissen Sie, wo Sie sich konzentrieren können.