Beste Antwort
Bussing Tische sind ein Job in einem Restaurant. Es bedeutet, den Tisch zwischen den Kunden zu reinigen. Dazu gehört das Entfernen aller schmutzigen oder gebrauchten Gegenstände (Geschirr, Besteck, Servietten) und das anschließende Abwischen des Tisches.
Die traditionelle Berufsbezeichnung lautet „Busboy“, aber nicht jeder, der diese Arbeit erledigt, ist ein Junge . Möglicherweise gibt es jetzt einen geschlechtsneutralen Begriff.
Antwort
In dem von Ihnen beschriebenen Szenario geben Sie an, dass die am häufigsten verwendeten Felder in der Tabelle der Primärschlüssel (CompanyId) sind ), ein einzelnes Datenfeld (CompanyName) und ein Fremdschlüssel (IndustryId). Wenn für diese Felder Indizes vorhanden sind, die für den Primärschlüssel garantiert sind und für den Fremdschlüssel äußerst wahrscheinlich sind, da sonst Ihre Datenbankleistung beeinträchtigt würde, werden Abfragen, die nur auf diese Felder verweisen, in vielen Fällen erfüllt vollständig aus den Indizes . Die Datenbankseiten selbst werden nicht gelesen. Sie können dies selbst überprüfen, indem Sie einen Abfrageausführungsplan vom Abfrageanalysator anfordern. Wenn der Ausführungsplan eine „Indexsuche“ oder „Indexspool“ verwendet, wird ein Index zum Erstellen der Abfrageergebnisse verwendet. Wenn der Primärschlüsselindex geclustert ist, ist die Situation etwas anders, aber ich überlasse es Sie müssen untersuchen, was ein Clustered-Index in SQL Server ist und wie er die Art und Weise ändert, in der die Datenbank gespeichert und auf sie zugegriffen wird. Wenn SQL Server eine Ergebnismenge mithilfe von Daten aus einem Index erstellen kann, wird dies im Allgemeinen anstelle der Verwendung der Datenbanktabellenseiten durchgeführt, da dies bedeutet, dass weniger Daten gelesen werden. Ein Index ist identisch zu einer Tabelle strukturiert, außer dass er nur die im Index angegebenen Spalten sowie ein Zeilenlokalisierungsfeld enthält, das ein Zeiger auf den Speicherort der Zeile ist. Dieser Zeiger (24 Byte) ist normalerweise kleiner als die Zeilendaten selbst und daher passen fast immer mehr Indextabellenzeilen als Tabellenzeilen in eine Datenbankseite.
Die Datenbankseitengröße in SQL Server ist auf 8192 festgelegt Bytes. 96 Bytes der Seite werden für einen Header verwendet. Dieser und anderer Overhead belassen eine maximale Zeilengröße von 8060 Bytes. In SQL Server 2008 können jedoch die Spalten varchar, nvarchar, varbinary und sql\_variant diese Grenze überschreiten und diese Felder auf Überlaufseiten verschieben, wenn ihre Aufnahme in eine Zeile dazu führen würde, dass eine Zeile diese Grenze für die Zeilengröße überschreitet. Außerdem werden Text-, ntext-, Bild-, nvarchar (max) -, varchar (max) -, varbinary (max) – und xml-Spalten immer auf separaten Seiten gespeichert, unabhängig davon, wie viele Daten tatsächlich in der Spalte gespeichert sind. Die von Ihnen veröffentlichte Tabellendefinition zeigt die Gesamtspaltenbreiten an, die die 8060-Byte-Grenze bei weitem überschreiten. Das meiste davon befindet sich jedoch in varchar (n) -Feldern, sodass Sie Zeilenüberlaufseiten für Zeilen erhalten, in denen die tatsächliche Größe der Variablen angegeben ist Breite Spalten ist ausreichend groß. Die Anzahl der Seiten, die eine Zeile in dieser Tabelle verwendet, hängt daher davon ab, wie lange die tatsächlich in den Spalten mit variabler Breite gespeicherten Daten für jede Zeile sind.
Wenn Sie nur wenige Felder verwenden, die häufig verwendet werden, können Sie wahrscheinlich nur so viele Verbesserungen erzielen, indem Sie sicherstellen, dass Felder und Kombinationen von Feldern, die Sie häufig verwenden, als Indizes verfügbar sind. Dies bedeutet, dass die meisten Rowsets aus Indexdaten anstelle von Tabellendaten ausgefüllt werden können, wodurch Probleme beim Laden großer Zeilen aus der Datenbank vermieden werden. Das Beste ist, dass dies vollständig auf DBA-Ebene erfolgen kann. Die Anwendung muss nicht neu geschrieben werden, um die Änderung des Schemas widerzuspiegeln, die durch das Hinzufügen (oder Entfernen) von Indizes verursacht wird. Natürlich sollte jede Spalte, die Sie als Teil eines Joins verwenden, indiziert werden. Andernfalls werden Sie dies tun Tabellensuche nach Verknüpfungen, die in der Tat recht langsam sind.
Ich könnte vorschlagen, dass Sie für einige dieser größeren Felder ntext anstelle großer nvarchar-Felder in Betracht ziehen, obwohl dies aufgrund der Semantik des Texts möglicherweise Änderungen am Anwendungscode erfordert / ntext unterscheidet sich von denen von varchar / nvarchar. Text- / Textspalten werden immer in LOB-Seiten gespeichert, anstatt bedingt auf der Zeilendatenseite gespeichert, und wenn diese Spalten häufig vorhanden und von mittlerer Größe sind (z (1000-2000 Bytes), wenn sie als Text / ntext gespeichert werden, bleiben die restlichen Zeilendatenseiten kleiner und es können mehr Zeilen pro Seite möglich sein, wodurch Tabellenscans beschleunigt werden, die nicht auf diese Spalten verweisen müssen.