He leído sobre esto en los foros de MSDN y aquí y todavía no lo tengo claro. Creo que esto es correcto: Varchar (max) se almacenará como un tipo de datos de texto, por lo que tiene inconvenientes. Entonces, digamos que su campo tendrá menos de 8000 caracteres. Como un campo BusinessName en mi tabla de base de datos. En realidad, el nombre de una empresa probablemente siempre tendrá menos de (sacando un número de mi sombrero) 500 caracteres. Parece que muchos campos varchar con los que me encuentro caen muy por debajo del recuento de caracteres de 8k.
Entonces, ¿debería hacer que ese campo sea varchar (500) en lugar de varchar (8000)? Por lo que entiendo de SQL, no hay diferencia entre esos dos. Entonces, para hacer la vida más fácil, me gustaría definir todos mis campos varchar como varchar (8000). ¿Tiene eso algún inconveniente?
Relacionado: Tamaño de las columnas varchar (no sentí que esta respondiera mi pregunta).
fuente
Respuestas:
Desde el punto de vista del procesamiento, no hará ninguna diferencia usar varchar (8000) vs varchar (500). Es más un tipo de "buena práctica" definir una longitud máxima que debe contener un campo y hacer que su varchar tenga esa longitud. Es algo que se puede utilizar para ayudar con la validación de datos. Por ejemplo, hacer que la abreviatura de un estado tenga 2 caracteres o un código postal de 5 o 9 caracteres. Esta solía ser una distinción más importante para cuando sus datos interactuaban con otros sistemas o interfaces de usuario donde la longitud del campo era crítica (por ejemplo, un conjunto de datos de archivos planos de mainframe), pero hoy en día creo que es más un hábito que cualquier otra cosa.
fuente
Un ejemplo en el que esto puede marcar la diferencia es que puede evitar una optimización del rendimiento que evita agregar información de versiones de filas a las tablas con desencadenadores posteriores.
Esto está cubierto por SQL Kiwi aquí
De manera similar, si se usan tablas optimizadas para memoria desde 2016, ha sido posible usar columnas LOB o combinaciones de anchos de columna que potencialmente podrían exceder el límite de entrada pero con una penalización.
Esto puede tener un gran efecto negativo en el consumo y el rendimiento de la memoria
Otro caso en el que la declaración excesiva de los anchos de columna puede suponer una gran diferencia es si la tabla se procesará alguna vez mediante SSIS. La memoria asignada para columnas de longitud variable (no BLOB) es fija para cada fila en un árbol de ejecución y es según la longitud máxima declarada de las columnas, lo que puede conducir a un uso ineficiente de búferes de memoria (ejemplo) . Si bien el desarrollador del paquete SSIS puede declarar un tamaño de columna más pequeño que la fuente, este análisis se realiza mejor desde el principio y se aplica allí.
De vuelta en el motor de SQL Server, un caso similar es que al calcular la concesión de memoria para asignar a las
SORT
operaciones, SQL Server asume quevarchar(x)
columnas consumirán en promediox/2
bytes .Si la mayoría de sus
varchar
columnas están más llenas, esto puede llevar a que lassort
operaciones se desbordentempdb
.En su caso, si sus
varchar
columnas se declaran como8000
bytes pero en realidad tienen un contenido mucho menor que ese, a su consulta se le asignará memoria que no requiere, lo que obviamente es ineficiente y puede conducir a esperas por concesiones de memoria.Esto se trata en la Parte 2 del Webcast 1 de talleres de SQL que se puede descargar desde aquí o ver más abajo.
fuente
char(4)
que de todos modos hay 2 bytes de sobrecarga por columna variable.Aparte de las mejores prácticas (respuesta de BBlake)
fuente
nvarchar
yvarchar
, esto solo significa que los espacios finales se conservan al insertarlos, no que los valores se completen con espacios al tamaño de la columna, como enchar
ynchar
.Hay algunas desventajas de las columnas grandes que son un poco menos obvias y pueden atraparte un poco más tarde:
Como regla general, trate de ser conservador con el ancho de la columna. Si se convierte en un problema, puede expandirlo fácilmente para que se ajuste a sus necesidades. Si observa problemas de memoria más adelante, reducir una columna ancha más adelante puede volverse imposible sin perder datos y no sabrá por dónde empezar.
En su ejemplo de los nombres comerciales, piense en dónde puede mostrarlos. ¿Hay realmente espacio para 500 caracteres? Si no es así, no tiene mucho sentido almacenarlos como tales. http://en.wikipedia.org/wiki/List_of_companies_of_the_United_States enumera algunos nombres de empresas y el máximo es de unos 50 caracteres. Entonces usaría 100 para el máximo de columna. Quizás más como 80.
fuente
Idealmente, querrá ir más pequeño que eso, hasta una longitud de tamaño razonable (500 no es de tamaño razonable) y asegurarse de que la validación del cliente detecte cuándo los datos serán demasiado grandes y enviarán un error útil.
Si bien el varchar en realidad no va a reservar espacio en la base de datos para el espacio no utilizado, recuerdo que las versiones de SQL Server tienen un rastro de que las filas de la base de datos son más anchas que una cierta cantidad de bytes (no recuerdo el recuento exacto) y en realidad arrojan los datos que no encajaban. Un cierto número de esos bytes se reservó para cosas internas de SQL Server.
fuente