2010-12-08 10 views
1

Ich zufällig gerade gelesen Maximum Capacity Specification for SQL Server 2008 und sah maximal 8060bytes pro Reihe? Was zum ... Nur 8KB pro Zeile erlaubt? (Ja, ich sah "row-overflow storage" spezielle Handhabung, ich spreche über Standard-Verhalten)SQL Server maximal 8 KB pro Zeile?

Habe ich hier etwas falsch verstanden? Ich bin mir sicher, dass ich bin bin bin sicher, ich sah binäre Objekte mit mehreren MB Größen in SQL Server-Datenbanken gespeichert. Ist diese ominöse pro Zeile wirklich eine Tabellenzeile wie in einer Zeile, mehrere Spalten bedeuten?

Also wenn ich drei Spalten mit jeweils 4000 Zeichen drin habe (angenommen, drei juristische Dokumente in Textboxen geschrieben ...) - spuckt der Server eine Warnung aus?

Antwort

3

Ja, erhalten Sie eine Warnung auf CREATE TABLE, einen Fehler auf INSERT oder UPDATE

LOB-Typen (nvarchar (max), varchar (max) und varbinary (max) erlauben 2Gb-1 Bytes, die ist wie Sie große Datenmengen speichern würde und das, was Sie vor

  • Für ein einzelnes Feld> 4000 Zeichen/8000 Bytes gesehen haben würde. ich würde nvarchar (max)

  • verwenden für 3 x nvarchar (4000) in einer Reihe würde ich eins von betrachten:

    • mein Design ist falsch
    • nvarchar (max) für eine oder mehrere Spalte
    • 1: 1 Kind-Tabelle für die "am wenigsten besiedelten" Spalten
+1

Es muss nicht eine Max-Spalte sein, die auf eine andere Seite verschoben wird, obwohl ich glaube, dass sie automatisch so behandelt werden. Wenn Sie das Limit überschreiten, wird die größte Spalte auf eine andere Seite verschoben. Ich würde auch bemerken, dass es nur ist, wenn Ihre Daten tatsächlich die Grenze von 8060 Byte überschreiten, nicht wenn die Summe der Spaltengrößen dies tut. Die Überprüfung Ihres Schemas ist eine gute Idee, wenn dies geschieht, aber wenn es nur selten vorkommt, ist es möglicherweise eine praktikable Option, SQL Server damit umgehen zu lassen. Für das OP-Beispiel ist es wahrscheinlich besser, jedes Dokument separat zu speichern und eine Join-Tabelle beizubehalten, um N Dokumente zu speichern. – tvanfosson

+0

Ja. Dies ist das SQL Server 2000-Verhalten, das ich denke (Warnung bei CREATE TABLE, ein Fehler bei INSERT oder UPDATE). SQL Server 2008 wird den Überlauf behandeln. –

+0

@tvanfosson: Ja, es ist im Grunde still und automatisch, obwohl es für sp_tableoption mit der Option "große Werttypen außerhalb der Reihe" konfiguriert werden kann. @Martin: Ich habe das vergessen: angefangen mit SQL Server 2005. – gbn

1

2008 wird der Überlauf behandeln während im Jahr 2000 würde es sich einfach weigern, einen übergelaufenen Datensatz einzufügen. Es ist jedoch immer noch am besten, dies zu berücksichtigen, da eine erhebliche Anzahl von übergelaufenen Datensätzen zu Leistungsproblemen bei der Abfrage führen kann. In dem von Ihnen beschriebenen Fall könnte ich eine verwandte Tabelle mit einer Spalte für den Dokumenttyp, ein großes Feld für das Dokument und einen Fremdschlüssel für die Anfangstabelle in Betracht ziehen. Wenn es jedoch im Gegensatz dazu ist, dass alle drei Spalten in dem gleichen Datensatz oder bei den maximalen Werten gefüllt sind, dann könnte das Design in Ordnung sein. Sie müssen Ihre Daten kennen, um festzustellen, welche die beste ist. Eine weitere Überlegung ist, wie Sie jetzt fortfahren, bis Sie Probleme haben und dann durch eine separate Dokumententabelle ersetzen. Sie könnten sogar umstrukturieren, indem Sie die vorhandene Tabelle umbenennen und eine neue erstellen und dann eine Ansicht mit dem vorhandenen Tabellennamen erstellen, der die Daten aus der neuen Struktur abruft. Dies könnte dazu führen, dass Ihr Code nicht weiter verarbeitet wird, obwohl Sie noch Anweisungen zum Einfügen oder Aktualisieren vornehmen müssen.