2016-03-19 15 views
2

Ich bin ein Begginer. Ich weiß, dass Indizes für Leistungssteigerungen notwendig sind, aber ich möchte wissen, wie sie hinter den Kulissen funktionieren. Zuvor habe ich zu denken, dass wir auf diesen Spalten machen Indizes sollten, die in enthalten sind, where-Klausel (die ich falsch realisiert ist)Wie arbeiten Indizes hinter den Kulissen

Zum Beispiel SELECT * from MARKS where marks_obtained > 50

Bedenken Sie, dass es auf Primärschlüssel dies ein Clustered-Index ist Tabelle und ich habe einen nicht geclusterten Index auf Marks_Obtained Spalte als seine dort in meiner WHERE-Klausel erstellt.

Meine Wahrnehmung: So sind die Blattknoten enthält Zeiger zu Clustered-Index und als gruppierten Indexpunkte auf tatsächlichen Zeilen werden, wird es ganze Zeilen (aufgrund asteric in meiner Anfrage) wählen

Szenario
stieß ich auf Abfrage folgende (von Adventure DB, auf dem ein nicht gruppierten Index erstellt wurde), der gut arbeitet und dauerte weniger als eine zweite3200000 Reihen auszuführen, bis eine neue Spalte in sie eingefügt wurde:

Abfrage

SELECT x.* 
INTO#X 
FROM dbo.bigProduct AS p 
CROSS APPLY 
(
SELECT TOP 1000 * 
FROM dbo.bigTransactionHistory AS bth 
WHERE 
    bth.ProductId = p.bth.ProductId 
ORDER BY 
    TransactionDate DESC 
) AS x 
WHERE 
    p.ProductId BETWEEN 1000 AND 7500 
GO 

NEW eingefügte Spalte

ALTER TABLE dbo.bigTransactionHistory 
ADD CustomerId INT NULL 

Nach dem Einsetzen von oben Spalte es 17 Sekunden nahm! bedeutet 17 mal langsamer. Ein nicht verklammerter Index fehlte nun im Index in der Spalte CustomerId. Gleich nach der Aufnahme von CustomerId war das Problem verschwunden.

Frage CustomerId schien der Täter zu sein, bis es in den Index aufgenommen wurde. ABER WIE ???

+0

Sie fügen in eine temporäre Tabelle ein, sodass ** ** ** - ** - Operationen zusätzliche Zeit in Anspruch nehmen können. Ich möchte sagen, dass alle Operationen nicht "in der Luft" durchgeführt werden und jeder hat Konsequenzen. Die vorherige Operation konnte aufgrund des aktuellen relevanten Cache-Inhalts einige Zeit beanspruchen (wie lange würde sie nach DBCC DROPCLEANBUFFERS ausgeführt werden?). Die vorherige Operation verursachte Schreibvorgänge von 3.2M-Zeilen in tempdb. Es gibt eine Chance, dass 17s Dateierweiterung von Tempdb nahm. Wie viele Seitenaufteilungen sind nach dem Einfügen der Spalten aufgetreten? Haben Sie danach den Clustered Index neu erstellt (defragmentiert)? –

+0

Es geht nicht nur um _ "wie funktioniert der Index bei Auswahl" _. Jede Aktion, die Sie ausgeführt haben, hatte Auswirkungen. Select hatte einen Effekt sowie Einfügen, Spalten erstellen und ein anderes Auswahl-In. Und ich verstehe nicht ganz, warum du anfingst, über MARKS zu reden, aber ich habe Tests an zwei anderen Tischen durchgeführt. –

+0

DBCCDROPCLEANBUFFERS wurde vor der Ausführung der obigen Abfrage durchgeführt. Ja, der Clusered-Index wurde neu erstellt (einschließlich der Spalte CustomerId), nachdem die neue Spalte – Sadiq

Antwort

0

Der Ausführungsplan würde dies beantworten, aber ich werde eine Vermutung machen: Der nicht gruppierte Index war nicht mehr genug, um die Abfrage zu erfüllen, nachdem die zusätzliche Spalte hinzugefügt wurde. Dies kann dazu führen, dass der Index nicht mehr verwendet wird. Es kann auch eine Clustered-Index-Suche pro Zeile verursachen.

Erfahren Sie, um Ausführungspläne zu lesen. Aktivieren Sie das Feature "tatsächlichen Ausführungsplan" routinemäßig für jede Abfrage, die Sie testen.

Verwandte Themen