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 / 284468
Accepted
Sylvia
Sylvia
Asked: 2021-02-02 12:14:22 +0800 CST2021-02-02 12:14:22 +0800 CST 2021-02-02 12:14:22 +0800 CST

A seção de custo mais alto no Plano de Execução Real não mostra nenhuma leitura lógica?

  • 772

No plano de consulta a seguir - https://www.brentozar.com/pastetheplan/?id=H1dwOCHed (tem 3 seções, a última é o problema), há um nó na parte inferior que consome 37% dos recursos . Este é o plano de consulta real, não o plano de consulta estimado. No entanto, a tabela a que ela faz referência não aparece, ao analisar as leituras lógicas por meio do Set Statistics IO. Isso inclui as 2 seções para ActivityFeedTeamCache e ActivityFeedCache.

No passado, consegui usar Logical Reads como um proxy muito bom para desempenho. Reduza as leituras lógicas e você terá feito a coisa certa para o desempenho.

No entanto, como nesse caso, não há leituras lógicas para os blocos que são os piores (ActivityFeedTeamCache, ActivityFeedCache, Locales), qual é um bom proxy para testar o desempenho? Só que o % de custo no Plano de Execução Real diminui?

sql-server performance
  • 2 2 respostas
  • 164 Views

2 respostas

  • Voted
  1. Best Answer
    Andrew Sayer
    2021-02-02T13:17:05+08:002021-02-02T13:17:05+08:00

    O % de custo ainda é apenas uma estimativa, mesmo em um Plano de Execução Real. Você precisa observar as estatísticas de nível de origem da linha aqui para saber quanto tempo cada etapa levou.

    A julgar pelo XML, 274ms foram levados até o ponto do hash join no nó 7, 72ms disso foi apenas a varredura de cluster do Pk_TeamMembers(nó 8) e 35ms foi até o Left Semi Join (nó 9). Isso significa que impressionantes 167ms foram usados ​​apenas para executar a etapa Hash Join (provavelmente atribuindo memória para as 263.600 linhas de Pk_TeamMembers).

    Parece que você já tentou segmentar essa junção antes:

    LEFT JOIN TeamMembers tm on AF.CompletionUserID = tm.UserID AND AF.TeamID = tm.TeamID AND tm.TeamID = t.TeamID -- Overloaded to help SQL find indexes
    

    Você provavelmente deseja fazer um loop aninhado (externo) para esse índice. O planejador de consulta decidiu usar uma junção de hash porque acha que você obterá 59.000 linhas do outro lado dessa junção, quando na verdade você obtém 3.

    Você tem escolhas

    • Dica para que uma junção de loop aninhada seja usada
    • Descubra por que o planejador acha que terá tantas linhas e ajude-o (estatísticas, simplifique a filtragem)

    A dica seria como

    LEFT LOOP JOIN TeamMembers tm on AF.CompletionUserID = tm.UserID AND AF.TeamID = tm.TeamID AND tm.TeamID = t.TeamID
    

    A segunda escolha será particularmente difícil devido à complexidade de seus filtros de direção. Uma maneira de fazer isso seria inserir as linhas que correspondem aos seus principais filtros de condução e, em seguida, juntar-se a essa tabela temporária em sua consulta principal. Aqui, parece que você precisa juntar 3 das 5 tabelas primeiro para utilizar seus @userId@filtros de forma justa:

    FROM ActivityFeed AF
        JOIN ActivityType A ON AF.ActivityType = A.ActivityType
        LEFT JOIN Teams t on AF.TeamID = t.TeamID
    WHERE 
        AF.SearchIndexUpdateDate IS NULL -- Only get items that aren't in the search index
        AND
        AF.Active=1 
        AND 
        A.Active=1
        AND
        (A.AdminOnly = 0 OR AF.TeamID IN (SELECT TeamID FROM @tmpFindAdminFlagsForTeamsMembershipsForUser x WHERE x.IsAdmin=1))
        AND
        ( 
          (
            A.TeamOnly=1 
            AND AF.TeamID IN (SELECT TeamID FROM @tmpFindAdminFlagsForTeamsMembershipsForUser x WHERE A.HideWhenOwnerless = 0 OR x.IsOwnerless = 0)
            AND (A.ShowSelf=1 OR AF.CompletionUserID <> @UserID)
            AND ISNULL(t.IsDeleted,0) = 0 AND t.active=1
            AND (A.IncludeOnsite = 1 OR EXISTS(SELECT 1 FROM @tmpFindAdminFlagsForTeamsMembershipsForUser x WHERE x.TeamID = AF.TeamID AND x.IsOnsiteOwner = 0))
           )
           OR 
          (
            A.UserOnly=1 
            AND AF.UserID=@UserID
          )
        )
        AND
        -- Don't included moderated activity (owner moderation actions are in Group activity view API_GetActivityFeedByTeam)
        AF.Moderated = 0 
        AND
       -- don't show completions or plan completions to other team members if opted out (tm.ShowUserActivityInFeed)
        (ISNULL(A.ShowOnlyWhenUserActivityActive,0) = 0 OR (A.ShowOnlyWhenUserActivityActive = 1 AND tm.ShowUserActivityinFeed = 1))
        AND
        (AF.TeamID IS NULL OR AF.TeamID IN (SELECT TeamID FROM @tmpFindAdminFlagsForTeamsMembershipsForUser as x))
    
    • 6
  2. Felipe Schneider
    2021-02-03T13:02:48+08:002021-02-03T13:02:48+08:00

    Você também tem uma pesquisa de chave na tabela TeamMembers, isso está consumindo 14% do tempo de execução. Você deve tentar criar um índice de conversão melhor para evitar esse tipo de operador em um plano de execução.

    A coluna ausente que poderia, por exemplo, ser adicionada no INCLUDE é IsSiemensOnsiteAdmin

    Além disso, você deve considerar modificar este código para usar CTE em vez de fazer 2 vezes a mesma consulta para colunas diferentes

            (SELECT 
                L.Locale,
                AFC.LocalizedMessage
            FROM 
                ActivityFeedCache AFC 
                JOIN Locales L ON AFC.LocaleID=L.LocaleID 
            WHERE ActivityFeedID=AF.ActivityFeedID
            FOR JSON PATH) AS MessageJSON,
            (SELECT 
                L.Locale,
                AFC.LocalizedTeamMessage AS LocalizedMessage
            FROM 
                ActivityFeedTeamCache AFC 
                JOIN Locales L ON AFC.LocaleID=L.LocaleID 
            WHERE ActivityFeedID=AF.ActivityFeedID
            FOR JSON PATH) AS TeamMessageJSON
    
    • 0

relate perguntas

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

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