¿Importa el tamaño de varchar en las tablas temporales?

16

Hay un debate en el trabajo de mi esposa sobre el uso varchar(255)de todos los varcharcampos en tablas temporales en procedimientos almacenados. Básicamente, un campamento quiere usar 255 porque siempre funcionará incluso si la definición cambia, y el otro campamento quiere quedarse con el tamaño en las tablas de origen para posibles mejoras de rendimiento.

¿Es correcto el campamento de rendimiento? ¿Hay otras implicaciones? Están usando SQL Server.

Brian Nickel
fuente
Yo diría que quizás no necesitas tablas temporales en primer lugar. ¿Para qué se utilizan? Si son necesarios, ¿para qué se utilizan estas columnas específicas? ¿Se usan en uniones o comparaciones de algún tipo? ¿Alguna de las columnas subyacentes es nvarchar y no varchar?
Aaron Bertrand
@AaronBertrand Las tablas temporales están ahí para modularidad. Los datos se transforman y se pueblan varias veces según las reglas comerciales que pueden cambiar. Creo que también hay algunos MAX()en la mezcla.
Brian Nickel

Respuestas:

6

Dependiendo de cómo esté utilizando sus tablas temporales, podría encontrarse con un problema de truncamiento de datos.

Este ejemplo es un poco artificial, pero ilustra mi punto. Ejemplo:

  1. Su columna de tabla de usuario es varchar (50).
  2. Su columna de la tabla temporal es varchar (255).
  3. Tiene un registro con 45 caracteres en esa columna en su tabla de usuario.
  4. En su procedimiento, concatena '- para ganar' al final de esa columna, antes de fusionar esa tabla temporal en su tabla de usuario.

La tabla temporal aceptaría con gusto el nuevo valor varchar con una longitud de 59. Sin embargo, su tabla de usuario no pudo. Dependiendo de cómo maneje esto en su procedimiento, esto podría resultar en truncamiento o un error.

A menos que documente y explique estos problemas, su procedimiento podría funcionar de manera inesperada.

Personalmente, no creo que haya una respuesta a esta pregunta que sea correcta el 100% del tiempo. Realmente depende de cómo esté usando esas tablas temporales.

Espero que esto ayude

Matt M
fuente
0

utilizando varchar(255)para todos los varcharcampos en tablas temporales en procedimientos almacenados.

Me inclinaría hacia el uso de la longitud real del campo.

Leí recientemente que las tablas temporales de MySQL (supongo que SQL Server es similar) asignan suficiente memoria para almacenar la longitud máxima posible para cada varcharcolumna ... Un enfoque sistemático para asignar 200% -500% de la memoria requerida para varcharcampos en todos Los procedimientos almacenados parecen un sorteo innecesario de recursos del sistema. Si alguna vez utiliza una cantidad significativa de memoria para crear estas tablas temporales, podría reclamar innecesariamente la memoria que estaba en uso para el almacenamiento en caché, creando más trabajo para el servidor en algún momento en el futuro, incluso después de que se hayan completado los procedimientos de almacenamiento.

Editar: Vea la respuesta de Bill Karwin: /programming/1962310/importance-of-varchar-length-in-mysql-table

Mate
fuente
2
¿Asumiendo que SQL Server es similar? Yo no ...
AK
Lo siento, me doy cuenta de que mi respuesta está incompleta. Lo que quiero decir es que me equivocaría por el lado de la precaución (es decir, no realizar un cambio que podría afectar negativamente el rendimiento) a menos que se asuma que esa suposición es incorrecta.
Matt