Acabei de ler que o VARCHAR(MAX)
tipo de dados (que pode armazenar perto de 2 GB de dados de caracteres) é a substituição recomendada para o TEXT
tipo de dados nas versões SQL Server 2005 e Next SQL SERVER.
Se eu quiser procurar dentro de uma coluna qualquer string, qual operação é mais rápida?
Usando uma
LIKE
cláusula the contra umaVARCHAR(MAX)
coluna?WHERE COL1 LIKE '%search string%'
Usando a
TEXT
coluna, coloque um Índice / Catálogo de Texto Completo nessa coluna e pesquise usando aCONTAINS
cláusula?WHERE CONTAINS (Col1, 'MyToken')
sql-server
performance
text
varchar
sql-types
user85116
fonte
fonte
TEXT
eNTEXT
(eIMAGE
) estão obsoletos.Respostas:
O
VARCHAR(MAX)
tipo é um substituto paraTEXT
. A diferença básica é que umTEXT
tipo sempre armazena os dados em um blob, enquanto oVARCHAR(MAX)
tipo tenta armazenar os dados diretamente na linha, a menos que exceda a limitação de 8k e nesse ponto os armazena em um blob.O uso da instrução LIKE é idêntico entre os dois tipos de dados. A funcionalidade adicional
VARCHAR(MAX)
fornece a você que também pode ser usada com=
eGROUP BY
como qualquer outraVARCHAR
coluna. No entanto, se você tiver muitos dados, terá um enorme problema de desempenho usando esses métodos.Em relação a se você deve usar
LIKE
para pesquisar ou se deve usar a Indexação de Texto Completo eCONTAINS
. Esta pergunta é a mesma, independentemente deVARCHAR(MAX)
ouTEXT
.Se você estiver pesquisando grandes quantidades de texto e o desempenho for fundamental, use um Índice de Texto Completo .
LIKE
é mais simples de implementar e geralmente é adequado para pequenas quantidades de dados, mas apresenta desempenho extremamente ruim com dados grandes devido à sua incapacidade de usar um índice.fonte
Para texto grande, o índice de texto completo é muito mais rápido. Mas você também pode indexar o texto completo
varchar(max)
.fonte
Você não pode procurar um campo de texto sem convertê-lo de texto para varchar.
Isso dá um erro:
Onde isso não acontece:
Curiosamente,
LIKE
ainda funciona, ou seja,fonte
varchar(n)
outext
e supere essa resposta. Você acha que, em um ambiente profissional, argumentar com declarações vagas ajudará a resolver o problema? Todos os posts no StackOverflow são para serem vistos por milhares de pessoas, agem com consequências!TEXT
eVarChar(MAX)
são do tipo de dados de caracteres de tamanho variável grande não Unicode, que podem armazenar no máximo 2147483647 caracteres não Unicode (ou seja, a capacidade máxima de armazenamento é de 2 GB).De acordo com o link do MSDN, a Microsoft sugere evitar o uso do tipo de dados Texto e ele será removido em versões futuras do Sql Server. Varchar (Máx.) É o tipo de dados sugerido para armazenar os valores de cadeia grande em vez do tipo de dados Texto.
Os dados de uma
Text
coluna de tipo são armazenados fora da linha em páginas de dados LOB separadas. A linha na página de dados da tabela terá apenas um ponteiro de 16 bytes para a página de dados LOB em que os dados reais estão presentes. Enquanto aVarchar(max)
coluna Dados de um tipo é armazenada em linha, se for menor ou igual a 8000 bytes. Se o valor da coluna Varchar (max) estiver cruzando os 8000 bytes, o valor da coluna Varchar (max) será armazenado em páginas de dados LOB separadas e a linha terá apenas um ponteiro de 16 bytes para a página de dados LOB em que os dados reais estão presentes. Portanto, oIn-Row
Varchar (Max) é bom para pesquisas e recuperação.Algumas das funções de string, operadores ou construções que não funcionam na coluna Tipo de texto, mas funcionam na coluna do tipo VarChar (Max).
=
Igual ao Operador na coluna do tipo VarChar (Max)Agrupar por cláusula na coluna do tipo VarChar (Max)
Como sabemos que os valores da coluna do tipo VarChar (Max) são armazenados fora da linha somente se o comprimento do valor a ser armazenado for maior que 8000 bytes ou se não houver espaço suficiente na linha, caso contrário, ele armazenará em linha. Portanto, se a maioria dos valores armazenados na coluna VarChar (Max) forem grandes e armazenados fora da linha, o comportamento de recuperação de dados será quase semelhante ao da coluna Tipo de texto.
Mas se a maioria dos valores armazenados nas colunas do tipo VarChar (Max) forem pequenos o suficiente para armazenar em linha. A recuperação dos dados em que as colunas LOB não estão incluídas requer o maior número de páginas de dados a serem lidas, pois o valor da coluna LOB é armazenado em linha na mesma página de dados em que os valores das colunas não LOB são armazenados. Mas se a consulta de seleção incluir a coluna LOB, será necessário um número menor de páginas para ler para a recuperação de dados em comparação com as colunas do tipo Texto.
Conclusão
Use o
VarChar(MAX)
tipo de dados e nãoTEXT
para obter um bom desempenho.Fonte
fonte
Se você estiver usando o MS Access (especialmente versões mais antigas como 2003), será forçado a usar o
TEXT
tipo de dados no SQL Server, pois o MS Access não reconhecenvarchar(MAX)
como um campo Memorando no Access, enquantoTEXT
é reconhecido como um campo Memorando.fonte