2009-05-07 12 views
164

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

Wenn ich innerhalb einer Spalte nach einer beliebigen Zeichenfolge suchen möchte, welche Operation ist schneller?

  1. Mit einem 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')

+1

Dieser Beitrag ist auch hilfreich: http://stackoverflow.com/questions/564755/sql-server-text-type-vs-varchar-data-type – Jake

+21

Die wichtigste Erwähnung in diesem Beitrag ist ein Link zu [MSDN Dokumentation] (http://msdn.microsoft.com/en-us/library/ms187993.aspx) zeigt, dass 'TEXT' und' NTEXT' (und 'IMAGE') veraltet sind. – Brian

+0

Schauen Sie sich den Link an: http://StackOverflow.com/Q/28980502/1805776 – vicky

Antwort

271

Die VARCHAR(MAX) t Ype ist ein Ersatz für TEXT. Der grundlegende Unterschied besteht darin, dass ein Typ TEXT die Daten immer in einem Blob speichert, während der Typ VARCHAR(MAX) versucht, die Daten direkt in der Zeile zu speichern, es sei denn, sie überschreitet die 8k-Begrenzung und speichert sie dann in einem Blob.

Die Verwendung der LIKE-Anweisung ist zwischen den beiden Datentypen identisch. Die zusätzliche Funktionalität VARCHAR(MAX) gibt Ihnen, dass es auch mit = und wie jede andere VARCHAR Spalte verwendet werden kann. Wenn Sie jedoch viele Daten haben, haben Sie mit diesen Methoden ein großes Leistungsproblem.

In Bezug auf, wenn Sie LIKE verwenden sollten zu suchen, oder wenn Sie Volltextindizierung und CONTAINS verwenden sollten. Diese Frage ist unabhängig von VARCHAR(MAX) oder TEXT.

Wenn Sie große Mengen an Text suchen und die Leistung ist der Schlüssel, dann sollten Sie einen Volltext-Index verwenden.

LIKE ist einfacher zu implementieren und ist oft für kleine Datenmengen geeignet, hat jedoch aufgrund der Unfähigkeit, einen Index zu verwenden, eine extrem schlechte Leistung mit großen Daten.

+10

Ich wusste nicht, dass es in der Seite bei 8k speichern würde, und aus der Seite, wenn größer. Sehr cool. – Brain2000

+3

Ihre letzte Zeile ist teilweise falsch. LIKE kann den Index NUR verwenden, wenn der Platzhalter am Anfang der Zeichenfolge steht, nach der gesucht wird. – SouravA

+0

Ist es kein Problem, ein Feld von einem Text zu einem Varchar (max) von einer vorhandenen Tabelle mit Daten zu ändern? – user1531040

17

Für große Text, der Volltextindex ist viel schneller. Aber Sie können auch Volltext-Indexvarchar(max).

14

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 ein Fehler geben:

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

Wheras dies nicht der Fall ist: Interessanter

declare @table table (a varchar(max)) 

, LIKE funktioniert immer noch, das heißt

where a like '%a%' 
+9

+1 nur für das Sagen zufälliger Downvote! Es macht mich verrückt, wenn Leute mich ablehnen und keinen Kommentar haben, sie müssen wirklich ein Leben haben. –

+2

Der Grund, warum er Downvotes bekam, ist, dass ** das, woran ich mich erinnere, von Dingen, die ich zu tun hatte **, kein gültiges Argument ist, das man bei der Beantwortung einer technischen Frage mitbringen sollte. Denken Sie an Leute (wie ich gerade), die versuchen herauszufinden, warum sollten wir 'varchar (n)' oder 'text' verwenden und über diese Antwort hinwegkommen. Glauben Sie, dass in einer professionellen Umgebung das Argumentieren mit vagen Aussagen zur Lösung des Problems beitragen wird? Alle Beiträge auf StackOverflow sollen von Tausenden von Menschen gesehen werden, handeln in Konsequenzen! –

+2

@Zeratops lol, diese Antwort ist 6 Jahre alt, ich war ziemlich grün zu so, als ich es schrieb. Ich habe die Formulierung aufgeräumt, um mehr auf den Punkt zu kommen. – DForck42

4

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 in Access nicht nvarchar(MAX) als Memo-Feld erkennen, während TEXT als Memo-Feld erkannt wird .

7
  • grundlegende Definition

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

  • Welcher zu verwenden?

Per MSDN link Microfost schlagen den Text-Datentyp zu vermeiden, mit 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 Datentyps Text.

  • 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 Tabellendatenseite hat nur einen 16-Byte-Zeiger auf die LOB-Datenseite, auf der die tatsächlichen Daten vorhanden sind. Daten einer Varchar(max) Spalte werden in Reihe gespeichert, wenn sie kleiner oder gleich 8000 Byte ist. Wenn der Varchar (max) -Spaltenwert die 8000 Bytes kreuzt, wird der Varchar (max) -Spaltenwert in separaten LOB-Datenseiten gespeichert und die Zeile hat nur einen 16-Byte-Zeiger auf die LOB-Datenseite, auf der die tatsächlichen Daten vorhanden sind. So In-Row Varchar (Max) ist gut für Suchen und Abrufen. Typ

  • 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) Spalte .

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

    • -System IO Überlegungen

Wie wir wissen, sind die VarChar (Max) Typ Spalte Werte Nur wenn die Länge des Werts, der darin gespeichert werden soll, größer als 8000 Byte ist oder nicht genügend Platz in der Zeile ist, wird sie außerhalb der Reihe gespeichert, andernfalls wird sie in Reihe gespeichert.Wenn also die meisten in der VarChar (Max) -Spalte gespeicherten Werte groß sind und außerhalb der Reihe gespeichert werden, ähnelt das Datenwiederherstellungsverhalten fast dem der Spalte Texttyp.

Wenn jedoch die meisten in VarChar (Max) -Typspalten gespeicherten Werte klein genug sind, um in Reihe gespeichert zu werden. Dann erfordert das Abrufen der Daten, bei denen LOB-Spalten nicht enthalten sind, die größere Anzahl von zu lesenden Datenseiten, da der Wert der LOB-Spalte in der gleichen Datenseite gespeichert wird, in der die Nicht-LOB-Spaltenwerte gespeichert sind. Wenn die SELECT-Abfrage jedoch die LOB-Spalte enthält, benötigt sie im Vergleich zu den Spalten vom Typ Text weniger Seiten zum Lesen.

Fazit

Verwenden VarChar(MAX) Datentyp statt TEXT für eine gute Leistung.

Source