2009-05-07 16 views
164

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

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

  1. El uso de un la cláusula LIKE contra una columna VARCHAR(MAX)?

    WHERE COL1 LIKE '%search string%'

  2. Utilizando la columna de la TEXT y poner un índice de texto completo /Catálogo en esta columna, y luego buscar utilizando la cláusula CONTAINS?

    WHERE CONTAINS (Col1, 'MyToken')

+1

Este artículo también es útil: http://stackoverflow.com/questions/564755/sql-server-text-type-vs-varchar-data-type – Jake

+21

La mención más importante en ese puesto es un enlace a [documentación de MSDN] (http://msdn.microsoft.com/en-us/library/ms187993.aspx) que muestra que 'TEXT' y' NTEXT' (y 'IMAGE') están en desuso. – Brian

+0

Mira el enlace: http://stackoverflow.com/q/28980502/1805776 – vicky

Respuesta

271

El VARCHAR(MAX) t ype es un reemplazo para 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 supere 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 VARCHAR(MAX) le da es que también se puede utilizar con = y GROUP BY como cualquier otra columna VARCHAR puede ser. Sin embargo, si tiene muchos datos, tendrá un gran problema de rendimiento con estos métodos.

En lo que respecta a si debe usar LIKE a buscar, o si debe usar indización de texto yCONTAINS. Esta pregunta es la misma independientemente de VARCHAR(MAX) o TEXT.

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

LIKE es más fácil de implementar y, a menudo, es adecuado para pequeñas cantidades de datos, pero tiene un rendimiento extremadamente bajo con datos de gran tamaño debido a su incapacidad para usar un índice.

+10

No sabía que almacenaría en la página a 8k, y fuera de la página si es más grande. Muy genial. – Brain2000

+3

Su última línea es parcialmente incorrecta. LIKE no puede usar el índice SÓLO si el comodín está al principio de la cadena que se busca. – SouravA

+0

¿No es un problema alterar un campo de un texto a varchar (max) desde una tabla existente con datos? – user1531040

17

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

14

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 es así:

declare @table table (a varchar(max)) 

Curiosamente, LIKE todavía funciona, es decir

where a like '%a%' 
+9

¡+1 solo por decir downvote aleatorio! Me vuelve loco cuando la gente me rechaza y no hace ningún comentario, realmente necesitan una vida. –

+2

La razón por la que obtuvo votos atrasados ​​es que ** por lo que recuerdo de cosas que he tenido que hacer ** no es un argumento válido para responder al responder una pregunta técnica. Piensa en la gente (como yo en este momento) tratando de completar por qué deberíamos usar 'varchar (n)' o 'text', y superar esta respuesta. ¿Crees, en un entorno profesional, que discutir con afirmaciones vagas ayudará a resolver el problema? ¡Todas las publicaciones de StackOverflow deben ser vistas por miles de personas, actúan en consecuencia! –

+2

@Zeratops lol, esta respuesta tiene 6 años, era bastante verde para cuando lo escribí. Limpié la redacción para ser más al grano. – DForck42

4

Si se utiliza MS Access (especialmente las versiones más antiguas como 2003) se ven obligados a utilizar TEXT tipo de datos en SQL Server como MS Access no reconoce nvarchar(MAX) como un campo Memo en Access, mientras que TEXT es reconocido como un campo Memo .

7
  • definición básica

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

  • ¿Cuál usar?

Como por MSDN link Microfost está sugiriendo evitar el uso del tipo de datos de texto y se eliminará en un futuro 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.

  • En fila o de almacenamiento fuera de la fila

datos de una columna Text tipo se almacena fuera de la fila en una páginas de datos LOB separadas. La fila en la página de datos de la tabla solo tendrá un puntero de 16 bytes en la página de datos LOB donde están presentes los datos reales. Mientras que los datos de una columna de tipo Varchar(max) se almacenan en filas si son inferiores o iguales a 8000 bytes. Si el valor de la columna Varchar (max) está cruzando los 8000 bytes, el valor de la columna Varchar (max) se almacena en páginas de datos LOB separadas y la fila solo tendrá un puntero de 16 bytes en 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.

  • soportados funcionalidades/no compatibles

Algunas de las funciones de cadena, operadores o las construcciones que no funciona en la columna de tipo texto, pero funcionan en varchar (max) Tipo de columna .

  1. = operador Igual a en varchar (max) Tipo de columna
  2. cláusula GROUP BY en varchar (max) Tipo de columna Consideraciones

    • sistema IO

Como sabemos que los valores de columna tipo VarChar (Max) son almacenado fuera de la fila solo si la longitud del valor que se almacenará en ella es mayor a 8000 bytes o no hay suficiente espacio en la fila, de lo contrario, lo almacenará en la fila.Entonces, si la mayoría de los valores almacenados en la columna VarChar (Max) son grandes y están almacenados 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 tipos VarChar (Máx) son lo suficientemente pequeños para almacenarlos en filas. Luego, la recuperación de los datos donde las columnas LOB no están incluidas requiere más cantidad de páginas de datos para leer, ya que el valor de la columna LOB se almacena en filas en la misma página de datos donde se almacenan los valores de columnas que no son LOB. Pero si la consulta de selección incluye una 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

Uso VarChar(MAX) tipo de datos en lugar de TEXT para un buen rendimiento.

Source

Cuestiones relacionadas