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 / 127096
Accepted
user541852587
user541852587
Asked: 2016-01-24 05:29:20 +0800 CST2016-01-24 05:29:20 +0800 CST 2016-01-24 05:29:20 +0800 CST

O otimizador de consulta irá ignorar um índice fragmentado?

  • 772

Cenário: Tenho uma tabela OLTP pesada com um índice. Vejo muitas inserções, atualizações e exclusões e o índice fragmenta-se fortemente em um dia ou menos. Enquanto no primeiro dia da criação do índice, o otimizador usa o índice, no segundo ou terceiro dia, o otimizador o ignora totalmente. Isso é exatamente para a mesma consulta.

Pergunta na minha cabeça: por que alguns planos de consulta pulariam o índice, já que o índice é criado para ajudar a otimizar esses planos?

Pergunta para esta postagem: o otimizador pode ignorar um índice altamente fragmentado, como um cenário em que temos 1 bilhão de registros e um índice é criado e, duas horas depois, todos os bilhões de registros são removidos e temos quinhentos milhões de novos registros?

Estou começando a pensar que adicionar um índice a esta tabela não ajudará em nada, devido à natureza da tabela (dados entram rapidamente, dados saem rapidamente), mas só quero entender por que um dia, o otimizador irá usar o índice em seus planos, mas dia dois, não.

sql-server sql-server-2012
  • 2 2 respostas
  • 639 Views

2 respostas

  • Voted
  1. Best Answer
    usr
    2016-01-24T06:53:28+08:002016-01-24T06:53:28+08:00

    AFAIK, o otimizador não está ciente da fragmentação do índice. Isso pode ser um problema se ele escolher um plano que verifique um índice fragmentado.

    No entanto, o otimizador está ciente do tamanho dos dados alocados. Se as páginas de índice tiverem muito espaço livre (possivelmente devido à fragmentação interna), isso torna o índice menos provável de ser usado. 50% de espaço vazio significa o dobro da quantidade de E/S para escanear. No entanto, para acesso aleatório, isso não deve importar de forma significativa.

    Este não é um grande efeito, no entanto. Isso pode explicar o que você está vendo.

    Se esse pequeno efeito inverter o plano de consulta para não usar o índice, o índice nunca foi muito bom aos olhos do otimizador de consulta. Isso pode ser uma dica de que você pode melhorá-lo.

    Além disso, o otimizador parece ter uma estimativa de quanto do índice é armazenado em cache no buffer pool. Existem algumas referências a isso nos planos de execução do XML. Não tenho conhecimento detalhado disso.

    Estou começando a pensar que adicionar um índice a esta tabela não ajudará em nada

    Eu não iria tão longe. Talvez tudo o que você precisa seja uma reconstrução ou uma sequência drop-DML-create nos lugares certos? Ou talvez seja apenas um problema de ajuste de consulta (faça uma nova pergunta com o plano de execução real incluído).

    • 6
  2. Vladimir Baranov
    2016-01-25T03:53:27+08:002016-01-25T03:53:27+08:00

    A primeira coisa que vem à mente são as estatísticas desatualizadas, não a fragmentação do índice como tal.

    Logo após o índice ser (re)construído, as estatísticas associadas ao índice são precisas; o intervalo do histograma abrange todos os valores. À medida que os dados mudam na tabela, as estatísticas não são atualizadas imediatamente. Não me lembro agora dos limites exatos, ou seja, quantas linhas devem ser excluídas/inseridas antes que a atualização automática das estatísticas seja realizada.

    Observei um comportamento semelhante em nosso sistema. O fluxo de trabalho simplificado em nosso sistema é o seguinte.

    Temos uma tabela com cerca de 100 milhões de linhas que contém dados de N dias. Durante o dia, novas linhas são adicionadas com datetimevalores crescentes em uma coluna indexada. Os dados são adicionados ao longo do dia em lotes (geralmente 1K-10K por vez). À meia-noite, o procedimento de manutenção exclui todos os valores anteriores a N dias e reconstrói o índice.

    Além disso, durante o dia, a cada 10 minutos, outro procedimento resume os dados e atualiza o resumo em outra tabela que contém dados menos detalhados, mas que são mantidos por mais tempo.

    Percebi que o desempenho do procedimento de resumo era bom pela manhã, mas piorava no final do dia. Verifiquei os planos de execução e vi que eram diferentes. A mesma consulta que roda de manhã e à tarde tinha planos diferentes (usei OPTION(RECOMPILE)).

    Portanto, adicionei um procedimento para atualizar as estatísticas relevantes ao longo do dia sem depender de limites integrados.

    CREATE PROCEDURE [dbo].[RebuildStatisticsOnMyTable]
    WITH EXECUTE AS OWNER
    AS
    BEGIN
        SET NOCOUNT ON;
        BEGIN TRY
            UPDATE STATISTICS [dbo].[MyTableStats] ([IX_ImportantIndex], [IX_AnotherIndex]);
        END TRY
        BEGIN CATCH
            -- handle errors
            ...
        END CATCH;
    END
    

    Com essas atualizações periódicas de estatísticas ao longo do dia, o desempenho do procedimento de resumo é bom e estável. Tive que experimentar um pouco e encontrei o período adequado para atualizar as estatísticas.

    Isso é no SQL Server 2008 e, até onde eu sei, também se aplica a 2012. 2014 tem um estimador de cardinalidade diferente e aprimorado, que (pelo que entendi) pode efetivamente extrapolar as estatísticas e produzir previsões decentes em casos de linhas adicionadas com registros de data e hora crescentes que vão além do intervalo do histograma de estatísticas. Não me lembro agora onde vi a descrição detalhada disso. Provavelmente foi uma postagem de blog de Paul White ou Aaron Bertrand. Portanto, é provável que, se atualizarmos para 2014, não haja necessidade dessas atualizações forçadas de estatísticas ao longo do dia.

    • 3

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