Gibt es ein Problem damit, alle Ihre SQL Server 2008-Zeichenfolgenspalten varchar (max) zu machen? Meine zulässigen Zeichenfolgengrößen werden von der Anwendung verwaltet. Die Datenbank sollte nur so bleiben, wie ich sie gebe. Werde ich einen Leistungseinbruch hinnehmen, indem ich alle Zeichenfolgenspalten in SQL Server 2008 als vom Typ varchar (max) deklariere, unabhängig von der Größe der Daten, die tatsächlich in sie eingehen?
sql-server-2008
varchar
BowserKingKoopa
quelle
quelle
Antworten:
Wenn
VARCHAR(MAX)
Sie SQL Server verwenden, sagen Sie im Grunde, dass "Speichern Sie die Werte in diesem Feld so, wie Sie es am besten sehen". SQL Server wählt dann aus, ob Werte als reguläresVARCHAR
oder als LOB (großes Objekt) gespeichert werden sollen . Wenn die gespeicherten Werte weniger als 8.000 Byte betragen, behandelt SQL Server Werte im Allgemeinen als regulärenVARCHAR
Typ.Wenn die gespeicherten Werte sind zu groß , dann wird die Spalte der Seite , um LOB - Seiten zu vergießen off erlaubt, genau so , wie sie für andere LOB - Typen tun (
text
,ntext
undimage
) - wenn dies geschieht , dann weitere Seite liest erforderlich ist , um die Daten zu lesen , gespeichert in die zusätzlichen Seiten (dh es gibt eine Leistung penatly), dies geschieht jedoch nur, wenn die gespeicherten Werte zu groß sind .Unter SQL Server 2008 oder höher können Daten auch bei Datentypen mit fester Länge (z. B.
VARCHAR(3,000)
) auf zusätzliche Seiten überlaufen. Diese Seiten werden jedoch als Zeilenüberlauf-Datenseiten bezeichnet und geringfügig anders behandelt.Kurzversion: Aus Speichersicht gibt es für einige keinen Nachteil,
VARCHAR(MAX)
OverVARCHAR(N)
zu verwendenN
.(Beachten Sie, dass dies auch für die anderen Feldtypen mit variabler Länge gilt
NVARCHAR
undVARBINARY
)Zu Ihrer Information - Sie können keine Indizes für
VARCHAR(MAX)
Spalten erstellenquelle
Indizes dürfen für einen nicht mehr als 900 Byte breit sein. Sie können also wahrscheinlich nie einen Index erstellen. Wenn Ihre Daten weniger als 900 Byte betragen, verwenden Sie varchar (900).
Dies ist ein Nachteil: weil es gibt
quelle
Simon Sabin hat vor einiger Zeit einen Beitrag dazu geschrieben. Ich habe jetzt nicht die Zeit, es zu greifen, aber Sie sollten danach suchen, da er zu dem Schluss kommt, dass Sie standardmäßig nicht varchar (max) verwenden sollten.
Bearbeitet: Simon hat ein paar Beiträge über varchar (max). Die Links in den Kommentaren unten zeigen dies ganz gut. Ich denke, das wichtigste ist http://sqlblogcasts.com/blogs/simons/archive/2009/07/11/String-concatenation-with-max-types-stops-plan-caching.aspx , das über den Effekt spricht von varchar (max) beim Plan-Caching. Das allgemeine Prinzip ist, vorsichtig zu sein. Wenn Sie nicht brauchen, dass es maximal ist, dann verwenden Sie nicht maximal - wenn Sie mehr als 8000 Zeichen benötigen, dann sicher ... machen Sie es.
quelle
Für diese Frage speziell einige Punkte, die ich nicht erwähnt sehe.
In meiner Antwort werden einige andere Gründe behandelt, warum nicht
varchar(8000)
überall .quelle
Ich habe die ähnliche Frage früher gestellt. habe einige interessante Antworten bekommen. Schau es dir hier an Es gab eine Site, auf der ein Typ über den Nachteil der Verwendung breiter Spalten sprach. Wenn Ihre Daten jedoch in der Anwendung begrenzt sind, haben meine Tests dies widerlegt. Die Tatsache, dass Sie keine Indizes für die Spalten erstellen können, bedeutet, dass ich sie nicht die ganze Zeit verwenden würde (persönlich würde ich sie überhaupt nicht so oft verwenden, aber in dieser Hinsicht bin ich ein bisschen puristisch). Wenn Sie jedoch wissen, dass nicht viel in ihnen gespeichert ist, denke ich nicht, dass sie so schlecht sind. Wenn Sie ein Recordset mit einem varchar (max) in Spalten sortieren (oder eine breite Spalte char oder varchar), kann dies zu Leistungseinbußen führen. Diese können (falls erforderlich) durch Indizes aufgelöst werden, Sie können jedoch keine Indizes für varchar (max) erstellen. Wenn Sie Ihre Spalten zukunftssicher machen möchten, setzen Sie sie einfach auf einen vernünftigen Wert. zB eine Namensspalte mit 255 Zeichen anstelle von max ...
quelle
Es gibt noch einen weiteren Grund, die Verwendung von varchar (max) für alle Spalten zu vermeiden. Aus dem gleichen Grund, aus dem wir Prüfeinschränkungen verwenden (um zu vermeiden, dass Tabellen durch fehlerhafte Software oder Benutzereingaben mit Junk gefüllt werden), möchten wir uns vor fehlerhaften Prozessen schützen, die viel mehr Daten als beabsichtigt hinzufügen. Wenn zum Beispiel jemand oder etwas versucht hat, einem Stadtfeld 3.000 Bytes hinzuzufügen, wissen wir mit Sicherheit, dass etwas nicht stimmt, und möchten den Prozess stoppen, um ihn zum frühestmöglichen Zeitpunkt zu debuggen. Wir würden auch wissen, dass ein 3000-Byte-Städtename möglicherweise nicht gültig sein könnte und Berichte und dergleichen durcheinander bringen würde, wenn wir versuchen würden, ihn zu verwenden.
quelle
Idealerweise sollten Sie nur das zulassen, was Sie brauchen. Das heißt, wenn Sie sicher sind, dass eine bestimmte Spalte (z. B. eine Spalte mit Benutzernamen) niemals länger als 20 Zeichen sein wird, können Sie mit einem VARCHAR (20) im Vergleich zu einem VARCHAR (MAX) die Datenbank Abfragen und Datenstrukturen optimieren.
Von MSDN: http://msdn.microsoft.com/en-us/library/ms176089.aspx
Werden Sie wirklich jemals in die Nähe von 2 ^ 31-1 Bytes für diese Spalten kommen?
quelle