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 / 212378
Accepted
user9516827
user9516827
Asked: 2018-07-17 13:23:12 +0800 CST2018-07-17 13:23:12 +0800 CST 2018-07-17 13:23:12 +0800 CST

Plano serial no cache do plano

  • 772

Eu tenho uma consulta que estava executando lentamente anteriormente. Mais tarde descobri que não estava rodando em paralelo e isso está tornando a execução da consulta lenta.

A consulta envolve um grande viewe, em seguida, consulta a exibição com muitos temp tablese sub query.

Eu removi um UDFda view e usei inline functionse também usei um escalar TVFe então ele começou a rodar rápido no parallel execution.

Estava indo bem por alguns dias e um belo dia notei que a consulta rodava lentamente. Então verifiquei o plano de execução e descobri que a consulta está sendo executada no modo serial. Verifiquei o cache do plano para a consulta e vi muitos planos em cache envolvendo essa visualização. Excluí planos que não são paralelos e a consulta é executada rapidamente.

Agora eu faço isso todas as manhãs para forçar a consulta a ser executada em paralelo.

Detalhes adicionais:

  1. SQL Server 2016 Padrão
  2. A consulta é gerada via LINQ-SQL do aplicativo dot net. Portanto, consulta ad hoc.

Como posso forçar a consulta a ser executada em paralelo para sempre?

sql-server performance
  • 3 3 respostas
  • 449 Views

3 respostas

  • Voted
  1. Best Answer
    Brent Ozar
    2018-07-17T13:38:19+08:002018-07-17T13:38:19+08:00

    À primeira vista, isso soa como um problema clássico de sniffing de parâmetros .

    O SQL Server cria um plano de execução para o primeiro conjunto de parâmetros que é chamado quando o plano precisa ser compilado e, em seguida, reutiliza esse plano várias vezes ao longo do dia. Você pode ver quais são os parâmetros - quando estiver visualizando o plano serial, clique com o botão direito do mouse na instrução select e vá para propriedades. Na janela de propriedades, procure Parâmetros e, em seguida, Valores Compilados. Isso mostrará quais valores produzem o plano serial.

    Para forçar o plano a sempre ser executado em paralelo, você tem várias opções diferentes (muitas das quais Erland aborda em seu excelente post que vinculei acima), incluindo:

    • Ajuste os índices para que tudo fique em um plano melhor (para obter conselhos sobre isso, poste os detalhes do plano e do servidor conforme descrito em Obtendo ajuda com uma consulta lenta )
    • Temporariamente, use um guia de plano para fixar o plano paralelo no cache (mas saiba que, se a consulta for alterada por uma única letra, o guia de plano falhará silenciosamente, pois não corresponderá mais à consulta)
    • Use uma dica OPTIMIZE FOR no plano para orientá-lo em direção a valores que produzem um plano paralelo
    • Use a nova dica ENABLE_PARALLEL_PLAN_PREFERENCE no SQL Server 2016

    Essa é apenas uma resposta rápida - mas para muito, muito mais, leia a excelente postagem de Erland, Slow in the App, Fast in SSMS, que explica como uma consulta pode obter planos diferentes e como corrigi-la.

    • 9
  2. Błażej Ciesielski
    2018-07-17T13:46:05+08:002018-07-17T13:46:05+08:00

    Pode ser difícil fornecer uma resposta precisa para seu problema, pois não sabemos como são suas consultas, mas você pode forçar um plano específico usando o recurso QueryStore que foi introduzido no SQL 2016. Se você estiver usando uma versão anterior do SQL Server ou não sente que o armazenamento de consultas é uma solução para você - você pode tentar coisas como:

    • forçando a recompilação cada vez que é executado (um dos métodos está adicionando OPTION(RECOMPILE) à instrução que causa o problema)
    • revisar possíveis inibidores de planos paralelos em outras consultas

    Você também deve revisar postagens anteriores no StackExchange sobre este tópico, por exemplo, SQL não envolve paralelismo para consulta extremamente grande

    • 3
  3. KumarHarsh
    2018-07-19T02:36:46+08:002018-07-19T02:36:46+08:00

    Se o custo da consulta exceder o Cost Threshold of Parallelismvalor e cost of the parallel planfor menor que cost of a serial plan, um plano paralelo será criado e usado.

    Em alguns casos, o QO escolhe o plano serial do que o plano paralelo porque parallel plané mais caro do que serial plannesse caso. Por exemplo, se a consulta contém operadores escalares ou relacionais que não podem ser executados em modo paralelo.

    Em alguns casos, o QO toma decisões erradas devido a informações imprecisas, estatísticas desatualizadas, cardinality estimateetc. Devido ao qual o custo do plano serial é ligeiramente superior a parallel plan.

    então QO ainda escolhe o plano serial.

    Para superar esse problema, a consulta pode ser otimizada e as estatísticas também devem ser atualizadas.

    Isso ajuda QO na tomada de decisão correta.

    Eu removi um UDF da visualização e usei funções em linha e também usei um TVF escalar

    Essas são etapas bem-vindas, assim que você melhorar sua consulta, alguns dos planos foram paralelos e o desempenho da consulta melhorou.

    Portanto, pode haver mais escopo para melhorar sua consulta.

    Deve-se prestar mais atenção na otimização do índice de consulta e ajuste do que tentar imediatamenteHint

    O resto das coisas como usar HINT, sniffing de parâmetro, OPTION (RECOMPILE) já são discutidas.

    • 1

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