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 / 140790
Accepted
Phrancis
Phrancis
Asked: 2016-06-09 16:32:31 +0800 CST2016-06-09 16:32:31 +0800 CST 2016-06-09 16:32:31 +0800 CST

Usando texto MAX ou tipo menor mais específico

  • 772

Alguém estava revisando meu código DDL para criar tabelas e sugeriu, quando viram que eu vi usando VARCHAR(256)campos para texto, espero que sejam bem pequenos, como um primeiro nome ou qualquer outra coisa, que eu deveria sempre usar VARCHAR(MAX)e vincular Por que usar qualquer coisa além de varchar (max ) . Eu li, mas parecia datado, pois estava focado em 2005, e não parecia oferecer nenhuma justificativa real para alocar potencialmente até 2 GB por linha em todos os campos de texto.

De um ponto de vista de desempenho, armazenamento etc., como alguém deve decidir se deve usar VARCHAR(MAX)ou um tipo menor e mais específico para versões modernas do SQL Server? (por exemplo, 2008, 2012, 2014)

sql-server database-design
  • 2 2 respostas
  • 1143 Views

2 respostas

  • Voted
  1. Best Answer
    Paul White
    2016-06-09T17:57:34+08:002016-06-09T17:57:34+08:00

    Devo sempre usar (n)varchar(max)para colunas de texto?

    Não.

    Para SQL Server, os maxtipos de dados só devem ser especificados quando não houver alternativa. Em vez disso, deve-se escolher o tipo de base correto ( varcharou nvarchar) e especificar um comprimento máximo explícito que seja apropriado para os dados a serem armazenados.

    O armazenamento físico é idêntico se a coluna for digitada como varchar(n)ou varchar(max), portanto, essa não é a preocupação.

    As razões para não escolher (n)varchar(max)em todos os lugares giram em torno de recursos, qualidade do plano e desempenho.

    Uma lista exaustiva provavelmente não é prática, mas entre outras coisas, maxcolunas:

    Características

    • Exigir uma restrição separada para impor um comprimento máximo
    • Não pode ser uma chave em um índice (portanto, também não há restrições exclusivas)
    • Pode impedir DDL online (incluindo reconstruções de índice e adição de uma nova coluna não nula)
    • Geralmente não são suportados para recursos 'mais recentes', por exemplo, columnstore
    • Consulte a documentação do produto para obter recursos e limitações mais específicos. O padrão geral é que existem limitações e restrições complicadas em relação aos maxtipos de dados. Nem todas as limitações e efeitos colaterais estão documentados.

    atuação

    • Exigem tratamento especial no mecanismo de execução, para contabilizar o tamanho potencialmente muito grande. Normalmente, isso envolve o uso de um caminho de código menos eficiente, com uma interface de streaming
    • Pode ter consequências imprevistas semelhantes para código externo (e outros componentes do SQL Server como SSIS), que também devem estar preparados para lidar com dados de até 2 GB de tamanho
    • Supõe-se que tenham 4.000 bytes de largura nos cálculos de concessão de memória. É provável que isso leve a uma reserva excessiva de memória, o que limita a simultaneidade e empurra páginas valiosas de índice e dados para fora da memória cache
    • Desative várias otimizações de desempenho importantes
    • Pode estender a duração do bloqueio
    • Pode impedir que o otimizador escolha um plano de busca (não dinâmico)
    • Impedir que os filtros sejam enviados para varreduras e buscas como um resíduo
    • Pode aumentar a pressão e a contenção do tempdb (dependente da versão), pois as variáveis ​​e os parâmetros provavelmente também serão digitados maxpara corresponder às definições da coluna

    Em resumo, há tantos efeitos colaterais sutis (e indesejáveis) de usar desnecessariamente o maxespecificador que não faz sentido fazer isso. A pequena 'conveniência' de usar uma única declaração não é uma espécie de compensação.

    Avalie cada tipo no contexto, use o tipo base correto ( varcharou nvarchar) e um comprimento explícito sensato.

    Leitura adicional:

    • Comparação de desempenho de varchar(max) vs. varchar(n) por Remus Rusanu
    • Leia objetos comprometidos e grandes por Craig Freedman
    • Planejamento de capacidade para tempdb
    • Exclui páginas divididas e fantasmas encaminhados (eu)
    • 32
  2. Mathieu Guindon
    2016-06-09T17:42:19+08:002016-06-09T17:42:19+08:00

    Isso vai parecer a resposta de um paranóico, mas não há apenas considerações de armazenamento e desempenho.

    O próprio banco de dados não controla seus clientes, e não se pode presumir que os clientes sempre insiram entradas do usuário com segurança - mesmo que um banco de dados seja projetado para ser usado apenas com um aplicativo .net que usa o Entity Framework para encapsular transações e garantir consultas parametrizadas são usados ​​sistematicamente, você não pode saber que sempre será o caso.

    Eu não saberia exatamente como fazer isso, mas, ao criar todos os campos de texto varchar(max), se um cliente tiver problemas nas Tabelas Bobby e/ou os parâmetros de seus procedimentos armazenados também varchar(max), você estará facilitando a criação de um invasor um valor de parâmetro válido, mas inteligente, que pode fazer coisas que os clientes não deveriam estar fazendo - seja lá o que for.

    Ao limitar o comprimento ao que você realmente precisa, você não está se protegendo desses ataques inteligentes (nem tenho certeza de como é realmente chamado, só me lembro de ter lido sobre isso um tempo atrás), mas você não está dizendo " vá em frente, tente me dar um script de 2 GB para executar" também.

    • 8

relate perguntas

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

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

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

Sidebar

Stats

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

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

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

    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
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • 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
    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

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