AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 1767
Accepted
Lars Corneliussen
Lars Corneliussen
Asked: 2011-03-17 05:36:31 +0800 CST2011-03-17 05:36:31 +0800 CST 2011-03-17 05:36:31 +0800 CST

Como as colunas longas afetam o desempenho e o uso do disco?

  • 772

Em nosso projeto atual, acontece com muita frequência que precisamos estender as colunas em alguns caracteres. De varchar(20)para varchar(30)e assim por diante.

Na realidade, quanto isso realmente importa? Quão bom isso é otimizado? Qual é o impacto de permitir apenas 100 ou 200 ou até 500 caracteres para campos normais de "entrada"? Um e-mail só pode ter 320 caracteres, então ok - há um bom limite aí. Mas o que ganho se definir para 200, porque não espero endereços de e-mail mais longos do que isso.

Normalmente nossas tabelas não terão mais de 100.000 linhas, e até 20 ou 30 dessas colunas.

Usamos o SQL Server 2008 agora, mas seria interessante saber como diferentes bancos de dados lidam com esses problemas.

Caso o impacto seja muito baixo - como eu esperaria, ajudaria a obter alguns bons argumentos (apoiados com links?) Para convencer meu DBA de que essa paranóia de campo longo não é realmente necessária.

Caso seja, estou aqui para aprender :-)

sql-server-2008 database-design
  • 7 7 respostas
  • 15432 Views

