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 / 282281
Accepted
Dirk Boer
Dirk Boer
Asked: 2020-12-30 01:47:25 +0800 CST2020-12-30 01:47:25 +0800 CST 2020-12-30 01:47:25 +0800 CST

Fragmentação de índice clusterizado vs índice com fragmentação de colunas incluídas

  • 772

Eu tenho uma tabela relativamente grande (para mim) com 40 milhões de linhas que deve crescer para 80 a 120 milhões de linhas em um período de duas semanas (durante uma campanha).

Tip
--------------
Id          int (clustered index)
UserId      int
TipIndex    smallint
Value       binary(8)
LastChanged datetime2(3)
  • cada usuário tem entre 1 a 400 pontas que serão inseridas aleatoriamente durante este período
  • UserId + TipIndex é único
  • Eu nunca consulto dicas diretamente na chave de identidade (id)
  • 99% das vezes que consulto no UserId
  • Eu preciso de todas as colunas
  • Costumo consultar 1 UserId (por visualização de página), às vezes em lotes de 10.000s para estatísticas
  • este é um site de alto tráfego durante esse período e deve ser capaz de lidar com 30.000 consultas no UserId por minuto
  • Id é no momento meu Clustered Index, porque li que leva à menor fragmentação.

Então estou hospedando no SQL Azure e o Azure já recomendo adicionar um Index com colunas inclusas. Sempre hesitei em usar UserId,TipIndex como um índice clusterizado, pois as dicas serão adicionadas aleatoriamente. O que significa que tenho medo de grandes problemas de fragmentação etc.

Minhas perguntas:

  • Um índice com colunas incluídas não tem exatamente o mesmo problema?
  • Uma tabela com colunas incluídas não é exatamente o mesmo que uma "tabela sombra" com os mesmos problemas de fragmentação?
  • Devo migrar para usar UserId, TipIndex como ClusteredIndex em vez de Id?
  • Como evitar a fragmentação?

Eu sei que no final a resposta é sempre "depende" ou que eu deveria medir. Mas como sou um desenvolvedor solo e não tenho muitos recursos, espero alguém com mais experiência que tenha um pressentimento para isso, então minhas primeiras tentativas têm uma chance maior de ir na direção certa.

sql-server performance
  • 2 2 respostas
  • 297 Views

2 respostas

  • Voted
  1. Rob Farley
    2020-12-30T04:06:31+08:002020-12-30T04:06:31+08:00

    Suas perguntas:

    Um índice com colunas incluídas não tem exatamente o mesmo problema?

    Sim.

    Uma tabela com colunas incluídas não é exatamente o mesmo que uma "tabela sombra" com os mesmos problemas de fragmentação?

    Sim

    Devo migrar para usar UserId, TipIndex como ClusteredIndex em vez de Id?

    Eu faria, sim.

    Como evitar a fragmentação?

    Existem alguns tipos diferentes de fragmentação a serem considerados. Uma é quando você tem apenas parte de suas páginas sendo usadas porque você teve divisões de página. Se você tiver muitas inserções, isso acontecerá. Não se estresse muito. A outra é quando você tem páginas em que a página subsequente está em uma extensão diferente. Novamente, eu não me preocuparia muito. Se seus dados estiverem principalmente no cache de buffer, não importa se eles se movem entre as extensões.

    Então... não se preocupe muito com isso. Mas não se preocupe em ter uma cópia completa dos dados de uma forma que você não vai realmente consultá-los.

    • 7
  2. Best Answer
    Learning_DBAdmin
    2020-12-30T04:11:12+08:002020-12-30T04:11:12+08:00

    Parece que você está muito preocupado com a fragmentação, desde que você continue atualizando as estatísticas regularmente, a fragmentação não deve incomodá-lo muito para o desempenho. Você pode ler mais detalhes sobre isso em um vídeo compartilhado pelo Sr. Brent Ozar e também em outra página aqui . Deixe-me tentar responder sua pergunta uma a uma:

    Um índice com colunas incluídas não tem exatamente o mesmo problema?

    Índice com colunas no include ou seja uma coluna chave, não difere muito. As colunas-chave farão parte da árvore B, enquanto as colunas de inclusão não são, no entanto, quando você executa qualquer operação de inserção/atualização/exclusão, isso terá a mesma despesa, pois essas colunas precisam ser atualizadas/inseridas/excluídas.

    Uma tabela com colunas incluídas não é exatamente o mesmo que uma "tabela sombra" com os mesmos problemas de fragmentação?

    Não tenho muita certeza do que você quis dizer com tabela de sombra, se você quis dizer com tabela base aqui, sim, você teria o mesmo problema no que diz respeito à fragmentação.

    Devo migrar para usar UserId, TipIndex como ClusteredIndex em vez de Id?

    De acordo com sua declaração - "99% das vezes que consulto no UserId", este é um bom candidato para coluna clusterizada de chave primária. Como você não usará a coluna Id com muita frequência, não vejo nenhum problema em usar a chave agrupada primária composta na forma de UserId e TipIndex. Em termos de tamanho do índice, é tão bom quanto Id(int --> 4 byte) mais uma coluna adicional do tipo tinyint(1 byte).

    Por favor, entenda que a chave clusterizada nada mais é do que a ordem dos dados armazenados logicamente e não tem nenhuma existência física ao contrário da chave não clusterizada.

    Como evitar a fragmentação?

    Eu diria que a atualização das estatísticas deve ser considerada com prioridade do que a fragmentação. Você pode usar o script de manutenção usado por muitos DBAs em todo o mundo de Ola Hallengren. Você pode agendá-lo semanalmente ou quinzenalmente conforme sua necessidade.

    Espero que isto ajude.

    • 6

relate perguntas

  • Quais são as principais causas de deadlocks e podem ser evitadas?

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

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