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 / 6697
Accepted
HunterX3
HunterX3
Asked: 2011-10-12 04:13:30 +0800 CST2011-10-12 04:13:30 +0800 CST 2011-10-12 04:13:30 +0800 CST

Design de tabela grande SQL

  • 772

Eu tenho uma pergunta geral sobre o design de tabelas do SQL Server 2008. Atualmente, temos uma mesa com mais de 600 GB e que cresce cerca de 3 GB por dia. Esta tabela tem os indecis apropriados, mas está se tornando um grande problema ao executar consultas e apenas por causa de seu tamanho. A questão é se devo dividir a tabela em várias tabelas por ano e mês (isso se encaixaria em como outros departamentos dividem seus grandes conjuntos de dados) ou devemos aproveitar o particionamento integrado ao SQL Server. Parece que usar o particionamento exigiria menos alterações de código. Pelo que li ao particionar, você ainda consulta apenas uma tabela e o servidor lida com como obter os dados. Se seguíssemos a rota de várias tabelas, teríamos que lidar com a extração de dados de várias tabelas.

sql-server-2008 database-design
  • 4 4 respostas
  • 3559 Views

4 respostas

  • Voted
  1. Best Answer
    Brent Ozar
    2011-10-12T05:09:35+08:002011-10-12T05:09:35+08:00

    "Esta tabela tem os indecis apropriados, mas está se tornando um grande problema ao executar consultas"

    O particionamento sozinho não ajuda no desempenho da consulta, a menos que o SQL Server seja capaz de eliminar as partições ao executar uma consulta. Sua cláusula WHERE precisa estar alinhada com a maneira como você particiona. Obtemos apenas um campo para usar como um campo de particionamento, portanto, se esse campo não estiver incluído em sua cláusula WHERE, é provável que você verifique a tabela inteira, apesar de ter partições.

    "e apenas por causa de seu tamanho."

    O particionamento pode facilitar certas operações de manutenção, mas ainda há coisas que não podemos fazer partindo por partição. Se a manutenção do índice e as atualizações de estatísticas estiverem causando problemas, é melhor dividir o design em uma tabela de arquivo e uma tabela atualizada ao vivo. Quando você precisa mover dados periodicamente da tabela ao vivo para a tabela de arquivo, faça isso, reconstrua os índices com fator de preenchimento de 100%, atualize as estatísticas com varredura completa e, em seguida, defina seu grupo de arquivos como somente leitura. O particionamento pode ajudar com as cargas da tabela de arquivo - mas o particionamento da tabela ao vivo pode não. (Estou lançando vários conceitos avançados aqui como se fosse rápido e simples, mas estou apenas esboçando alguns antecedentes aqui.)

    "Parece que usar o particionamento exigiria menos alterações de código."

    Mais ou menos - parece assim à primeira vista, mas quanto mais você se aprofunda, você tem opções como exibições particionadas. Você pode renomear a tabela existente, colocar uma exibição em seu lugar e, em seguida, fazer suas próprias alterações nas tabelas subjacentes (e adicionar várias tabelas) sem alterar seu aplicativo.

    Eu escrevi mais sobre as armadilhas do particionamento aqui:

    http://www.brentozar.com/archive/2008/06/sql-server-partitioning-not-the-answer-to-everything/

    • 11
  2. Mark Storey-Smith
    2011-10-12T04:47:32+08:002011-10-12T04:47:32+08:00

    O particionamento isolado pode ser suficiente, mas você pode obter melhores resultados combinando com exibições particionadas e várias tabelas. Depende muito do padrão de consulta e crescimento.

    A limitação atual com o particionamento é que as estatísticas de coluna são mantidas apenas em uma tabela, em vez de nível de partição. Se você tiver um padrão de consulta que se beneficie de estatísticas mais precisas, a combinação de particionamento de tabela com exibições particionadas pode gerar benefícios de desempenho significativos.

    Onde a natureza de seus dados varia de mês a mês, ano a ano, as exibições particionadas também podem ajudar. Imagine um varejista que mudou suas linhas de produtos continuamente, de forma que há pouca consistência nas faixas de Product.ProductId em uso de ano para ano. Com uma única tabela de detalhes do pedido/pedido e, portanto, um único histograma de estatísticas, as estatísticas oferecerão pouco ao otimizador de consulta. Uma tabela por ano (Order_2010, Order_2011, OrderLine_2010, OrderLine_2011) particionada por mês e combinada com exibições particionadas (Order, OrderLine) fornecerá estatísticas mais granulares e potencialmente úteis para o otimizador.

    Você pode introduzir o particionamento de tabela com relativamente pouco esforço, então comece por aí, meça o impacto e depois avalie se as exibições particionadas valeriam o esforço adicional.

    Kimberly Tripp publicou muitas orientações e white papers sobre particionamento que geralmente são considerados leitura obrigatória sobre o assunto. Kendra Little também tem um bom material e uma lista de referência útil de outros artigos

    O desempenho geralmente é o motivo número 1 para as pessoas procurarem o particionamento. Pessoalmente, vejo as melhorias no tempo de recuperação como um benefício igual ou maior com um VLDB. Reserve algum tempo para entender a disponibilidade parcial e a restauração fragmentada antes de começar, pois isso pode influenciar a abordagem adotada.

    Se você tiver o processo não ideal, mas não incomum, de enviar backups pela rede, poderá estar procurando um tempo de restauração de 3 horas para seus 600 GB atuais. Em um ano em que você ultrapassou 1,5 TB, você tem um problema.

    • 7
  3. Matt M
    2011-10-12T04:41:37+08:002011-10-12T04:41:37+08:00

    Como você disse, você tem duas opções aqui:

    1. Utilizar várias tabelas
    2. Utilizar o particionamento

    Com 1, você pode criar uma VIEW que une todas essas tabelas e apenas atualizá-la para incluir tabelas recém-criadas. Eu considero isso realmente uma maneira de emular o particionamento. As vantagens desse método incluem não exigir a Enterprise Edition do SQL Server.

    Com 2, você pode alinhar seus índices às suas partições e alinhar suas partições a diferentes armazenamentos. Depois de configurar sua função de partição e esquema de partição, isso é feito para você quando você divide ou mescla partições. As vantagens desse método incluem não ser necessário mover registros manualmente para uma nova tabela. Já que a função de partição e o esquema de partição cuidam disso para você. Além disso, como você disse, há pouca ou nenhuma alteração de código necessária para acessar os dados.

    Se você tiver o Enterprise Edition, eu definitivamente daria uma olhada no particionamento. Apesar de parecer complexo, não é tão ruim assim. Caso contrário, o particionamento nem é uma opção para você.

    Criando Tabelas Particionadas

    Modificando Tabelas Particionadas

    Projetando partições para gerenciar subconjuntos de dados

    Espero que isto ajude,

    Matt

    • 1
  4. gb.
    2011-10-12T06:33:45+08:002011-10-12T06:33:45+08:00

    Pela sua pergunta, você parece estar armazenando dados históricos (logs) e sua limitação parece vir da velocidade da consulta, não de problemas de armazenamento. Para mim, a partição não ajudará.

    Quando você diz que tem índices adequados, isso inclui um índice no campo de data? Tive bons resultados usando index on trunc(timestamp, day) com Postgres. Em seguida, você deve garantir que todas as consultas sejam selecionadas no dia anterior a qualquer outra manipulação. Tenha cuidado, um timestamp com campo de fuso horário não é indexável (porque ele "se move" dependendo do fuso horário), então você precisa de um timestamp "fixo" para ser indexado.

    • 0

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