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 / 90483
Accepted
richardtallent
richardtallent
Asked: 2015-01-29 15:22:36 +0800 CST2015-01-29 15:22:36 +0800 CST 2015-01-29 15:22:36 +0800 CST

Devo usar varchar(max) ou varchar(4000) SPARSE?

  • 772

Eu tenho uma coluna do tipo "comentário" que raramente é usada - cerca de 6% não nula em uma população de 3 milhões de registros. O comprimento médio (quando usado) é de 6 caracteres e o máximo até agora é de cerca de 3 KB. Um máximo de 4000 caracteres é razoável para este campo. Eu tenho duas opções:

comments varchar(max) NULL -- this is the current column definition
comments varchar(4000) SPARSE NULL

Meu entendimento atual é que, em ambos os casos, um NULLvalor não exigiria armazenamento - apenas o NULLconjunto de bits da coluna e um comprimento 0nos metadados da linha.

Mas para os casos não nulos , um tem clara vantagem sobre o outro?

O ponteiro extra de 4 bytes para colunas esparsas com valores sugere que eles são sempre armazenados fora da linha ou em campos textmuito grandes . varchar(max)É esse o caso?

Nesse caso, eu me inclinaria a usar varchar(max), já que ele só armazena valores fora da linha se o comprimento total da linha exceder 8 KB, e a maioria dos meus valores é curta e é improvável que coloque uma linha acima do limite.

Não vi essa situação específica abordada no BOL, então espero que alguém aqui saiba o suficiente sobre as entranhas do MSSQL para fornecer algumas dicas.

(Se for importante, atualmente estou usando 2008R2, mas espero atualizar em breve para 2014.)

sql-server varchar
  • 2 2 respostas
  • 5211 Views

2 respostas

  • Voted
  1. Best Answer
    Solomon Rutzky
    2015-01-29T18:20:09+08:002015-01-29T18:20:09+08:00

    Não há vantagem para os casos não NULL ao usar SPARSE, e de fato, existem duas desvantagens declaradas:

    • 4 bytes extras para cada valor não NULL
    • tempo de acesso um pouco mais longo

    Como você já percebeu, a SPARSEopção só faz sentido para tipos de dados de comprimento fixo; Não consigo pensar em um único motivo para usá-lo em tipos de comprimento variável.

    Não tenho certeza de que os 4 bytes extras impliquem algo sobre o armazenamento fora da linha, e os MAXtipos não estão totalmente fora da linha quando excedem 8.000 bytes, pois há o ponteiro de 16 bytes na linha para esse off-line. localização da linha.

    Fique com VARCHAR(4000), no SPARSE, e eu consideraria fazê-lo NOT NULL DEFAULT('')(uma string vazia ainda tem 0 bytes, mas agora você não precisa mexer com o indicador NULL e um comentário pode realmente ser "desconhecido" em vez de "sem comentário "?).

    • 2
  2. Jun Sato
    2015-08-06T11:17:47+08:002015-08-06T11:17:47+08:00

    Eu apoio Srutzky. Concordou.

    Agora, deixe-me acrescentar um pouco da perspectiva operacional que tem muito a ver com a sua decisão. Como você está atualmente em varchar (max), não há problema para você, mas fugir disso tem certas vantagens em desempenho e recursos operacionais.

    Apenas para dar um exemplo, há um recurso útil chamado Reconstrução de Índice Online, que é um recurso exclusivo da edição corporativa.

    Permita-me desviar um pouco; Após um longo período de uso, os índices ficam fragmentados e precisam ser reconstruídos. No entanto, as compilações usuais causariam um bloqueio significativo nas tabelas subjacentes e, enquanto o índice está sendo reconstruído, o índice não é utilizável, o que torna as consultas inoperantes em bancos de dados muito grandes. Não é apenas "hmm..é meio lento", é "2 segundos de consulta leva 25 minutos!" tipo de emergência. Portanto, em um sistema 24 horas por dia, 7 dias por semana, não é uma opção. É aí que a reconstrução do índice online entra em jogo; se você pagou cerca de US$ 25.000 pela licença principal do privilégio de usar a Enterprise Edition, pode recriar magicamente o índice em um sistema 24 horas por dia, 7 dias por semana, sem afetar os usuários.

    Exceto, se algum desenvolvedor lançar varchar (max), não funcionará. Felizmente, no entanto, em varchar(4000). Se os dados contivessem mais de 8.000 caracteres, você ficaria preso em varchar(max) e não conseguiria realizar a reconstrução online, o que seria um problema operacional que os superiores certamente notariam.

    ..e esse é apenas um exemplo. Portanto, minha recomendação é conversar com o DBA de produção em sua organização e perguntar a eles o que eles gostam e o que não gostam. Como você está executando varchar(max), entendo que não é um problema, mas você pode prepará-lo para o futuro removendo-o. Embora, você estaria perfeitamente bem com o uso de varchar(max) se a tabela for para armazenamento acessado com pouca frequência, sem necessidade de reconstrução de índice online. Esse é o tipo de chamada que apenas seu DBA de produção pode fazer.

    Se você estiver em uma loja menor sem DBA dedicado, forneça mais detalhes sobre o uso da tabela e os requisitos operacionais (é 24 horas por dia, 7 dias por semana, com exigência de cinco noves? É clusterizado? Quanto tempo dura sua janela de serviço? Edição atual e planos futuros para mudanças de edição?) e a comunidade pode lhe dar melhores recomendações. Posso estar pedindo muita informação, mas esse é o tipo de detalhe com o qual os DBAs experientes contam para tomar a decisão certa.

    • 2

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

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

  • 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