Utilizzo di varchar (MAX) vs TEXT su SQL Server
-
08-07-2019 - |
Domanda
Ho appena letto che il tipo di dati VARCHAR (MAX)
(che può contenere quasi 2 GB di dati char) è la sostituzione consigliata per il tipo di dati TEXT
in SQL Server 2005 e successive versioni di SQL SERVER.
Se voglio cercare una stringa all'interno di una colonna, quale operazione è più veloce?
-
Stai usando una clausola
LIKE
contro una colonnaVARCHAR (MAX)
?DOVE COL1 MI PIACE '% search string%'
-
Usando la colonna
TEXT
e inserisci un Indice di testo completo / Catalogo su questa colonna, quindi cerca usando ilCONTAINS clausola? DOVE CONTIENE (Col1, 'MyToken')
Soluzione
Il tipo VARCHAR (MAX)
è un sostituto di TEXT
. La differenza di base è che un tipo TEXT
memorizzerà sempre i dati in un BLOB mentre il tipo VARCHAR (MAX)
tenterà di archiviare i dati direttamente nella riga a meno che non superi la limitazione 8k ea quel punto la memorizza in un BLOB.
L'uso dell'istruzione LIKE è identico tra i due tipi di dati. La funzionalità aggiuntiva fornita da VARCHAR (MAX)
è che può essere utilizzata anche con =
e GROUP BY
come qualsiasi altro VARCHAR
può essere. Tuttavia, se disponi di molti dati, avrai questi enormi problemi di prestazioni utilizzando questi metodi.
Per sapere se dovresti usare LIKE
per la ricerca, o se dovresti usare Indicizzazione di testo completo e CONTAINS
. Questa domanda è la stessa indipendentemente da VARCHAR (MAX)
o TEXT
.
Se stai cercando grandi quantità di testo e le prestazioni sono fondamentali, dovresti utilizzare un Indice di testo completo .
LIKE
è più semplice da implementare ed è spesso adatto a piccole quantità di dati, ma ha prestazioni estremamente scarse con dati di grandi dimensioni a causa della sua incapacità di utilizzare un indice.
Altri suggerimenti
Per il testo di grandi dimensioni, l ' indice di testo completo è molto più veloce. Ma puoi anche indice di testo completo varchar (max)
.
Non puoi cercare un campo di testo senza convertirlo da testo in varchar.
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'
Questo dà un errore:
The data types text and varchar are incompatible in the equal to operator.
Dove questo non accade:
declare @table table (a varchar(max))
È interessante notare che LIKE
funziona ancora, ad esempio
where a like '%a%'
- Definizione di base
TEXT
e VarChar (MAX)
sono tipi di dati di carattere di lunghezza variabile non Unicode di grandi dimensioni, che possono contenere un massimo di 2147483647 caratteri non Unicode (ovvero la capacità massima di archiviazione è : 2 GB).
- Quale utilizzare?
Secondo collegamento MSDN Microsoft suggerisce di evitare di utilizzare il Tipo di dati di testo e verrà rimosso in una versione futura di SQL Server. Varchar (Max) è il tipo di dati suggerito per la memorizzazione dei valori di stringa di grandi dimensioni invece del tipo di dati di testo.
- Archiviazione in fila o fuori fila
I dati di una colonna di tipo Text
sono archiviati fuori riga in pagine di dati LOB separate. La riga nella pagina dei dati della tabella avrà solo un puntatore di 16 byte alla pagina dei dati LOB in cui sono presenti i dati effettivi. Mentre i dati di una colonna di tipo Varchar (max)
sono memorizzati in fila se è inferiore o uguale a 8000 byte. Se il valore della colonna Varchar (max) attraversa gli 8000 byte, il valore della colonna Varchar (max) viene archiviato in pagine di dati LOB separate e la riga avrà solo un puntatore di 16 byte alla pagina di dati LOB in cui sono presenti i dati effettivi. Quindi In-Row
Varchar (Max) è buono per le ricerche e il recupero.
- Funzionalità supportate / non supportate
Alcune funzioni stringa, operatori o costrutti che non funzionano sulla colonna Tipo di testo, ma funzionano sulla colonna Tipo VarChar (Max).
-
=
Uguale a Operatore nella colonna di tipo VarChar (Max) -
Raggruppa per clausola nella colonna di tipo VarChar (Max)
- Considerazioni sull'IO del sistema
Come sappiamo che i valori di colonna del tipo VarChar (Max) sono memorizzati fuori riga solo se la lunghezza del valore da archiviare è maggiore di 8000 byte o non c'è abbastanza spazio nella riga, altrimenti lo memorizzerà in fila. Quindi, se la maggior parte dei valori memorizzati nella colonna VarChar (Max) sono grandi e archiviati fuori riga, il comportamento di recupero dei dati sarà quasi simile a quello della colonna Tipo di testo.
Ma se la maggior parte dei valori memorizzati nelle colonne di tipo VarChar (Max) sono abbastanza piccole da essere archiviate in fila. Quindi il recupero dei dati in cui le colonne LOB non sono incluse richiede il numero maggiore di pagine di dati da leggere poiché il valore della colonna LOB viene archiviato in fila nella stessa pagina di dati in cui sono memorizzati i valori delle colonne non LOB. Ma se la query selezionata include la colonna LOB, richiede un numero inferiore di pagine da leggere per il recupero dei dati rispetto alle colonne del tipo di testo.
Conclusione
Utilizza il tipo di dati VarChar (MAX)
anziché TEXT
per ottenere buone prestazioni.
Se si utilizza MS Access (in particolare versioni precedenti come 2003), si è costretti a utilizzare il tipo di dati TEXT
su SQL Server poiché MS Access non riconosce nvarchar (MAX )
come campo Memo in Access, mentre TEXT
è riconosciuto come campo Memo.