Pregunta

Acabo de leer que el tipo de datos VARCHAR (MAX) (que puede almacenar cerca de 2GB de datos char) es el reemplazo recomendado para el tipo de datos TEXT en SQL Server 2005 y las siguientes versiones de SQL SERVER.

Si deseo buscar dentro de una columna cualquier cadena, ¿qué operación es más rápida?

  1. ¿Usando una cláusula LIKE contra una columna VARCHAR (MAX) ?

    DONDE COL1 ME GUSTA '% search string%'

  2. Usando la columna TEXT y coloca un Índice de texto completo / Catálogo en esta columna, y luego busca usando el ¿CONTIENE cláusula?

    DONDE CONTIENE (Col1, 'MyToken')

¿Fue útil?

Solución

El tipo VARCHAR (MAX) es un reemplazo de TEXT . La diferencia básica es que un tipo TEXT siempre almacenará los datos en un blob mientras que el tipo VARCHAR (MAX) intentará almacenar los datos directamente en la fila a menos que exceda la limitación de 8k y en ese punto lo almacena en un blob.

El uso de la declaración LIKE es idéntico entre los dos tipos de datos. La funcionalidad adicional que VARCHAR (MAX) le brinda es que también se puede usar con = y GROUP BY como cualquier otro VARCHAR columna puede ser. Sin embargo, si tiene muchos datos, tendrá un gran problema de rendimiento al usar estos métodos.

Con respecto a si debe usar LIKE para buscar, o si debe usar Indización de texto completo y CONTAINS . Esta pregunta es la misma independientemente de VARCHAR (MAX) o TEXT .

Si está buscando grandes cantidades de texto y el rendimiento es clave, entonces debe usar un Índice de texto completo .

LIKE es más simple de implementar y a menudo es adecuado para pequeñas cantidades de datos, pero tiene un rendimiento extremadamente pobre con datos grandes debido a su incapacidad para usar un índice.

Otros consejos

Para texto grande, el índice de texto completo es mucho más rápido. Pero también puede índice de texto completo varchar (max) .

No puede buscar un campo de texto sin convertirlo de texto a 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'

Esto da un error:

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

Wheras esto no:

declare @table table (a varchar(max))

Curiosamente, LIKE todavía funciona, es decir,

where a like '%a%'
  • Definición básica

TEXT y VarChar (MAX) son tipos de datos de caracteres de longitud variable grande no Unicode, que pueden almacenar un máximo de 2147483647 caracteres no Unicode (es decir, la capacidad máxima de almacenamiento es : 2 GB).

  • ¿Cuál usar?

Según enlace MSDN Microsoft sugiere evitar usar el Escriba el tipo de datos y se eliminará en futuras versiones de SQL Server. Varchar (Max) es el tipo de datos sugerido para almacenar los valores de cadena grandes en lugar del tipo de datos de texto.

  • Almacenamiento en fila o fuera de fila
Los

datos de una columna de tipo Text se almacenan fuera de la fila en páginas de datos LOB separadas. La fila en la página de datos de la tabla solo tendrá un puntero de 16 bytes a la página de datos de LOB donde están presentes los datos reales. Mientras que los datos de una columna de tipo Varchar (max) se almacenan en fila si es menor o igual a 8000 bytes. Si el valor de la columna Varchar (máx.) Cruza los 8000 bytes, el valor de la columna Varchar (máx.) Se almacena en páginas de datos LOB separadas y la fila solo tendrá un puntero de 16 bytes a la página de datos LOB donde están presentes los datos reales. Entonces In-Row Varchar (Max) es bueno para búsquedas y recuperación.

  • Funcionalidades compatibles / no compatibles

Algunas de las funciones de cadena, operadores o construcciones que no funcionan en la columna de tipo Texto, pero sí funcionan en la columna de tipo VarChar (Max).

  1. = Igual al operador en la columna de tipo VarChar (Max)
  2. Agrupar por cláusula en la columna de tipo VarChar (Max)

    • Consideraciones de E / S del sistema

Como sabemos que los valores de la columna de tipo VarChar (Max) se almacenan fuera de la fila solo si la longitud del valor que se almacenará es mayor que 8000 bytes o si no hay suficiente espacio en la fila, de lo contrario lo almacenará en fila. Entonces, si la mayoría de los valores almacenados en la columna VarChar (Max) son grandes y se almacenan fuera de la fila, el comportamiento de recuperación de datos será casi similar al de la columna Tipo de texto.

Pero si la mayoría de los valores almacenados en las columnas de tipo VarChar (Max) son lo suficientemente pequeños como para almacenar en fila. Luego, la recuperación de los datos donde no se incluyen las columnas LOB requiere la mayor cantidad de páginas de datos para leer, ya que el valor de la columna LOB se almacena en fila en la misma página de datos donde se almacenan los valores de las columnas no LOB. Pero si la consulta de selección incluye la columna LOB, entonces requiere menos cantidad de páginas para leer para la recuperación de datos en comparación con las columnas de tipo de texto.

Conclusión

Utilice el tipo de datos VarChar (MAX) en lugar de TEXT para obtener un buen rendimiento.

Fuente

Si usa MS Access (especialmente versiones anteriores como 2003) se ve obligado a usar el tipo de datos TEXT en SQL Server ya que MS Access no reconoce nvarchar (MAX ) como un campo Memo en Access, mientras que TEXT se reconoce como un campo Memo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top