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 / 187580
Accepted
Erik Darling
Erik Darling
Asked: 2017-10-04 16:57:42 +0800 CST2017-10-04 16:57:42 +0800 CST 2017-10-04 16:57:42 +0800 CST

SQL Server 2017: como funciona a execução intercalada?

  • 772

A execução intercalada faz parte de uma família de recursos no processador de consultas de 2017 que consiste em:

  • Junções adaptáveis ​​do modo de lote
  • Execução intercalada
  • Feedback de concessão de memória do modo de lote

Então, como funciona a execução intercalada?

sql-server functions
  • 1 1 respostas
  • 469 Views

1 respostas

  • Voted
  1. Best Answer
    Erik Darling
    2017-10-04T16:57:42+08:002017-10-04T16:57:42+08:00

    Variável O Diabo Está Na Mesa

    A execução intercalada visa corrigir a cardinalidade mal estimada em Funções de valor de tabela de múltiplas instruções.

    Nas versões anteriores do SQL Server, essas funções sempre produziam estimativas de má qualidade:

    • 2014, 2016: 100 linhas
    • 2005 - 2012: 1 linha

    Escusado será dizer que isso pode causar muitos problemas ao ingressar em outras tabelas.

    Embora a seleção de dados de uma variável de tabela não iniba o paralelismo por si só, as estimativas de linhas baixas geralmente contribuem para custos de consulta baixos, onde o paralelismo não seria considerado.

    Com a execução intercalada, a estimativa de cardinalidade é pausada, a subárvore para o MSTVF é executada e a otimização é retomada com uma estimativa de cardinalidade mais precisa.

    Como sei se meu MSTVF recebe execução intercalada.

    Como com Adaptive Joins, a execução intercalada é indicada no plano de consulta. Ao contrário das Adaptive Joins, isso não é observado nos planos estimados, pelo menos até o momento da redação deste artigo.

    A forma do plano para um MSTVF com execução intercalada é um pouco diferente de um plano típico que possui um MSTVF.

    Você verá o operador Table Valued Function na parte superior do plano e a varredura da Table Variable onde o operador TVF normalmente estaria no plano gráfico.

    NOZES

    Ao passar o mouse sobre o operador TVF, você verá o atributo IsInterleavedExecuteddefinido como True, bem como um número estimado de linhas que podem refletir quase a realidade. Viva.

    Existem eventos estendidos para solucionar problemas quando a execução intercalada não ocorre?

    Sim, um monte:

    NOZES

    Observe que alguns deles estão no canal Debug, que não é selecionado por padrão ao pesquisar Eventos a serem estendidos.

    A execução intercalada requer índices ColumnStore?

    Não, eles vão funcionar de qualquer maneira. Aqui está um exemplo:

    SELECT u.Id, mj.*
    FROM   dbo.Users_cx AS u --ColumnStore
    JOIN   dbo.MultiStatementTVF_Join(0) AS mj
    ON mj.UserId = u.Id
    WHERE  u.LastAccessDate >= '2016-12-01';
    
    
    SELECT u.Id, mj.*
    FROM   dbo.Users AS u --RowStore
    JOIN   dbo.MultiStatementTVF_Join(0) AS mj
    ON mj.UserId = u.Id
    WHERE  u.LastAccessDate >= '2016-12-01';
    

    Cada uma dessas consultas se junta a diferentes tabelas. Uma ColumnStore, outra não. Ambos recebem planos de execução intercalada.

    NOZES

    Quando a execução intercalada funciona?

    No momento, só funciona com MSTVFs onde a correlação é feita fora da função.

    Aqui estão alguns exemplos:

    Esta função não tem correlação interna, o que significa que não há WHEREcláusula predicada em uma coluna da tabela e uma variável passada.

    CREATE OR ALTER FUNCTION dbo.MultiStatementTVF_Join
    (
        @h BIGINT
    )
    RETURNS @Out TABLE
    (
        UserId INT,
        BadgeCount BIGINT
    )
    AS
        BEGIN
            INSERT INTO @Out ( UserId, BadgeCount )
            SELECT   b.UserId, COUNT_BIG(*) AS BadgeCount
            FROM     dbo.Badges AS b
            GROUP BY b.UserId
            HAVING   COUNT_BIG(*) > @h;
            RETURN;
        END;
    GO
    

    Esta função é o oposto, com um predicado na UserIdcoluna com uma variável passada.

    CREATE OR ALTER FUNCTION dbo.MultiStatementTVF_CrossApply
    (
        @h BIGINT,
        @id INT
    )
    RETURNS @Out TABLE
    (
        UserId INT,
        BadgeCount BIGINT
    )
    AS
        BEGIN
            INSERT INTO @Out ( UserId, BadgeCount )
            SELECT   b.UserId, COUNT_BIG(*) AS BadgeCount
            FROM     dbo.Badges AS b
            WHERE    b.UserId = @id
            GROUP BY b.UserId
            HAVING   COUNT_BIG(*) > @h;
            RETURN;
        END;
    GO
    

    É um equívoco comum que CROSS APPLYnão vai funcionar. A limitação real é notada anteriormente. A correlação de função interna é o disjuntor do negócio.

    SELECT u.Id, mj.*
    FROM   dbo.Users AS u --RowStore
    CROSS APPLY dbo.MultiStatementTVF_Join(0) AS mj
    WHERE  mj.UserId = u.Id
           AND u.LastAccessDate >= '2016-12-01';
    
    
    SELECT   TOP 1 u.Id, mj.*
    FROM     dbo.Users AS u --RowStore
    CROSS APPLY dbo.MultiStatementTVF_CrossApply(2147483647, u.Id) AS mj
    WHERE    u.LastAccessDate >= '2016-12-01'
    ORDER BY u.Id;
    

    NOZES

    • 6

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