Daniels Antwort konzentriert sich auf die Kosten für das Lesen einzelner Zeilen. In diesem Zusammenhang NOT NULL
hilft es ein wenig, Spalten mit fester Größe an erster Stelle in Ihre Tabelle zu setzen. Es hilft ein wenig, die relevanten Spalten (die, nach denen Sie fragen) an erster Stelle zu setzen. Das Minimieren des Auffüllens (aufgrund der Datenausrichtung) durch Spielen von Ausrichtungstetris mit Ihren Spalten kann ein wenig helfen. Der wichtigste Effekt wurde jedoch noch nicht erwähnt, insbesondere bei großen Tischen.
Zusätzliche Spalten sorgen offensichtlich dafür, dass eine Zeile mehr Speicherplatz abdeckt, sodass weniger Zeilen auf eine Datenseite passen (standardmäßig 8 KB). Einzelne Zeilen sind auf mehrere Seiten verteilt. Das Datenbankmodul muss im Allgemeinen ganze Seiten abrufen, nicht einzelne Zeilen . Es spielt keine Rolle, ob einzelne Zeilen etwas kleiner oder größer sind - solange die gleiche Anzahl von Seiten gelesen werden muss.
Wenn eine Abfrage einen (relativ) kleinen Teil einer großen Tabelle abruft, bei dem die Zeilen mehr oder weniger zufällig über die gesamte Tabelle verteilt sind, was durch einen Index unterstützt wird, führt dies zu ungefähr der gleichen Anzahl von Seitenlesevorgängen, ohne dass dies berücksichtigt wird zu Zeilengröße. Irrelevante Spalten verlangsamen Sie in einem solchen (seltenen) Fall nicht sehr.
In der Regel rufen Sie Patches oder Cluster von Zeilen ab, die nacheinander oder in der Nähe eingegeben wurden, und geben Datenseiten frei. Diese Zeilen sind aufgrund der Unordnung verteilt. Es müssen mehr Plattenseiten gelesen werden, um Ihre Abfrage zu erfüllen. Das Lesen weiterer Seiten ist in der Regel der wichtigste Grund für eine langsamere Abfrage. Und das ist der wichtigste Faktor, warum irrelevante Spalten Ihre Abfragen langsamer machen.
Bei großen Datenbanken ist in der Regel nicht genügend RAM vorhanden, um den gesamten Arbeitsspeicher im Cache zu halten. Größere Zeilen belegen mehr Cache, mehr Konflikte, weniger Cache-Treffer und mehr Festplatten-E / A. Und Festplattenlesevorgänge sind in der Regel viel teurer. Weniger bei SSDs, aber ein wesentlicher Unterschied bleibt. Dies fügt dem obigen Punkt über Seitenlesevorgänge hinzu.
Es kann von Bedeutung sein, ob irrelevante Spalten TOAST-ed sind. Relevante Spalten können auch TOAST-ed sein, wodurch der gleiche Effekt erzielt wird.