Ich habe gerade gelesen, dass der VARCHAR(MAX)
Datentyp (der fast 2 GB Zeichendaten speichern kann) der empfohlene Ersatz für den TEXT
Datentyp in den Versionen SQL Server 2005 und Next SQL SERVER ist.
Welche Operation ist schneller, wenn ich in einer Spalte nach einer Zeichenfolge suchen möchte?
Verwenden Sie eine
LIKE
Klausel gegen eineVARCHAR(MAX)
Spalte?WHERE COL1 LIKE '%search string%'
Verwenden Sie die
TEXT
Spalte und fügen Sie einen Volltextindex / Katalog in diese Spalte ein, und suchen Sie dann mit derCONTAINS
Klausel?WHERE CONTAINS (Col1, 'MyToken')
sql-server
performance
text
varchar
sql-types
user85116
quelle
quelle
TEXT
undNTEXT
(undIMAGE
) veraltet sind.Antworten:
Der
VARCHAR(MAX)
Typ ist ein Ersatz fürTEXT
. Der grundlegende Unterschied besteht darin, dass einTEXT
Typ die Daten immer in einem Blob speichert, während derVARCHAR(MAX)
Typ versucht, die Daten direkt in der Zeile zu speichern, es sei denn, er überschreitet die 8k-Beschränkung und speichert sie zu diesem Zeitpunkt in einem Blob.Die Verwendung der LIKE-Anweisung ist zwischen den beiden Datentypen identisch. Die zusätzliche Funktionalität
VARCHAR(MAX)
besteht darin, dass es auch mit=
undGROUP BY
wie jede andereVARCHAR
Spalte verwendet werden kann. Wenn Sie jedoch über viele Daten verfügen, treten bei diesen Methoden große Leistungsprobleme auf.In Bezug darauf, ob Sie
LIKE
für die Suche verwenden sollten oder ob Sie die Volltextindizierung und verwenden solltenCONTAINS
. Diese Frage ist unabhängig vonVARCHAR(MAX)
oder gleichTEXT
.Wenn Sie große Textmengen suchen und die Leistung entscheidend ist, sollten Sie einen Volltextindex verwenden .
LIKE
ist einfacher zu implementieren und eignet sich häufig für kleine Datenmengen, weist jedoch aufgrund der Unfähigkeit, einen Index zu verwenden, eine extrem schlechte Leistung bei großen Datenmengen auf.quelle
Für großen Text, der Volltextindex ist viel schneller. Sie können aber auch einen Volltextindex erstellen
varchar(max)
.quelle
Sie können ein Textfeld nicht durchsuchen, ohne es von Text in Varchar zu konvertieren.
Dies gibt einen Fehler:
Wobei dies nicht:
Interessanterweise
LIKE
funktioniert immer noch, dhquelle
varchar(n)
oder verwenden solltentext
, und über diese Antwort hinwegkommen . Denken Sie in einem professionellen Umfeld, dass das Streiten mit vagen Aussagen zur Lösung des Problems beiträgt? Alle Beiträge auf StackOverflow sollen von Tausenden von Menschen gesehen werden, die Konsequenzen haben!TEXT
undVarChar(MAX)
sind Nicht-Unicode-Zeichen mit großer variabler Länge, die maximal 2147483647 Nicht-Unicode-Zeichen speichern können (dh die maximale Speicherkapazität beträgt: 2 GB).Wie pro MSDN Link schlägt Microsoft mit dem Textdatentyp zu vermeiden , und es wird in zukünftigen Versionen von SQL Server entfernt. Varchar (Max) ist der vorgeschlagene Datentyp zum Speichern der großen Zeichenfolgenwerte anstelle des Textdatentyps.
Daten einer
Text
Typspalte werden außerhalb der Zeile auf separaten LOB-Datenseiten gespeichert. Die Zeile auf der Tabellendatenseite enthält nur einen 16-Byte-Zeiger auf die LOB-Datenseite, auf der die tatsächlichen Daten vorhanden sind. Während Daten einerVarchar(max)
Typspalte in einer Zeile gespeichert werden, wenn sie kleiner oder gleich 8000 Byte sind. Wenn der Varchar (max) -Spaltenwert die 8000 Bytes überschreitet, wird der Varchar (max) -Spaltenwert in separaten LOB-Datenseiten gespeichert, und die Zeile enthält nur einen 16-Byte-Zeiger auf die LOB-Datenseite, auf der die tatsächlichen Daten vorhanden sind. SoIn-Row
Varchar (Max) ist gut für die Suche und den Abruf.Einige der Zeichenfolgenfunktionen, Operatoren oder Konstrukte funktionieren nicht in der Spalte Texttyp, aber in der Spalte VarChar (Max).
=
Entspricht dem Operator in der Spalte vom Typ VarChar (Max)Gruppieren nach Klausel in der Spalte vom Typ VarChar (Max)
Da wir wissen, dass die Spaltenwerte vom Typ VarChar (Max) nur dann außerhalb der Zeile gespeichert werden, wenn die Länge des darin zu speichernden Werts größer als 8000 Byte ist oder nicht genügend Speicherplatz in der Zeile vorhanden ist, wird sie sonst gespeichert es in Reihe. Wenn also die meisten in der Spalte VarChar (Max) gespeicherten Werte groß und außerhalb der Zeile gespeichert sind, ähnelt das Datenabrufverhalten fast dem der Spalte Texttyp.
Wenn jedoch die meisten in Spalten vom Typ VarChar (Max) gespeicherten Werte klein genug sind, um in Zeilen gespeichert zu werden. Das Abrufen der Daten, in denen LOB-Spalten nicht enthalten sind, erfordert dann, dass mehr Datenseiten gelesen werden, da der LOB-Spaltenwert in derselben Datenseite in Zeile gespeichert wird, in der die Nicht-LOB-Spaltenwerte gespeichert sind. Wenn die Auswahlabfrage jedoch eine LOB-Spalte enthält, muss im Vergleich zu den Spalten vom Typ Text weniger Seiten für den Datenabruf gelesen werden.
Fazit
Verwenden Sie den
VarChar(MAX)
Datentyp anstelleTEXT
einer guten Leistung.Quelle
quelle
Wenn Sie MS Access verwenden (insbesondere ältere Versionen wie 2003), müssen Sie den
TEXT
Datentyp unter SQL Server verwenden, da MS Access in Access kein Memofeld erkenntnvarchar(MAX)
, währendTEXT
es als Memofeld erkannt wird.quelle