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 / 314518
Accepted
Erik Darling
Erik Darling
Asked: 2022-07-18 09:32:23 +0800 CST2022-07-18 09:32:23 +0800 CST 2022-07-18 09:32:23 +0800 CST

Por que o SQL Server rastreia o tempo com precisão para alguns planos de consulta de função com valor de tabela de várias instruções e não para outros?

  • 772

Configurar

Para esta demonstração, estou usando a versão 2013 do banco de dados Stack Overflow e o SQL Server 2022 CTP2, mas é válido voltar ao SQL Server 2017, que é o mais antigo que eu gostaria de verificar.

Função Um

Para esta função, o SQL Server rastreia o tempo de execução gasto na função:

CREATE OR ALTER FUNCTION
    dbo.ScoreStats
(
    @UserId int
)
RETURNS
    @out table
    (
        TotalScore bigint
    )
WITH SCHEMABINDING
AS 
BEGIN

    INSERT
        @out
    (
        TotalScore
    )
    SELECT
        TotalScore = 
            SUM(x.Score)
    FROM 
    (
        SELECT
            Score = 
                SUM(p.Score)
        FROM dbo.Posts AS p
        WHERE p.OwnerUserId = @UserId

        UNION ALL

        SELECT
            Score = 
                SUM(c.Score)
        FROM dbo.Comments AS c
        WHERE c.UserId = @UserId    
    ) AS x;

    RETURN;

END;

Aqui está o plano de consulta e execução:

SELECT
    u.DisplayName,
    TotalScore = 
        (
            SELECT
                ss.TotalScore
            FROM dbo.ScoreStats(u.Id) AS ss
        )
FROM dbo.Users AS u
WHERE u.Reputation >= 1000000;

NOZES

Você pode ver que tanto no plano de consulta quanto na propriedade Query Time Stats, o tempo é rastreado com precisão.

Função Dois

Aqui está a segunda função, onde isso não acontece:

CREATE OR ALTER FUNCTION
    dbo.VoteStats()
RETURNS
    @out table
    (
        PostId int,
        UpVotes int,
        DownVotes int,
        UpMultipier AS 
             UpVotes * 2
    )
WITH SCHEMABINDING
AS 
BEGIN

    INSERT
        @out
    (
        PostId,
        UpVotes,
        DownVotes
    )
    SELECT
        v.PostId,
        UpVotes = 
            SUM
            (
                CASE v.VoteTypeId
                     WHEN 2
                     THEN 1
                     ELSE 0
                END
            ),
        DownVotes = 
            SUM
            (
                CASE v.VoteTypeId
                     WHEN 3
                     THEN 1
                     ELSE 0
                END
            )
    FROM dbo.Votes AS v
    GROUP BY 
        v.PostId;

    RETURN;

END;

Aqui está o plano de consulta e execução:

SELECT TOP (100)
     p.Id,
     vs.UpVotes,
     vs.DownVotes
FROM dbo.VoteStats() AS vs
JOIN dbo.Posts AS p
    ON vs.PostId = p.Id
WHERE vs.DownVotes > vs.UpMultipier
AND   p.CommunityOwnedDate IS NULL
AND   p.ClosedDate IS NULL
ORDER BY vs.UpVotes DESC;

NOZES

Nesta consulta, o tempo não é rastreado com precisão no plano de execução gráfico, mas é rastreado na propriedade Query Time Stats.

Função Dois em MAXDOP 1

Mesmo quando forçado serial, o tempo não é rastreado com precisão:

SELECT TOP (100)
     p.Id,
     vs.UpVotes,
     vs.DownVotes
FROM dbo.VoteStats() AS vs
JOIN dbo.Posts AS p
    ON vs.PostId = p.Id
WHERE vs.DownVotes > vs.UpMultipier
AND   p.CommunityOwnedDate IS NULL
AND   p.ClosedDate IS NULL
ORDER BY vs.UpVotes DESC
OPTION(MAXDOP 1);

NOZES

El Problema

De volta à questão em questão: Por que o tempo é rastreado em um plano de consulta com precisão, mas não no outro?

sql-server execution-plan
  • 2 2 respostas
  • 773 Views

2 respostas

  • Voted
  1. Best Answer
    Paul White
    2022-07-18T19:59:07+08:002022-07-18T19:59:07+08:00

    Isso é uma consequência do uso da execução de TVF intercalada .

    A execução intercalada altera o limite unidirecional entre as fases de otimização e execução para uma execução de consulta única e permite que os planos se adaptem com base nas estimativas de cardinalidade revisadas. Durante a otimização, se encontrarmos um candidato para execução intercalada, que atualmente são funções com valor de tabela de várias instruções (MSTVFs) , pausaremos a otimização, executaremos a subárvore aplicável, capturaremos estimativas de cardinalidade precisas e retomaremos a otimização para operações downstream.

    Seu primeiro exemplo não se qualifica para execução intercalada, mas o segundo sim. O nó raiz do segundo plano de exemplo tem a propriedade:

    contém candidatos

    O nó de população TVF no segundo exemplo tem:

    é intercalado executado

    Executando uma consulta de teste com uma dica para desativar esse recurso:

    SELECT TOP (1) VS.* 
    FROM dbo.VoteStats() AS VS
    OPTION (USE HINT ('DISABLE_INTERLEAVED_EXECUTION_TVF'));
    

    Fornece um plano incluindo o tempo para preencher o TVF:

    planejar com horários


    Esse problema ocorre apenas na primeira execução de uma instrução qualificada para execução de TVF intercalada. O SQL Server executa a parte de população TVF do plano para obter uma estimativa precisa de cardinalidade durante a otimização da consulta . O restante do plano não é compilado e otimizado até que essas informações sejam obtidas.

    Após a conclusão da compilação, o SQL Server não repete o trabalho de preencher a variável da tabela para a primeira execução , pois isso duplicaria o trabalho já feito (durante a otimização). Infelizmente, pular a população da tabela em tempo de execução significa que as informações de desempenho para a população da variável da tabela não estão disponíveis da maneira usual.

    Em execuções subsequentes (onde o plano é reutilizado), o SQL Server executa a etapa de preenchimento de variável de tabela como parte da execução de consulta regular, portanto, os números de desempenho do tempo de execução aparecem conforme o esperado na saída do plano de exibição.

    Se você executar seu segundo exemplo novamente, reutilizando o plano armazenado em cache, verá informações completas sobre o desempenho do tempo de execução.

    Observação: esse comportamento está relacionado especificamente ao recurso de execução de TVF intercalado do Intelligent Query Processing. Não é uma consequência do comportamento normal de armazenamento em cache dos TVFs, conforme explico em minhas perguntas e respostas auto-respondidas. O SQL Server armazena em cache o resultado de uma função com valor de tabela de várias instruções? .

    • 14
  2. Pedro Lopes
    2022-07-18T09:47:02+08:002022-07-18T09:47:02+08:00

    O tempo de rastreamento em execuções paralelas (operadores de câmbio e threads filho) não é trivial e não pode ser realmente preciso com a implementação atual. O outro plano é serial, tão fácil de rastrear com precisão. O que faz você ter certeza de que é sobre uma função? Qualquer execução paralela de modo de linha não será rastreada com precisão por operador (em termos de tempo).

    • -4

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