¿Es siempre preferible varchar (MAX)?


Con respecto a SQL Server, entiendo:

  • var significa que la memoria se asigna perezosamente, lo que significa que se ajusta a los datos exactamente (en la inserción).

  • MAX significa que no hay restricción de tamaño\limitación.

Entonces, ¿es siempre preferible usar MAX cuando se usa varchar, ya que no asignamos todo el tamaño de todos modos?

¿Debemos usar un tamaño constante solo si hay una restricción que queremos imponer en esta columna de la base de datos?

Author: marc_s, 2011-12-15

4 answers

Hay un muy buen artículo sobre este tema por el Usuario SO @Remus Rusanu. Aquí hay un fragmento que he robado, pero le sugiero que lea todo el asunto:

La ruta de código que maneja los tipos MAX (varchar, nvarchar y varbinary) es diferente de la ruta de código que maneja su tipos equivalentes de longitud no máxima. Los tipos no máximos pueden internamente ser representado como una estructura ordinaria de puntero y longitud. Pero el max los tipos no se pueden almacenar internamente como un contiguo área de memoria, desde posiblemente pueden crecer hasta 2Gb. Así que tienen que estar representados por un interfaz de streaming, similar a IStream de COM. Esto se traslada a cada operación que involucra los tipos max, incluyendo simple asignación y comparación, ya que estas operaciones son más complicadas a través de una interfaz de streaming. El mayor impacto es visible en el código que asigna y asigna variables de tipo max (mi primera prueba), pero el el impacto es visible en cada operación.

En el artículo muestra varios ejemplos que demuestran que el uso de varchar(n) típicamente mejora el rendimiento.

Puedes encontrar el artículo completo aquí.

 52
Author: Abe Miessler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-14 21:55:22

Busca aquí una buena respuesta:

¿Debo usar varchar(n) o varchar (MAX)?

La respuesta corta es que desde una perspectiva de almacenamiento es lo mismo, pero desde una perspectiva de optimización de consultas, es mejor usar varchar(N).

 15
Author: Garrett Vlieger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-14 21:55:36

Esto es lo que Microsoft recomienda:

  • Use char cuando los tamaños de las entradas de datos de columna sean consistentes.
  • Use varchar cuando los tamaños de las entradas de datos de columna varían considerablemente.
  • Use varchar(max) cuando los tamaños de las entradas de datos de columna varían considerablemente, y el tamaño puede exceder los 8,000 bytes.

Ref

 11
Author: O.O,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-14 22:01:57

Solo para ser bastante explícito en esto, la respuesta es NO. Siempre es preferible usar varchar (N), y si sabe que el tamaño no variará, entonces char(N). Los tipos MAX no admiten ni pueden admitir la mayoría de las características nativas de SQL, por lo que no puede agregar índices, realizar uniones ni realizar búsquedas efectivas en esos tipos. Por cierto, esta es una de las razones por las que existe la capacidad de búsqueda de texto completo en SQL Server.

Además, varchar (max) impide la capacidad de realizar en línea indexa contra la tabla completa que contiene el campo varchar(max). Esto afectará significativamente el rendimiento de su sistema.

Varchar(max) solo debe usarse si se sabe que el tamaño del campo es superior a 8K. En cualquier otra instancia, se debe especificar el tamaño. No hacerlo es un diseño pobre y conducirá a problemas de rendimiento en cualquier sistema, excepto en el más trivial.

Algunos referencias:

 6
Author: Shane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-29 15:14:47