Dies hängt wirklich von Indizes und Datentypen ab.
Am Beispiel der Stapelüberlaufdatenbank sieht die Benutzertabelle folgendermaßen aus:
Es hat eine PK / CX in der ID-Spalte. Es ist also die Gesamtheit der Tabellendaten, sortiert nach ID.
Mit diesem als einzigem Index muss SQL das Ganze (ohne die LOB-Spalten) in den Speicher lesen, wenn es nicht bereits vorhanden ist.
DBCC DROPCLEANBUFFERS-- Don't run this anywhere near prod.
SET STATISTICS TIME, IO ON
SELECT u.Id
INTO #crap1
FROM dbo.Users AS u
Die Statistikzeit und das io-Profil sehen folgendermaßen aus:
Table 'Users'. Scan count 7, logical reads 80846, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 2406 ms, elapsed time = 446 ms.
Wenn ich einen zusätzlichen nicht gruppierten Index nur für Id hinzufüge
CREATE INDEX ix_whatever ON dbo.Users (Id)
Ich habe jetzt einen viel kleineren Index, der meine Anfrage erfüllt.
DBCC DROPCLEANBUFFERS-- Don't run this anywhere near prod.
SELECT u.Id
INTO #crap2
FROM dbo.Users AS u
Das Profil hier:
Table 'Users'. Scan count 7, logical reads 6587, physical reads 0, read-ahead reads 6549, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 2344 ms, elapsed time = 384 ms.
Wir können viel weniger Lesevorgänge durchführen und ein wenig CPU-Zeit sparen.
Ohne weitere Informationen zu Ihrer Tabellendefinition kann ich nicht wirklich versuchen, das, was Sie messen möchten, besser zu reproduzieren.
Sie sagen jedoch, dass die anderen Spalten / Felder ebenfalls gescannt werden, sofern für diese einzelne Spalte kein bestimmter Index vorhanden ist? Ist dies nur ein Nachteil des Designs von Rowstore-Tabellen? Warum sollten irrelevante Felder gescannt werden?
Ja, dies gilt speziell für Rowstore-Tabellen. Daten werden durch die Zeile auf Datenseiten gespeichert. Selbst wenn andere Daten auf der Seite für Ihre Abfrage irrelevant sind, muss die gesamte Zeile> Seite> Index in den Speicher eingelesen werden. Ich würde nicht sagen, dass die anderen Spalten so oft "gescannt" werden, wie die Seiten, auf denen sie existieren, gescannt werden, um den für die Abfrage relevanten Einzelwert auf ihnen abzurufen.
Verwenden des alten Telefonbuchbeispiels: Selbst wenn Sie nur Telefonnummern lesen, blättern Sie beim Umblättern Nachname, Vorname, Adresse usw. zusammen mit der Telefonnummer.