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 / 154945
Accepted
Adrian S
Adrian S
Asked: 2016-11-12 03:22:05 +0800 CST2016-11-12 03:22:05 +0800 CST 2016-11-12 03:22:05 +0800 CST

Manutenção de índice para varbinary

  • 772

Temos um banco de dados SQL 2016 que possui uma tabela de linhas de 1,9 bilhão que possui uma coluna varbinary(255) que usamos para armazenar os HashBytes de um campo nvarchar(2000) na mesma tabela.

Temos um índice não clusterizado no campo varbinary e nossos scripts de manutenção de índice executam um REORGANIZE nele a cada 2-3 dias. Mas isso leva mais de 10 horas para ser concluído.

Alguma maneira de melhorar a velocidade de manutenção do índice para campos varbinary?

sql-server index
  • 3 3 respostas
  • 2589 Views

3 respostas

  • Voted
  1. Best Answer
    Brent Ozar
    2016-11-12T03:37:48+08:002016-11-12T03:37:48+08:00

    Se você tiver uma tabela com 1,9 bilhão de linhas, suponho que tenha uma taxa de alteração bastante baixa como porcentagem. Verifique quantas linhas você está realmente inserindo/atualizando diariamente - é provável que seja menos de 1%.

    Nesse caso, não faz sentido reorganizar toda a tabela a cada 2-3 dias (especialmente considerando que leva mais de 10 horas). Tamanho.

    Comece dando um passo para trás e perguntando: "Qual é o problema que estou tentando resolver fazendo reorganizações de índice?" Se a resposta for instruções de seleção lenta, a manutenção do índice em uma tabela de linhas de 1,9 bilhão não será a resposta.

    • 5
  2. Mark Storey-Smith
    2016-11-12T04:16:33+08:002016-11-12T04:16:33+08:00

    De acordo com o comentário, minha pergunta sobre o uso foi porque eu esperava que esse índice existisse para verificar os registros existentes, ou seja, pesquisas de singleton, sem comportamento de verificação. Com isso em mente, concordo com @BrentOzar que reorganizar com tanta frequência provavelmente não trará nenhum benefício tangível. Desligue-o e veja se o desempenho do ETL piora, suspeito que não.

    Se houver escopo para modificar o processo ETL, eu procuraria despejar o VARBINARYhash e substituí-lo por BIGINT. Eu uso um arranjo semelhante em um processo ETL de datawarehouse:

    CAST(HASHBYTES('SHA1', longstring) AS BIGINT)
    

    Neste caso de uso, as colisões resultantes do truncamento não são um problema. O hash é usado para verificar se uma linha já existe por meio de um índice composto por chaves de 8 bytes em vez de um índice de 255 bytes ou verificando uma tabela contendo a coluna de 4000 bytes. Se a verificação não resultar em nenhuma linha, você insere. Se houver uma correspondência no hash, faça a comparação no texto bruto para determinar se você tem uma linha existente ou precisa inserir.

    • 3
  3. Solomon Rutzky
    2016-11-12T06:18:46+08:002016-11-12T06:18:46+08:00

    Qual é o FILLFACTORíndice NonClustered? Qual algoritmo de hash você está usando? Esse índice foi PAD_INDEXdefinido como ON? Qual é a definição do índice agrupado (incluindo tipos de dados de coluna)?

    Tudo isso nos dará uma imagem mais clara da composição física do índice.

    Que outras operações estão ocorrendo? Ou seja, você atualiza a NVARCHAR(2000)coluna? Você exclui muitas linhas? As únicas coisas que devem aumentar a fragmentação são: inserções regulares (já que o hash é efetivamente ordenado "aleatoriamente"), atualizações no NVARCHARcampo, pois isso alterará o valor (mas não o tamanho) do hash e MUITAS exclusões.

    As respostas a essas perguntas nos darão uma compreensão mais clara de como/por que a fragmentação está aumentando.

    Além disso, fora do nível de fragmentação atingindo o limite padrão para o script de Ola recomendar a desfragmentação, você notou alguma degradação no desempenho do ETL quando não desfragmentou?

    Além disso, eu também teria cuidado ao converter o valor de hash para BIGINTdado que BIGINTé apenas 8 bytes, mas todos os algoritmos de hash - mesmo MD5 - são maiores que 8 bytes ( MD5 = 16 bytes, SHA1 = 20, SHA2_256 = 32 e SHA2_512 = 64). E converter valores binários maiores que 8 bytes para BIGINTtruncar silenciosamente os valores, portanto, você perde a precisão e aumenta as ocorrências de falsos positivos. A consulta a seguir mostra esse comportamento:

    SELECT CONVERT(BIGINT, 0xFFFFFFFFFFFFFF),      --  7 bytes = 72057594037927935
           CONVERT(BIGINT, 0xFFFFFFFFFFFFFFFF),    --  8 bytes = -1
           CONVERT(BIGINT, 0xFFFFFFFFFFFFFFFFFF),  --  9 bytes = -1
           CONVERT(BIGINT, 0xFFFFFFFFFFFFFFFFFFFF) -- 10 bytes = -1
    

    Obviamente, de acordo com a explicação de uso do @Marks, é possível que esse truncamento apenas aumente a frequência de comparação completa do NVARCHARcampo. Ainda assim, deve-se estar ciente do comportamento, pois é um truncamento silencioso (ou seja, não óbvio).

    • 1

relate perguntas

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

  • Quanto "Padding" coloco em meus índices?

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

  • O que significa "índice" em RDBMSs? [fechado]

  • Como criar um índice condicional no MySQL?

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