To naprawdę zależy od indeksów i typów danych.
Korzystając z bazy danych przepełnienia stosu jako przykładu, tak wygląda tabela Użytkownicy:
Ma PK / CX w kolumnie Id. Jest to więc całość danych tabeli posortowanych według Id.
Jako że jest to jedyny indeks, SQL musi wczytać całą pamięć (bez kolumn LOB) do pamięci, jeśli jeszcze jej nie ma.
DBCC DROPCLEANBUFFERS-- Don't run this anywhere near prod.
SET STATISTICS TIME, IO ON
SELECT u.Id
INTO #crap1
FROM dbo.Users AS u
Czas statystyki i profil io wygląda następująco:
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.
Jeśli dodam dodatkowy indeks nieklastrowany tylko na Id
CREATE INDEX ix_whatever ON dbo.Users (Id)
Mam teraz znacznie mniejszy indeks, który spełnia moje zapytanie.
DBCC DROPCLEANBUFFERS-- Don't run this anywhere near prod.
SELECT u.Id
INTO #crap2
FROM dbo.Users AS u
Profil tutaj:
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.
Jesteśmy w stanie wykonać znacznie mniej odczytów i zaoszczędzić trochę czasu procesora.
Bez dodatkowych informacji na temat definicji tabeli nie mogę naprawdę lepiej odtworzyć tego, co próbujesz zmierzyć.
Ale mówisz, że jeśli nie ma określonego indeksu w tej samotnej kolumnie, inne kolumny / pola również zostaną przeskanowane? Czy to tylko wada związana z projektowaniem tabel magazynu rzędów? Dlaczego skanowane są niepotrzebne pola?
Tak, jest to specyficzne dla tabel magazynu wierszy. Dane są przechowywane przez wiersz na stronach danych. Nawet jeśli inne dane na stronie nie mają znaczenia dla twojego zapytania, cały wiersz> strona> indeks musi zostać wczytany do pamięci. Nie powiedziałbym, że inne kolumny są „skanowane”, tak jak skanowane są strony, na których one istnieją, w celu pobrania pojedynczej wartości odpowiadającej zapytaniu.
Na przykładzie starej książki telefonicznej: nawet jeśli czytasz tylko numery telefonów, przewracając stronę, zmieniasz nazwisko, imię, adres itp. Wraz z numerem telefonu.