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?

  1. Stai usando una clausola LIKE contro una colonna VARCHAR (MAX) ?

    DOVE COL1 MI PIACE '% search string%'

  2. Usando la colonna TEXT e inserisci un Indice di testo completo / Catalogo su questa colonna, quindi cerca usando il CONTAINS clausola?

    DOVE CONTIENE (Col1, 'MyToken')

È stato utile?

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

  1. = Uguale a Operatore nella colonna di tipo VarChar (Max)
  2. 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.

Fonte

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top