Frage

Ich habe gerade gelesen, dass der VARCHAR(MAX) Datentyp (die Nähe von 2 GB char Daten speichern kann) ist der empfohlene Ersatz für den TEXT Datentyp in SQL Server 2005 und nächsten SQL Server-Versionen.

Wenn ich will, innerhalb einer Spalte für jede Zeichenfolge suchen, die den Betrieb ist schneller?

  1. eine der LIKE Klausel gegen eine VARCHAR(MAX) Spalte?

    WHERE COL1 LIKE '%search string%'

  2. Mit der TEXT Spalte und legt einen Volltextindex / Katalog auf dieser Spalte und dann sucht die CONTAINS-Klausel?

    WHERE CONTAINS (Col1, 'MyToken')

War es hilfreich?

Lösung

Der VARCHAR(MAX) Typ ist ein Ersatz für TEXT. Der grundlegende Unterschied ist, dass ein TEXT Typ immer die Daten in einem BLOB-Speicher wird während der VARCHAR(MAX) Typ, die Daten direkt in der Zeile zu speichern, wird versuchen, es sei denn, die 8k Begrenzung und an diesem Punkt übersteigt sie speichert sie in einem BLOB.

die LIKE-Anweisung ist identisch zwischen den beiden Datentypen. Die zusätzliche Funktionalität VARCHAR(MAX) gibt Ihnen ist, dass es auch mit = und GROUP BY als jede andere VARCHAR Spalte sein kann verwendet werden. Wenn Sie jedoch eine Menge von Daten zu tun haben, werden Sie ein enormes Performance-Problem mit diesen Methoden haben.

In Bezug auf, wenn Sie LIKE zur Suche verwendet werden sollen, oder wenn Sie verwenden sollen, Volltextindizierung und CONTAINS. Diese Frage ist die gleiche, unabhängig von VARCHAR(MAX) oder TEXT.

Wenn Sie große Mengen von Text suchen und Leistung ist der Schlüssel, dann sollten Sie verwenden ein Volltextindex .

LIKE ist einfacher zu implementieren und ist oft geeignet für kleine Datenmengen, aber es hat eine extrem schlechte Performance bei großen Daten aufgrund seiner Unfähigkeit, einen Index zu verwenden.

Andere Tipps

Für großen Text, den Volltextindex ist viel schneller. Aber Sie können Volltextindex varchar(max)as gut.

Sie können nicht ein Textfeld suchen, ohne sie von Text zu varchar zu konvertieren.

declare @table table (a text)
insert into @table values ('a')
insert into @table values ('a')
insert into @table values ('b')
insert into @table values ('c')
insert into @table values ('d')


select *
from @table
where a ='a'

Das einen Fehler geben:

The data types text and varchar are incompatible in the equal to operator.

Wheras dies nicht:

declare @table table (a varchar(max))

Interessanterweise LIKE noch funktioniert, d.

where a like '%a%'
  • Grund Definition

TEXT VarChar(MAX) und sind nicht-Unicode großer Variable Length Zeichendatentyp, der maximal 2147483647 Non-Unicode-Zeichen speichern kann (d.h. maximale Speicherkapazität ist: 2 GB)

.
  • , welche zu benutzen?

Wie pro MSDN Link Microsoft schlägt vor, das zu vermeiden, mit Text-Datentyp und es wird in zukünftigen Versionen von SQL Server entfernt. Varchar (Max) ist der vorgeschlagene Datentyp für die großen String-Werte anstelle von Text-Datentyp zu speichern.

  • In-Row oder Out-of-Row Lagerung

Daten einer Text Typ Spalte wird out-of-Zeile in einer separaten LOB Datenseite gespeichert. Die Zeile in der Tabelle Datenseite wird nur ein 16-Byte-Zeiger auf die LOB Datenseite, wo die eigentlichen Daten vorhanden ist. Während die Daten einer Spalte Varchar(max) Typ in-Zeile gespeichert wird, wenn sie kleiner oder gleich 8000 Byte. Wenn Varchar (max) Spaltenwert der 8000 Bytes überquert dann VARCHAR (max) Spaltenwert in einer separaten LOB Datenseite und Zeile gespeichert wird, wird nur einen 16-Byte-Zeiger auf die LOB Datenseite, wo die eigentlichen Daten vorhanden sind. So In-Row Varchar (Max) ist gut für die Suche und den Abruf.

  • Unterstützt / Nicht unterstützte Funktionalitäten

Einige der String-Funktionen, Operatoren oder die Konstrukte, die nicht auf dem Texttyp Spalte funktioniert, aber sie funktionieren auf VarChar (Max) Typ Spalte.

  1. = Gleich-Operator auf VarChar (Max) Typ Spalte
  2. Gruppe durch Klausel über VarChar (Max) Typ Spalte

    • System IO Überlegungen

Wie wir wissen, dass die VarChar (Max) Typ sind Spaltenwerte gespeichert sind out-of-Zeile nur, wenn die Länge des Wertes gespeichert werden darin mehr als 8000 Bytes ist, oder es gibt nicht genug Platz in der Reihe, sonst es speichert es in-Reihe. Also, wenn die meisten der gespeicherten Werte in der varchar (max) Spalt sind groß und gespeichert out-of-Reihe, das Datenabrufverhalten wird fast ähnlich der, dass die Texttyp-Spalte.

Aber wenn die meisten der gespeicherten Werte in VARCHAR (Max) Typ Spalten sind klein genug, um in-Reihe zu speichern. Dann Abruf der Daten, bei denen LOB-Spalten nicht enthalten sind, erfordert die mehr Anzahl der Datenseiten zu lesen, wie die LOB-Spalte Wert in-Reihe in der gleichen Datenseite gespeichert wird, wo die Nicht-LOB-Spaltenwerte gespeichert sind. Aber wenn die Auswahlabfrage LOB enthält Spalte dann erfordert es eine geringere Anzahl von Seiten für den Datenabruf im Vergleich zu dem Texttyp Spalten zu lesen.

Fazit

Mit VarChar(MAX) Datentyp anstatt TEXT für eine gute Leistung.

Quelle

Bei der Verwendung von MS Access (vor allem ältere Versionen wie 2003) Sie sind gezwungen, TEXT Datentyp auf SQL Server zu verwenden, wie MS Access nicht nvarchar(MAX) als Memo-Feld in Access erkennen, während TEXT erkannt wird als ein Memo-Feld.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top