Ich bin nur Neugierig.
Angenommen, Sie haben eine Tabelle mit 1 Million Datensätzen / Zeilen.
select order_value from store.orders
Macht es einen Unterschied, ob diese Tabelle in der tatsächlichen Abfragezeit 1 Feld, 2 Felder oder 100 Felder enthält? Ich meine alle Felder außer "order_value".
Im Moment schiebe ich Daten in ein Data Warehouse. Manchmal speichere ich Felder in die Tabelle, die "eines Tages in der Zukunft verwendet werden könnten" - aber sie werden momentan von nichts abgefragt. Würden diese "fremden" Felder ausgewählte Anweisungen beeinflussen, die sie weder direkt noch indirekt enthalten (nein * ich meine)?
sql-server
query-performance
select
user45867
quelle
quelle
Antworten:
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.
Die Statistikzeit und das io-Profil sehen folgendermaßen aus:
Wenn ich einen zusätzlichen nicht gruppierten Index nur für Id hinzufüge
Ich habe jetzt einen viel kleineren Index, der meine Anfrage erfüllt.
Das Profil hier:
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.
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.
quelle
Dies hängt von der Tabellenstruktur und den verfügbaren Indizes ab.
Fall A: Allgemeine (Rowstore-) Tabelle, kein Index für
(order_value)
.Der einzig mögliche Ausführungsplan besteht darin, die gesamte Tabelle zu lesen (was natürlich sehr unterschiedlich ist, wenn es sich um 2 gegen 200 Spalten handelt, also um einige gegen einige tausend Bytes).
Fall B: Allgemeine Tabelle, es gibt einen Index für
(order_value)
oder einige andere Indizes, die diese Spalte enthalten.Es gibt jetzt einen besseren Plan: Scannen Sie den gesamten Index (einen davon) - der natürlich viel enger ist als die gesamte Tabelle, nur ein paar Bytes. Was irrelevant macht, wenn die Tabelle 2 oder 200 Spalten hat. Es wird nur der Index gescannt.
Fall C: Es ist eine Columnstore-Tabelle.
Wie der Name schon sagt, ist die Struktur dieser Tabellen spaltenorientiert und nicht zeilenweise. Es ist kein Index erforderlich, das Tabellendesign selbst eignet sich zum Lesen ganzer Spalten.
quelle