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 / 157696
Accepted
Fza
Fza
Asked: 2016-12-10 08:07:32 +0800 CST2016-12-10 08:07:32 +0800 CST 2016-12-10 08:07:32 +0800 CST

Método mais rápido para invalidar estatísticas

  • 772

Estou fazendo alguns testes em atualizações automáticas de estatísticas sincronizadas e assíncronas. Eu gostaria de invalidar rapidamente todos os objetos estatísticos (cabeçalhos, vetores de densidade e histogramas) para garantir que na próxima vez que a estatística for usada, ela será atualizada .

Estou tentando simular uma atualização automática de estatísticas, não uma criação automática.

Idealmente, não quero alterar a contagem de linhas, por isso descartei INSERT/DELETEas operações. Idealmente, também não quero alterar nenhum valor de dados, considerei o uso UPDATEde instruções, mas acho que isso pode demorar muito em algumas das minhas tabelas maiores.

Eu tinha olhado, UPDATE STATISTICS WITH ROWCOUNT, PAGECOUNTmas não acho que é isso que estou procurando. Eu esperava que houvesse talvez um sinalizador de rastreamento ou comando não documentado que invalidasse as estatísticas.

Existe uma maneira rápida e eficiente de fazer o que quero alcançar que não considerei?

Estou testando no SQL Server 2016.

sql-server sql-server-2016
  • 3 3 respostas
  • 439 Views

3 respostas

  • Voted
  1. Best Answer
    Paul White
    2016-12-11T20:30:47+08:002016-12-11T20:30:47+08:00

    A sequência mais confiável que posso encontrar para causar uma atualização automática de estatísticas é:

    1. Atualizar estatísticas com amostragem zero de linhas
      Isso resulta em um objeto de estatística vazio.

      -- Example
      UPDATE STATISTICS 
          Person.[Address] 
          IX_Address_StateProvinceID 
          WITH SAMPLE 0 ROWS;
      
    2. Atualize a(s) coluna(s) de destino em uma única linha da tabela
      Isso incrementa o contador de modificação da coluna. A combinação de um objeto de estatísticas vazio e um contador de modificação incrementado permite uma atualização de estatísticas de caso especial (simula a criação de estatísticas em uma tabela vazia e, em seguida, a adição de uma linha).

      -- Example
      BEGIN TRANSACTION;
          UPDATE TOP (1) 
              Person.[Address] 
          SET StateProvinceID = StateProvinceID;
      ROLLBACK TRANSACTION;
      
    3. Execute a consulta com OPTION (RECOMPILE)
      Isso causa uma atualização automática das estatísticas desatualizadas detectadas, mesmo se um plano correspondente para a consulta já estiver presente no cache. A atualização de estatísticas resultante causará subseqüentemente uma recompilação baseada em otimização para o plano original em cache, se for correspondido novamente.

      -- Example
      SELECT
          A.City,
          A.AddressLine1,
          A.AddressLine2
      FROM Person.[Address] AS A
      WHERE
          1 = 1
          AND A.StateProvinceID = 54
      OPTION (RECOMPILE);
      

    Demonstração

    Usando uma consulta AdventureWorks semelhante à usada na resposta de jyao , o script a seguir reúne tudo acima:

    DBCC FREEPROCCACHE;
    GO
    -- Cache a plan for the query
    GO
    SELECT
        A.City,
        A.AddressLine1,
        A.AddressLine2
    FROM Person.[Address] AS A
    WHERE
        1 = 1
        AND A.StateProvinceID = 54;
    GO
    DBCC SHOW_STATISTICS 
    (
        'Person.Address', 
        'IX_Address_StateProvinceID'
    ) WITH STAT_HEADER;
    GO
    -- Empty stats object
    UPDATE STATISTICS 
        Person.[Address] 
        IX_Address_StateProvinceID 
        WITH SAMPLE 0 ROWS;
    GO
    -- Perform and rollback a single row update
    BEGIN TRANSACTION;
        UPDATE TOP (1) 
            Person.[Address] 
        SET StateProvinceID = StateProvinceID;
    ROLLBACK TRANSACTION;
    GO
    DBCC SHOW_STATISTICS 
    (
        'Person.Address', 
        'IX_Address_StateProvinceID'
    ) WITH STAT_HEADER;
    GO
    -- Run the query again to trigger stats update
    GO
    SELECT
        A.City,
        A.AddressLine1,
        A.AddressLine2
    FROM Person.[Address] AS A
    WHERE
        1 = 1
        AND A.StateProvinceID = 54
    OPTION (RECOMPILE);
    GO
    DBCC SHOW_STATISTICS 
    (
        'Person.Address', 
        'IX_Address_StateProvinceID'
    ) WITH STAT_HEADER;
    GO
    

    Resultado

    Os DBCC SHOW_STATISTICSresultados mostram o cabeçalho de estatísticas original, o cabeçalho vazio e o cabeçalho atualizado desejado no final do processo:

    <code>DBCC SHOW_STATISTICS</code> resultados

    • 7
  2. jyao
    2016-12-10T10:30:44+08:002016-12-10T10:30:44+08:00

    Não tenho certeza se o método a seguir atenderá às suas necessidades, eu diria que você pode tentar fazer isso:

    update statistics <your_table_name> with sample 0 rows
    

    Isso realmente apagará todas as informações em suas estatísticas (que são os próprios objetos do servidor sql e ainda estão lá, ou seja, NÃO excluirá as próprias estatísticas)

    De acordo com MSDN

    Recomendamos não especificar 0 PORCENT ou 0 ROWS. Quando 0 PERCENT ou ROWS é especificado, o objeto de estatísticas é atualizado, mas não contém dados estatísticos.

    Para mim, esvaziar suas estatísticas pode ser considerado uma forma de "invalidar" suas estatísticas. :-)

    [ Update ] Fiz um teste rápido no SQL2014 da seguinte forma:

    use AdventureWorks2014
    dbcc show_statistics ('person.address', 'IX_Address_StateProvinceID')
    

    e eu posso ver o seguinte

    Estatísticas originais

    e eu posso executar o seguinte

    select city, addressline1, addressline2 from person.address where StateProvinceID = 54
    

    Receberei um Plano de Execução da seguinte forma

    Plano de execução com estatísticas

    agora vou fazer o seguinte

    update statistics person.address  with sample 0 rows
    dbcc show_statistics ('person.address', 'IX_Address_StateProvinceID')
    

    e eu verei as estatísticas serem apagadas.

    stats_gone

    Agora se eu correr

    dbcc freeproccache
    dbcc dropcleanbuffers
    select city, addressline1, addressline2 from person.address where StateProvinceID = 54
    

    Vou obter um plano Exec diferente.

    new_exec_plan

    • 5
  3. Fza
    2016-12-11T12:43:23+08:002016-12-11T12:43:23+08:00

    Outro método que acabou de me ocorrer e que não considerei inicialmente é usar uma atualização sem atualização para modificar apenas as linhas suficientes para acionar o limite que poderia ser alcançado usando algo semelhante ao T-SQL abaixo:

    UPDATE TOP (31465) AdventureWorks2012.Sales.SalesOrderHeader
    SET ShipMethodID = ShipMethodID;
    GO
    
    • 1

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