7 respostas

  • Voted
  1. Best Answer
    Leigh Riffel
    2011-03-17T12:12:03+08:002011-03-17T12:12:03+08:00

    A resposta específica à sua pergunta (pelo menos para Oracle e provavelmente outros bancos de dados) é que o comprimento do campo não importa, apenas o comprimento dos dados. No entanto, isso não deve ser usado como um fator determinante sobre se deve ou não definir o campo em seu comprimento máximo permitido. Aqui estão algumas outras questões que você deve considerar antes de maximizar os tamanhos dos campos.

    Formatação Qualquer ferramenta cliente que formate os dados com base no tamanho dos campos exigirá considerações especiais de formatação. O SQL*Plus da Oracle, por exemplo, exibe por padrão o tamanho máximo das colunas Varchar2, mesmo que os dados tenham apenas um caractere. Comparar…

    create table f1 (a varchar2(4000), b varchar2(4000));
    create table f2 (a varchar2(5), b varchar2(5));
    insert into f1 values ('a','b');
    insert into f2 values ('a','b');
    select * from f1;
    select * from f2;
    

    O comprimento do campo de dados incorretos fornece um mecanismo adicional para capturar/evitar dados incorretos. Uma interface não deve tentar inserir 3.000 caracteres em um campo de 100 caracteres, mas se esse campo for definido como 4.000 caracteres, pode ser. O erro não seria detectado no estágio de entrada de dados, mas o sistema pode ter problemas mais abaixo quando outro aplicativo tentar processar os dados e engasgar. Por exemplo, se você posteriormente decidir indexar o campo no Oracle, excederá o comprimento máximo da chave (dependendo do tamanho do bloco e da concatenação). Ver…

    create index i1 on f1(a);
    

    Memória Se o aplicativo cliente alocar memória usando o tamanho máximo, o aplicativo alocaria significativamente mais memória do que o necessário. Considerações especiais teriam que ser feitas para evitar isso.

    Documentação O tamanho do campo fornece outro ponto de dados de documentação sobre os dados. Poderíamos chamar todas as tabelas t1, t2, t3, etc. e todos os campos f1, f2, f3, etc., mas especificando nomes significativos, entendemos melhor os dados. Por exemplo, se uma tabela de endereços de uma empresa com clientes nos EUA tiver um campo chamado Estado com dois caracteres, esperamos que a abreviação do estado de dois caracteres apareça nele. Por outro lado, se o campo tiver cem caracteres, podemos esperar que o nome completo do estado apareça no campo.


    Dito isso, parece prudente estar preparado para a mudança. Só porque todos os nomes de produtos hoje cabem em 20 caracteres, não significa que sempre caberão. Não exagere e faça 1000, mas deixe espaço para uma expansão plausível.

    • 12
  2. SQLRockstar
    2011-03-17T05:50:32+08:002011-03-17T05:50:32+08:00

    Aqui está um bom ponto de partida para você.

    http://www.sqlskills.com/BLOGS/KIMBERLY/post/Disk-space-is-cheap.aspx

    Posso ter entendido mal sua pergunta original. Deixe-me ver se consigo encontrar alguns outros links para referência.

    Aqui está uma boa referência sobre seleções de tipo de dados: http://sqlfool.com/2009/05/performance-considerations-of-data-types/

    Mudar de varchar(20) para varchar(30) pode parecer algo pequeno, mas você precisa entender mais sobre como as estruturas de banco de dados funcionam para estar ciente dos possíveis problemas. Por exemplo, ir para varchar(30) pode levar você além do ponto de inflexão de suas colunas (se todos os 30 bytes forem usados), podendo ser armazenado em uma página (menos de 8060 bytes). Isso levará a um aumento no espaço em disco usado, uma diminuição no desempenho e até mesmo alguma sobrecarga adicional com seus logs de transação.

    Aqui está um link para estruturas de banco de dados: http://technet.microsoft.com/en-us/sqlserver/gg313756.aspx

    Aqui está um para divisões de página e log trx: http://sqlskills.com/BLOGS/PAUL/post/How-expensive-are-page-splits-in-terms-of-transaction-log.aspx

    HTH

    • 9
  3. Jeff
    2011-03-19T07:54:47+08:002011-03-19T07:54:47+08:00

    Pensei em compartilhar outro ponto interessante, que encontrei em uma pergunta do Stack Overflow .

    Resposta original por: Nick Kavadias

    Uma razão para NÃO usar campos máximos ou de texto é que você não pode realizar reconstruções de índice online, ou seja, RECONSTRUIR COM ONLINE= ON, mesmo com o SQL Server Enterprise Edition.

    Eu consideraria isso uma grande desvantagem ao adicionar colunas n/varchar(max) arbitrariamente e, de acordo com o site da MS, essa restrição contra reconstruções de índices online permanece no SQL Server 2008, 2008 R2 e Denali; portanto, não é específico do SQL Server 2005.

    • 7
  4. Jeff
    2011-03-17T08:22:25+08:002011-03-17T08:22:25+08:00

    Em alguns casos, a quantidade de espaço alocada para um campo varchar afetará a quantidade de memória alocada para classificações na memória.

    Achei as apresentações em SQLWorkshops.com instigantes, esta apresentação fala sobre um caso em que uma classificação para um pedido por está transbordando para tempdb porque não há memória suficiente sendo alocada para campos char/varchar.

    http://webcasts2.sqlworkshops.com/webcasts.asp

    Este webcast também foi apresentado como um artigo no seguinte site:

    http://www.mssqltips.com/tip.asp?tip=1955

    Observe nesta apresentação que a coluna que está sendo classificada não é a coluna char/varchar, mas a quantidade de espaço alocado para a coluna varchar na memória faz diferença no desempenho da consulta em alguns casos.

    • 6
  5. gbn
    2011-03-17T10:33:35+08:002011-03-17T10:33:35+08:00

    DEFINIR ANSI_PADDING ATIVADO?

    Você acaba com muitos espaços em branco à direita ...

    • 4
  6. yrushka
    2011-03-17T06:02:21+08:002011-03-17T06:02:21+08:00

    Importa apenas em relação ao espaço em disco e ao comprimento dos caracteres. É claro que a pesquisa em tipos de dados char e índices nesses tipos de dados agirão mais lentamente que inteiros, mas isso é outra discussão.

    O tipo de dados Varchar é um tipo de dados "variável", portanto, se você configurar um limite de varchar (500), esse será o comprimento máximo de caracteres para esse campo. O comprimento mínimo pode ser entre 0 e 500. Por outro lado, o espaço em disco reivindicado será diferente para campos de 10, 30 ou 500 caracteres.

    Fiz algumas vezes um teste para dados do tipo varchar (800) e para valores nulos tive 17 bytes usados, e para cada caractere inserido adicionava mais um byte. Por exemplo, uma string de 400 caracteres tinha 417 bytes usados ​​no disco.

    • 2
  7. bernd_k
    2011-03-17T06:16:56+08:002011-03-17T06:16:56+08:00

    Eu não acho que haja qualquer diferença entre tabelas criadas com colunas de varchar(20) ou varchar((8000), desde que o comprimento máximo real seja <= 20.

    Por outro lado, em alguns casos, dar aos usuários a possibilidade de armazenar strings mais longas pode incentivá-los a fazê-lo.

    • 2

relate perguntas

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Quais são algumas maneiras de implementar um relacionamento muitos-para-muitos em um data warehouse?

  • Quanto "Padding" coloco em meus índices?

  • Existe um processo do tipo "práticas recomendadas" para os desenvolvedores seguirem para alterações no banco de dados?

  • Downgrade do SQL Server 2008 para 2005

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve