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 / 4968
Accepted
Richard
Richard
Asked: 2011-08-24 06:25:24 +0800 CST2011-08-24 06:25:24 +0800 CST 2011-08-24 06:25:24 +0800 CST

Quando usar TINYINT sobre INT?

  • 772

Em geral, eu sempre uso Ints. Eu sei que, em teoria, essa não é a melhor prática, pois você deve usar o menor tipo de dados que será garantido para armazenar os dados.

Por exemplo, é melhor usar tinyintquando você sabe que os únicos dados que você armazenará são 1, 0 ou nulo (com uma chance muito pequena de expandir isso para 2 ou 3 depois).

No entanto, a única razão que conheço para fazer isso é para fins de armazenamento - usando 1 byte em uma linha em vez de 4 bytes.

Quais são os impactos de usar tinyint( smallintou mesmo bigint) sobre apenas int, além de economizar espaço no disco rígido?

sql-server database-theory
  • 5 5 respostas
  • 62475 Views

5 respostas

  • Voted
  1. Best Answer
    Mark Storey-Smith
    2011-08-24T07:16:06+08:002011-08-24T07:16:06+08:00

    O espaço em disco é barato... esse não é o ponto!

    Pare de pensar em termos de espaço de armazenamento, pense em buffer pool e largura de banda de armazenamento . No extremo, cache da CPU e largura de banda do barramento de memória . O artigo vinculado faz parte da série que destaca problemas com a seleção de chaves clusterizadas inadequadas (INT vs GUID vs GUID Sequencial), mas destaca a diferença que os bytes podem fazer.

    A mensagem principal é a questão do design. A diferença não aparecerá em um banco de dados individual em um servidor adequadamente especificado até que você atinja o território VLDB, mas se você puder economizar alguns bytes, por que não fazê-lo.

    Lembro-me do ambiente descrito em uma pergunta anterior . Mais de 400 bancos de dados, variando em tamanho de 50 MB a 50 GB, por instância SQL. Limpar alguns bytes por registro, por tabela, por banco de dados nesse ambiente pode fazer uma diferença significativa.

    • 98
  2. gbn
    2011-08-24T10:53:22+08:002011-08-24T10:53:22+08:00

    Além das outras respostas...

    As linhas e entradas de índice são armazenadas em 8k páginas. Portanto, um milhão de linhas a 3 bytes por linha não é 3 MB no disco: afeta o número de linhas por página ("densidade da página").

    O mesmo se aplica a nvarchar para varchar, smalldatetime para datetime, int para tinyint etc

    Editado, junho de 2013

    http://sqlblog.com/blogs/joe_chang/archive/2013/06/16/load-test-manifesto.aspx

    Este artigo afirma

    Os critérios importantes são a cardinalidade e a proporção de página para linha.

    Portanto, a escolha do tipo de dados importa

    • 30
  3. RolandoMySQLDBA
    2011-08-24T07:39:46+08:002011-08-24T07:39:46+08:00

    Não é apenas o armazenamento de tabela que é considerado. Se você usa índices em que a coluna int faz parte de uma chave composta, naturalmente deseja que as páginas de índice sejam o mais completas possível, sendo isso o resultado de as entradas de índice serem as menores possíveis.

    Eu definitivamente esperaria descobrir que examinar entradas de índice em páginas BTREE seria um pouco mais rápido com tipos de dados menores. No entanto, quaisquer VARCHARs envolvidos em entradas de índice compensariam (anulariam) os ganhos de desempenho do uso de TINYINT sobre INT.

    Não obstante, se as entradas de índice tiverem entradas compostas e todas forem números inteiros, quanto menores forem os números inteiros, melhor e mais rápido.

    • 14
  4. Fabricio Araujo
    2012-06-28T12:48:03+08:002012-06-28T12:48:03+08:00

    Todas as coisas se tornam complexas quando os bancos de dados ficam maiores:

    • as janelas de manutenção precisam ser ampliadas ou reprogramadas
    • backups (o backup completo no final do dia se torna um consumidor de tempo absurdo, então você precisa de backups diferenciais ou mesmo de log e faça o backup completo uma vez por semana, talvez uma vez por mês)
    • performances manutenções se torna um consumidor de tempo (criar um índice em uma tabela de vários milhões de linhas não leva um tempo trivial para ser executado) e precisa ser reprogramado e fica pior se a tabela for grande ...
    • E transmitir esse backup de 100Gb pela rede não é o que eu chamo de moleza - especialmente se a rede (por algum motivo desconhecido) for teimosa em deixar cair a conexão na marca de 75Gb... (aconteceu com uma instalação que eu estava trabalhando nisso estava fazendo backup em uma unidade mapeada na rede)...

    E que tipos de dados têm a ver com isso? TUDO. O uso de tamanhos de linha maiores do que o necessário faz com que as páginas do banco de dados sejam preenchidas antes do necessário ou até mesmo desperdiçando espaço se o tamanho da linha for tal que não seja possível gravar mais de um registro na página. O resultado é mais páginas necessárias para serem escritas e lidas, mais memória RAM é usada para armazenar em cache (registros maiores precisam de mais memória). E como seus tipos de dados são especificados maiores do que o necessário do disco, seus índices sofrerão o mesmo problema - especialmente se você agrupar essa chave primária composta de 2 colunas BIGINT, pois quaisquer outros índices criados copiarão essa chave primária implicitamente em sua definição.

    Se você sabe que algumas colunas em uma tabela que terá milhões de linhas ou até mesmo uma pequena tabela que será FK'ed para vários milhões de linhas que não precisa de um inteiro de 4 bytes para armazenar seus dados, mas um de 2 bytes seria basta - use SMALLINT . Se os valores no intervalo de 0 a 255 forem suficientes, TINYINT . Uma bandeira Sim/Não? Tem BIT .

    • 14
  5. yoel halb
    2012-08-24T17:43:56+08:002012-08-24T17:43:56+08:00

    Enquanto para tinyintvs intexistem diferenças claras, como espaço em disco, divisões de página e tempo de manutenção, não haveria nenhuma delas para varchar.

    Então, por que não declarar todos os campos de texto como varchar(4000), já que ele usará apenas o espaço necessário? Ainda mais você terá a garantia de que seus dados nunca serão truncados.

    A resposta é claro:

    1. Esclarecimento de suas intenções (já que ninguém entenderá por que um campo de nome deve ter 4.000 caracteres)
    2. Validação, pois você deseja garantir que ninguém insira uma biografia inteira como nome.

    Essas mesmas razões se aplicam tinyinttambém.

    • 9

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

    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