O tamanho do varchar é importante em tabelas temporárias?

16

Há um debate no trabalho de minha esposa sobre o uso varchar(255)de todos os varcharcampos em tabelas temporárias em procedimentos armazenados. Basicamente, um campo deseja usar 255, porque sempre funcionará mesmo que a definição seja alterada, e o outro campo deseja manter o tamanho das tabelas de origem para possíveis melhorias de desempenho.

O campo de performance está certo? Existem outras implicações? Eles estão usando o SQL Server.

Brian Nickel
fonte
Eu diria que talvez você não precise de tabelas temporárias em primeiro lugar. Para que eles estão sendo usados? Se necessário, para que essas colunas específicas estão sendo usadas? Eles são usados ​​em junções ou comparações de qualquer tipo? Alguma das colunas subjacentes é nvarchar e não varchar?
Aaron Bertrand
@AaronBertrand As tabelas temporárias existem para modularidade. Os dados são transformados e preenchidos várias vezes com base nas regras de negócios que podem mudar. Eu acho que também há alguns MAX()na mistura.
Brian Nickel

Respostas:

6

Dependendo de como você está usando suas tabelas temporárias, você pode encontrar um problema de truncamento de dados.

Este exemplo é um pouco artificial, mas ilustra meu argumento. Exemplo:

  1. A coluna da tabela do usuário é varchar (50).
  2. Sua coluna da tabela temporária é varchar (255).
  3. Você tem um registro com 45 caracteres nessa coluna na sua tabela de usuários.
  4. No seu procedimento, você concatena '- para a vitória' no final dessa coluna, antes de mesclar a tabela temporária na tabela do usuário.

A tabela temporária aceitaria com satisfação o novo valor varchar com um comprimento de 59. No entanto, sua tabela de usuários não pôde. Dependendo de como você lida com isso no seu procedimento, isso pode resultar em truncamento ou erro.

A menos que você documente e considere esses problemas, seu procedimento poderá ser executado de maneira inesperada.

Pessoalmente, não acho que haja uma resposta correta a essa pergunta 100% do tempo. Realmente depende de como você está usando essas tabelas temporárias.

Espero que isto ajude

Matt M
fonte
0

usando varchar(255)para todos os varcharcampos em tabelas temporárias em procedimentos armazenados.

Eu me inclinaria para o uso do comprimento real do campo.

Li recentemente que as tabelas temporárias do MySQL (suponho que o SQL Server seja semelhante) alocam memória suficiente para armazenar o comprimento máximo possível para cada varcharcoluna ... Uma abordagem sistemática para alocar de 200% a 500% da memória necessária para varchartodos os campos procedimentos armazenados parece um empate desnecessário nos recursos do sistema. Se você estiver usando uma quantidade significativa de memória criando essas tabelas temporárias, poderá reivindicar desnecessariamente a memória que estava sendo usada para armazenar em cache, criando mais trabalho para o servidor em algum momento no futuro, mesmo após a conclusão dos procedimentos de armazenamento.

Edit: Veja a resposta de Bill Karwin: /programming/1962310/importance-of-varchar-length-in-mysql-table

Matt
fonte
2
Supondo que o SQL Server seja semelhante? Eu não ...
AK
Desculpe, percebi que minha resposta está incompleta. O que quero dizer é que eu iria errar por precaução (ou seja, não fazer uma alteração que pudesse afetar negativamente o desempenho), a menos que essa suposição seja estabelecida como errada.
Matt