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 / 228656
Accepted
Randi Vertongen
Randi Vertongen
Asked: 2019-02-02 01:02:33 +0800 CST2019-02-02 01:02:33 +0800 CST 2019-02-02 01:02:33 +0800 CST

Por que a estatística criada automaticamente nesta coluna está vazia?

  • 772

Informações

Minha pergunta está relacionada a uma tabela moderadamente grande (~ 40 GB de espaço de dados) que é um heap
(infelizmente, não tenho permissão para adicionar um índice clusterizado à tabela pelos proprietários do aplicativo)

Uma estatística criada automaticamente em uma coluna Identidade ( ID) foi criada, mas está vazia.

  • As estatísticas de criação automática e as estatísticas de atualização automática estão ativadas
  • Modificações aconteceram na tabela
  • Existem outras estatísticas (criadas automaticamente) que estão sendo atualizadas
  • Há outra estatística na mesma coluna criada por um índice (duplicado)
  • Compilação: 12.0.5546

A estatística duplicada está sendo atualizada: insira a descrição da imagem aqui

A pergunta real

No meu entendimento, todas as estatísticas podem ser usadas e as modificações são rastreadas, mesmo se houver duas estatísticas exatamente nas mesmas colunas (duplicadas), então por que essa estatística permanece vazia?

Informações de estatísticas

insira a descrição da imagem aqui

Informações estatísticas do banco de dados

insira a descrição da imagem aqui

Tamanho da tabela

insira a descrição da imagem aqui

Coluna Informações em que a estatística é criada

insira a descrição da imagem aqui

[ID] [int] IDENTITY(1,1) NOT NULL

Coluna de identidade

select * from sys.stats  
where name like '%_WA_Sys_0000000A_6B7099F3%';

insira a descrição da imagem aqui Criado automaticamente

Obtendo algumas informações sobre outra estatística

select * From sys.dm_db_stats_properties (1802541555, 3)  

insira a descrição da imagem aqui

Em comparação com minha estatística vazia:

insira a descrição da imagem aqui

Estatísticas + Histograma de "gerar scripts":

/****** Object:  Statistic [_WA_Sys_0000000A_6B7099F3]    Script Date: 2/1/2019 10:18:19 AM ******/

    CREATE STATISTICS [_WA_Sys_0000000A_6B7099F3] ON [dbo].[table]([ID]) WITH STATS_STREAM = 0x01000000010000000000000000000000EC03686B0000000040000000000000000000000000000000380348063800000004000A00000000000000000000000000

Ao criar uma cópia das estatísticas, nenhum dado está dentro

CREATE STATISTICS [_WA_Sys_0000000A_6B7099F3_TEST] ON [dbo].[table]([ID]) WITH STATS_STREAM = 0x01000000010000000000000000000000EC03686B0000000040000000000000000000000000000000380348063800000004000A00000000000000000000000000

insira a descrição da imagem aqui

Ao atualizar manualmente as estatísticas, elas são atualizadas.

UPDATE STATISTICS [dbo].[Table]([_WA_Sys_0000000A_6B7099F3_TEST])

insira a descrição da imagem aqui

sql-server sql-server-2014
  • 1 1 respostas
  • 1028 Views

