Acabo de leer que el VARCHAR(MAX)
tipo de datos (que puede almacenar cerca de 2 GB de datos char) es el reemplazo recomendado para el TEXT
tipo de datos en las versiones SQL Server 2005 y Next SQL SERVER.
Si deseo buscar dentro de una columna alguna cadena, ¿qué operación es más rápida?
¿Usando una
LIKE
cláusula contra unaVARCHAR(MAX)
columna?WHERE COL1 LIKE '%search string%'
¿Usa la
TEXT
columna y coloca un Índice / Catálogo de texto completo en esta columna, y luego busca usando laCONTAINS
cláusula?WHERE CONTAINS (Col1, 'MyToken')
sql-server
performance
text
varchar
sql-types
usuario85116
fuente
fuente
TEXT
yNTEXT
(yIMAGE
) están en desuso.Respuestas:
El
VARCHAR(MAX)
tipo es un reemplazo paraTEXT
. La diferencia básica es que unTEXT
tipo siempre almacenará los datos en un blob mientras que elVARCHAR(MAX)
tipo intentará almacenar los datos directamente en la fila a menos que exceda la limitación de 8k y en ese punto los almacene 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=
yGROUP BY
como cualquier otraVARCHAR
columna. 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 la Indización de texto completo yCONTAINS
. Esta pregunta es la misma independientemente deVARCHAR(MAX)
oTEXT
.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.fuente
Para texto grande, el índice de texto completo es mucho más rápido. Pero también puede indexar el texto completo
varchar(max)
.fuente
No puede buscar un campo de texto sin convertirlo de texto a varchar.
Esto da un error:
Wheras esto no:
Curiosamente,
LIKE
todavía funciona, es decirfuente
varchar(n)
otext
, y superar esta respuesta. ¿Crees, en un entorno profesional, que discutir con declaraciones vagas ayudará a resolver el problema? ¡Todas las publicaciones en StackOverflow deben ser vistas por miles de personas, actuar en consecuencia!TEXT
yVarChar(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).Según el enlace de MSDN, Microsoft sugiere evitar el uso del tipo de datos Texto 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 Text.
Los datos de una
Text
columna de tipo se almacenan fuera de la fila en páginas de datos de 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 unaVarchar(max)
columna de tipo 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.Algunas de las funciones de cadena, operadores o construcciones que no funcionan en la columna Tipo de texto, pero sí funcionan en la columna de tipo VarChar (Max).
=
Igual al operador en la columna de tipo VarChar (Max)Agrupar por cláusula en la columna de tipo VarChar (Max)
Como sabemos, 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, se 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 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 Texto.
Conclusión
Utilice
VarChar(MAX)
el tipo de datos en lugar deTEXT
un buen rendimiento.Fuente
fuente
Si usa MS Access (especialmente versiones anteriores como 2003), se ve obligado a usar el
TEXT
tipo de datos en SQL Server ya que MS Access no reconocenvarchar(MAX)
como un campo Memo en Access, mientras queTEXT
se reconoce como un campo Memo.fuente