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 / 20974
Accepted
Daniel Serodio
Daniel Serodio
Asked: 2012-07-17 09:31:57 +0800 CST2012-07-17 09:31:57 +0800 CST 2012-07-17 09:31:57 +0800 CST

Devo adicionar um limite de comprimento arbitrário às colunas VARCHAR?

  • 772

De acordo com a documentação do PostgreSQL , não há diferença de desempenho entre VARCHAR, VARCHAR(n)e TEXT.

Devo adicionar um limite de comprimento arbitrário a uma coluna de nome ou endereço ?

Edit: Não é um dupe de:

  • A pesquisa de índice seria visivelmente mais rápida com char vs varchar quando todos os valores são 36 caracteres

Eu sei que o CHARtipo é uma relíquia do passado e estou interessado não apenas no desempenho, mas em outros prós e contras, como Erwin afirmou em sua incrível resposta.

postgresql performance
  • 4 4 respostas
  • 64647 Views

4 respostas

  • Voted
  1. Best Answer
    Erwin Brandstetter
    2012-07-26T08:10:22+08:002012-07-26T08:10:22+08:00

    A resposta é não .

    Conselhos relacionados no Postgres Wiki.

    Não adicione um modificador de comprimento varcharse você não precisar dele. (Na maioria das vezes, não.) Use apenas textpara todos os dados de caracteres. Faça isso varchar(tipo SQL padrão) sem modificador de comprimento se você precisar permanecer compatível com RDBMS que não possui textum tipo de cadeia de caracteres genérico.

    O desempenho é quase o mesmo, texté um pouco mais rápido em raras situações , e você salva os ciclos para a verificação do comprimento. Relacionado:

    • Alguma desvantagem de usar o tipo de dados “texto” para armazenar strings?

    Se você realmente precisa impor um comprimento máximo, varchar(n)é uma escolha válida, mas eu ainda consideraria textcom uma CHECKrestrição como:

    ALTER TABLE tbl ADD CONSTRAINT tbl_col_len CHECK (length(col) < 51);
    

    Você pode modificar ou descartar tal restrição a qualquer momento sem ter que mexer na definição da tabela e objetos dependentes (visualizações, funções, chaves estrangeiras, ...). E você pode impor outros requisitos na (mesma) restrição.

    Modificadores de comprimento usados ​​para causar problemas como este ou este ou este ...

    O PostgreSQL 9.1 introduziu um novo recurso para aliviar um pouco a dor. As notas de lançamento:

    Permitir ALTER TABLE ... SET DATA TYPEevitar reescritas de tabela em casos apropriados (Noah Misch, Robert Haas)

    Por exemplo, converter uma varcharcoluna em texto não requer mais uma reescrita da tabela. No entanto, aumentar a restrição de comprimento em uma varcharcoluna ainda requer uma reescrita da tabela.

    Mais problemas com varchar(n)foram corrigidos em versões posteriores.

    • 98
  2. a_horse_with_no_name
    2012-07-17T11:10:37+08:002012-07-17T11:10:37+08:00

    Se você vir o limite de comprimento como um tipo de restrição de verificação para certificar-se de validar os dados, adicione um sim. Na verdade, você pode querer não usar uma definição de comprimento, mas uma restrição de verificação real, para tornar a alteração do limite mais rápida.

    Para alterar (aumentar) um limite de comprimento você precisa executar um ALTER TABLEque pode levar muito tempo para terminar (devido a uma possível reescrita da tabela) durante o qual é necessário um bloqueio de tabela exclusivo.

    Alterar (ou seja, descartar e recriar) uma restrição de verificação é uma operação muito breve e requer apenas a leitura dos dados da tabela, não altera nenhuma linha. Então, isso será muito mais rápido (o que, por sua vez, significa que o bloqueio de tabela exclusivo será mantido por um período muito menor de tempo).

    Durante a operação não há diferença alguma entre a text, a varcharou a varchar(5000)coluna.

    • 14
  3. Evan Carroll
    2018-03-18T18:30:41+08:002018-03-18T18:30:41+08:00

    A questão é especificamente se adicionar um limite de comprimento arbitrário às colunas VARCHAR?

    Para isso, a resposta é simplesmente "não". Não há nada que possa justificar a adição de um limite arbitrário como você faria em bancos de dados inferiores que suportam varchar(max)ou usam convenções como varchar(255). No entanto, se a especificação abordar um limite, acho que a resposta se torna muito mais complexa, especialmente nas versões modernas do PostgreSQL. E, para isso, eu me inclinaria para o SIM .

    Na minha opinião, o limite é uma escolha sábia se a especificação exigir. Especialmente para cargas de trabalho mais razoáveis. Se não for por nenhum outro motivo, para preservar os metadados.

    Da minha resposta aqui, indexe o desempenho para CHAR vs VARCHAR (Postgres) , onde abordo o valor dos metadados.

    Se eu encontrasse uma especificação que tivesse chaves de texto de comprimento variável que fossem significativas e que eu confiasse para ter um comprimento máximo constante, eu também usaria varchar. No entanto, não consigo pensar em nada que se encaixe nesses critérios.

    • 2
  4. Edward
    2012-07-17T10:16:43+08:002012-07-17T10:16:43+08:00

    Parece que pode haver alguma diferença de desempenho se VARCHARfor usado regularmente para armazenar strings muito grandes, já que "strings longas são compactadas pelo sistema automaticamente" e "valores muito longos também são armazenados em tabelas de fundo". Teoricamente, isso significaria que um grande volume de solicitações para um campo de string muito longo seria mais lento do que para um campo de string curto. Você provavelmente nunca terá esse problema, já que nomes e endereços não serão muito longos.

    No entanto, dependendo de como você está usando essas strings fora do banco de dados, convém adicionar um limite prático para evitar o abuso do sistema. Por exemplo, se você estiver exibindo o nome e o endereço em um formulário em algum lugar, talvez não seja possível exibir um parágrafo inteiro de texto no campo "nome", portanto, faria sentido limitar a coluna de nome a algo como 500 personagens.

    • 1

relate perguntas

  • Sequências Biológicas do UniProt no PostgreSQL

  • Como determinar se um Índice é necessário ou necessário

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

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

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

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

    • 4 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

    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
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +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
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +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