1 respostas

  • Voted
  1. Best Answer
    Paul White
    2019-02-02T04:15:45+08:002019-02-02T04:15:45+08:00

    Consegui reproduzir isso, tanto com uma estatística vazia quanto com uma estatística preenchida. Eu providenciei para que uma estatística automática fosse criada em uma tabela vazia, e o índice foi criado posteriormente:

    IF OBJECT_ID(N'dbo.Heap', N'U') IS NOT NULL
    BEGIN
        DROP TABLE dbo.Heap;
    END;
    GO
    CREATE TABLE dbo.Heap 
    (
        id integer NOT NULL IDENTITY,
        val integer NOT NULL,
    );
    GO
    -- Add 1000 rows
    INSERT dbo.Heap
        WITH (TABLOCKX)
        (val)
    SELECT
        SV.number
    FROM master.dbo.spt_values AS SV
    WHERE
        SV.[type] = N'P'
        AND SV.number BETWEEN 1 AND 1000;
    GO
    SELECT COUNT_BIG(*) 
    FROM dbo.Heap AS H
    JOIN dbo.Heap AS H2
        ON H2.id = H.id
    WHERE H.id > 0
    AND H2.id > 0;
    GO
    -- Empty table
    TRUNCATE TABLE dbo.Heap;
    GO
    -- Repeat exact same query (RT = 500 + 0.2 * 1000 = 700)
    GO
    SELECT COUNT_BIG(*) 
    FROM dbo.Heap AS H
    JOIN dbo.Heap AS H2
        ON H2.id = H.id
    WHERE H.id > 0
    AND H2.id > 0;
    GO
    -- Add 1000 rows
    INSERT dbo.Heap
        WITH (TABLOCKX)
        (val)
    SELECT
        SV.number
    FROM master.dbo.spt_values AS SV
    WHERE
        SV.[type] = N'P'
        AND SV.number BETWEEN 1 AND 1000;
    GO
    -- Add index
    ALTER TABLE dbo.Heap ADD 
        CONSTRAINT [PK dbo.Heap id]
        PRIMARY KEY NONCLUSTERED (id);
    GO
    SELECT
        S.[name],
        S.auto_created,
        DDSP.stats_id,
        DDSP.last_updated,
        DDSP.[rows],
        DDSP.rows_sampled,
        DDSP.steps,
        DDSP.unfiltered_rows,
        DDSP.modification_counter
    FROM sys.stats AS S
    CROSS APPLY sys.dm_db_stats_properties(S.[object_id], S.stats_id) AS DDSP
    WHERE 
        S.[object_id] = OBJECT_ID(N'dbo.Heap', N'U');
    

    Resultado

    Descobri que as modificações continuam a ser rastreadas com precisão em todas as duplicatas não vazias, mas apenas uma estatística é atualizada automaticamente (independentemente da configuração assíncrona).

    As atualizações automáticas de estatísticas ocorrem apenas quando o otimizador de consulta precisa de uma estatística específica e descobre que ela está desatualizada (uma recompilação relacionada à otimização).

    O otimizador escolhe entre estatísticas duplicadas, conforme mencionado no documento Plan Caching and Recompilations in SQL Server 2012 :

    Um problema não diretamente relacionado ao tópico deste documento é: dadas várias estatísticas no mesmo conjunto de colunas na mesma ordem, como o otimizador de consulta decide quais carregar durante a otimização de consulta? A resposta não é simples, mas o otimizador de consulta usa diretrizes como: Dê preferência a estatísticas recentes sobre estatísticas mais antigas; Dê preferência às estatísticas apuradas por FULLSCANopção às apuradas por amostragem; e assim por diante.

    O ponto é que o otimizador escolhe uma das estatísticas duplicadas disponíveis (a "melhor), e essa é atualizada automaticamente se for obsoleta.

    Acredito que esta seja uma mudança no comportamento de versões mais antigas - ou pelo menos a documentação sugere que todas as estatísticas desatualizadas de um objeto seriam atualizadas como parte desse processo, mas não tenho ideia de quando isso mudou. Foi certamente depois de agosto de 2013, quando Matt Bowler postou Estatísticas Duplicadas , que contém um repositório prático baseado em AdventureWorks. Esse script agora resulta na atualização de apenas um dos objetos de estatísticas, enquanto na época ambos eram.

    A explicação acima corresponde a todos os comportamentos que observei ao tentar reproduzir seu cenário, mas duvido que esteja explicitamente documentado em qualquer lugar. Parece uma otimização sensata, pois há pouco valor em manter as duplicatas totalmente atualizadas.

    Isso provavelmente está em um nível de detalhes abaixo do que a Microsoft está disposta a oferecer. Isso também significa que pode mudar sem aviso prévio.

    • 10

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