Pergunta

Acabei de ler que o tipo de dados VARCHAR(MAX) (que pode armazenar perto de 2 GB de dados de char) é a substituição recomendada para o tipo de dados TEXT no SQL Server 2005 e Server versões Próxima SQL.

Se eu quiser pesquisar em uma coluna para qualquer cadeia, cuja operação é mais rápido?

  1. Usando uma cláusula LIKE contra uma coluna VARCHAR(MAX)?

    WHERE COL1 LIKE '%search string%'

  2. Usando a coluna TEXT e colocar um índice de texto completo / Catálogo sobre esta coluna, e depois pesquisar usando a cláusula CONTAINS?

    WHERE CONTAINS (Col1, 'MyToken')

Foi útil?

Solução

O tipo VARCHAR(MAX) é um substituto para TEXT. A diferença básica é que um tipo TEXT sempre armazenar os dados em uma bolha enquanto que o tipo VARCHAR(MAX) tentará armazenar os dados directamente na linha, a menos que exceda a limitação 8k e, nesse momento, armazena-lo em uma bolha.

Usando a instrução LIKE é idêntica entre os dois tipos de dados. O VARCHAR(MAX) funcionalidade adicional dá-lhe é que ele é também pode ser usado com = e GROUP BY como qualquer outra coluna VARCHAR pode ser. No entanto, se você tem um monte de dados, você terá um problema de desempenho enorme usando esses métodos.

Em relação a se você deve usar LIKE de pesquisa, ou se você deve usar indexação de texto completo e CONTAINS. Esta questão é o mesmo, independentemente do VARCHAR(MAX) ou TEXT.

Se você está procurando grandes quantidades de texto e desempenho é a chave, então você deve usar um índice de texto completo .

LIKE é simples de implementar e muitas vezes é adequado para pequenas quantidades de dados, mas tem extremamente pobre desempenho com dados de grandes dimensões, devido à sua incapacidade de usar um índice.

Outras dicas

Para texto grande, o índice de texto completo é muito mais rápido. Mas você pode índice de texto completo varchar(max)as bem.

Você não pode procurar um campo de texto sem convertê-lo a partir de texto para 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'

Isto dá um erro:

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

wheras isso não faz:

declare @table table (a varchar(max))

Curiosamente, LIKE ainda funciona, i.

where a like '%a%'
  • Definição básico

TEXT e VarChar(MAX) são não-Unicode grande tipo de dados de caracteres de comprimento variável, que pode armazenar máximo de caracteres 2147483647 não Unicode (isto é, capacidade de armazenamento máximo é: 2 GB).

  • qual usar?

De acordo com ligação MSDN Microsoft está sugerindo para evitar o uso do texto tipo de dados e será removido em uma futura versão do SQL Server. Varchar (Max) é o tipo de dados sugerido para armazenar os grandes valores de cadeia em vez do tipo de dados de texto.

  • In-Row ou Out-of-Row armazenamento

Os dados de uma coluna do tipo Text é armazenada fora-de-linha em uma páginas de dados LOB separadas. A linha na página de dados de tabela terá apenas um ponteiro de 16 bytes para a página de dados LOB onde os dados reais está presente. Embora os dados de uma coluna de tipo Varchar(max) é armazenado em-linha, se for menor ou igual a 8000 bytes. Se VARCHAR (max) o valor da coluna está a atravessar as 8000 bytes, em seguida, o valor de coluna (max) VARCHAR é armazenados em um páginas de dados LOB separadas e linha terá apenas um ponteiro de 16 bytes para a página de dados LOB onde os dados reais está presente. Então In-Row Varchar (Max) é bom para buscas e recuperação.

  • suportados / não suportados Funcionalidades

Algumas das funções de cadeia, operadores ou as construções que não funciona na coluna tipo de texto, mas eles não funcionam em VarChar (Max) coluna tipo.

  1. = Igual Operador em varchar (max) tipo de coluna
  2. Grupo pela cláusula em coluna VARCHAR (Max) Tipo

    • Considerações Sistema IO

Como sabemos que os valores da coluna do tipo varchar (max) são armazenados fora de linha apenas se o comprimento do valor a ser armazenado nele é maior do que 8000 bytes ou não há espaço suficiente na linha, caso contrário, ele irá armazená-lo em-linha. Então, se a maioria dos valores armazenados na coluna varchar (max) são grandes e armazenados fora-de-linha, o comportamento de recuperação de dados vai quase semelhante ao que da coluna tipo de texto.

Mas se a maioria dos valores armazenados nas colunas do tipo varchar (max) são pequenos o suficiente para armazenar em-linha. Em seguida, a recuperação dos dados, onde colunas LOB não estão incluídos exige o maior número de páginas de dados para ler como o valor da coluna LOB é armazenado em-linha na mesma página de dados onde os valores da coluna não-LOB são armazenados. Mas, se a consulta de seleção inclui coluna LOB, em seguida, ele requer menos número de páginas para ler para os dados de recuperação em comparação com as colunas de tipo de texto.

Conclusão

Usar dados VarChar(MAX) digitar ao invés de TEXT para o bom desempenho.

fonte

Se estiver usando MS Access (versões especialmente os mais velhos, como, 2003) você é forçado a datatype uso TEXT em SQL Server como MS Access não reconhece nvarchar(MAX) como um campo Memo no Access, enquanto TEXT é reconhecido como um memorando de campo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top