it-swarm.com.de

Verwenden von varchar (MAX) vs TEXT unter SQL Server

Ich habe gerade gelesen, dass der Datentyp VARCHAR(MAX) (der fast 2 GB Zeichen speichern kann) der empfohlene Ersatz für den Datentyp TEXT in SQL Server 2005- und Next SQL SERVER-Versionen ist.

Welche Operation ist schneller, wenn ich in einer Spalte nach einer Zeichenfolge suchen möchte?

  1. Verwenden Sie die LIKE -Klausel für eine VARCHAR(MAX) -Spalte?

    WHERE COL1 LIKE '%search string%'

  2. Verwenden Sie die Spalte TEXT und setzen Sie ein Volltextindex/Katalog in diese Spalte, und suchen Sie dann mit der Klausel CONTAINS?

    WHERE CONTAINS (Col1, 'MyToken')

184
user85116

Der Typ VARCHAR(MAX) ist ein Ersatz für TEXT. Der grundlegende Unterschied besteht darin, dass ein TEXT -Typ die Daten immer in einem Blob speichert, wohingegen der VARCHAR(MAX) -Typ versucht, die Daten direkt in der Zeile zu speichern, es sei denn, er überschreitet die 8k-Beschränkung und das noch point es speichert es in einem Blob.

Die Verwendung der LIKE-Anweisung ist für beide Datentypen identisch. Die zusätzliche Funktionalität von VARCHAR(MAX) besteht darin, dass es auch mit = Und GROUP BY Verwendet werden kann, wie jede andere VARCHAR Spalte. Wenn Sie jedoch über viele Daten verfügen, treten mit diesen Methoden erhebliche Leistungsprobleme auf.

In Bezug darauf, ob Sie LIKE für die Suche verwenden sollten, oder ob Sie Volltextindizierung und CONTAINS verwenden sollten. Diese Frage ist unabhängig von VARCHAR(MAX) oder TEXT gleich.

Wenn Sie große Textmengen durchsuchen 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 äußerst schlechte Leistung bei großen Datenmengen auf.

298
Robin Day

Bei großem Text ist Volltextindexviel schneller. Sie können aber auch Volltextindexvarchar(max).

17
Joel Coehoorn

Sie können ein Textfeld nicht durchsuchen, ohne es von Text in 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'

Dies gibt einen Fehler:

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

Wobei dies nicht der Fall ist:

declare @table table (a varchar(max))

Interessanterweise funktioniert LIKE immer noch, d.h.

where a like '%a%'
15
DForck42
  • Grundlegende Definition

TEXT und VarChar(MAX) sind Nicht-Unicode-Zeichendatentypen mit variabler Länge, in denen maximal 2147483647 Nicht-Unicode-Zeichen gespeichert werden können (d. h. die maximale Speicherkapazität beträgt 2 GB).

  • Welches verwenden?

Gemäß MSDN-Link schlägt Microsoft vor, die Verwendung des Text-Datentyps zu vermeiden, und dieser wird in zukünftigen Versionen von SQL Server entfernt. Varchar (Max) ist der vorgeschlagene Datentyp zum Speichern der großen Zeichenfolgenwerte anstelle des Datentyps Text.

  • In-Row- oder Out-of-Row-Speicher

Daten einer Spalte vom Typ Text werden außerhalb der Zeile in separaten LOB-Datenseiten gespeichert. Die Zeile in der Tabellendatenseite enthält nur einen 16-Byte-Zeiger auf die LOB-Datenseite, auf der die tatsächlichen Daten vorhanden sind. While Daten einer Spalte vom Typ Varchar(max) werden zeilenweise gespeichert, wenn sie kleiner oder gleich 8000 Byte sind. Wenn der Varchar (max) -Spaltenwert die 8000 Bytes überschreitet, wird der Varchar (max) -Spaltenwert in einer separaten LOB-Datenseite gespeichert, und die Zeile enthält nur einen 16-Byte-Zeiger auf die LOB-Datenseite, auf der die tatsächlichen Daten vorhanden sind. In-Row Varchar (Max) ist also gut zum Suchen und Abrufen.

  • Unterstützte/nicht unterstützte Funktionen

Einige der Zeichenfolgenfunktionen, Operatoren oder Konstrukte, die in der Spalte "Texttyp" nicht funktionieren, jedoch in der Spalte "VarChar (Max)".

  1. = Entspricht dem Operator in der Spalte vom Typ VarChar (Max)
  2. Gruppieren nach Klausel für Spalte vom Typ VarChar (Max)

    • System IO Überlegungen

Da wir wissen, dass die Spaltenwerte vom Typ VarChar (Max) nur außerhalb der Zeile gespeichert werden, wenn die Länge des darin zu speichernden Werts 8000 Byte überschreitet oder nicht genügend Speicherplatz in der Zeile vorhanden ist, wird ansonsten der Wert 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 Werte, die in Spalten des Typs VarChar (Max) gespeichert sind, klein genug sind, um sie in einer Zeile zu speichern. Zum Abrufen der Daten, in denen LOB-Spalten nicht enthalten sind, muss die Anzahl der zu lesenden Datenseiten erhöht werden, da der LOB-Spaltenwert zeilenweise auf derselben Datenseite gespeichert wird, auf der die Nicht-LOB-Spaltenwerte gespeichert sind. Wenn die Auswahlabfrage jedoch eine LOB-Spalte enthält, ist für das Abrufen der Daten weniger Seiten erforderlich als für die Spalten vom Typ Text.

Fazit

Verwenden Sie für eine gute Leistung den Datentyp VarChar(MAX) anstelle von TEXT.

Quelle

8
Somnath Muluk

Wenn Sie MS Access (insbesondere ältere Versionen wie 2003) verwenden, müssen Sie den Datentyp TEXT auf SQL Server verwenden, da MS Access nvarchar(MAX) nicht als Memofeld erkennt in Access, wobei TEXT als Memofeld erkannt wird.

4