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 / 6502
Accepted
msgisme
msgisme
Asked: 2011-10-05 07:54:26 +0800 CST2011-10-05 07:54:26 +0800 CST 2011-10-05 07:54:26 +0800 CST

O código cria um plano diferente quando executado ad-hoc em comparação com um procedimento armazenado

  • 772

Eu tenho uma instrução delete que está usando um plano ruim quando executado dentro de um procedimento armazenado, mas está escolhendo um plano muito melhor quando executado ad-hoc.

Reconstruí todos os índices das tabelas usadas pela consulta e eliminei todos os caches. O otimizador ainda escolhe o plano errado para o procedimento armazenado.

Gostaria de saber por que o otimizador está usando um plano de execução diferente para o procedimento armazenado versus o SQL ad-hoc.

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

2 respostas

  • Voted
  1. Best Answer
    gbn
    2011-10-05T08:13:18+08:002011-10-05T08:13:18+08:00

    Suspeitos do costume:

    1. constantes em ad hoc, parâmetros em código.
      O otimizador pode então escolher o melhor plano para as constantes.
      Alterar as constantes = alterar o plano. Um plano parametrizado é reutilizável.

    2. incompatibilidade de tipos de dados no código.
      introduzirá conversões implícitas devido à precedência de tipo de dados.
      por exemplo, coluna varchar comparada ao parâmetro nvarchar.

    3. detecção de parâmetros.
      use mascaramento de parâmetro ou OTIMIZE PARA DESCONHECIDO

    Para testar: execute stored proc, execute sp_updatestats, execute novamente. Isso invalidará os planos em cache, o que é melhor do que limpar todo o cache do plano.

    Você pode desativar o sniffing de várias maneiras. Os 3 principais são

    • RECOMPILE. Isso é bobagem na minha opinião.
    • OPTIMIZE FOR UNKNOWN
    • Máscara de parâmetro

    O mascaramento de parâmetros se parece com isto:

    DECLARE @MaskedParam varchar(10)
    SELECT @MaskedParam = @SignaureParam
    
    SELECT...WHERE column = @MaskedParam
    

    O mascaramento e a OPTIMIZEdica têm o mesmo efeito (talvez por motivos diferentes). Ou seja, o otimizador tem que usar estatísticas e distribuição de dados para avaliar os parâmetros por seus próprios méritos ? , em vez do que eram na última chamada. O otimizador pode recompilar ou não. O SQL Server 2005 adicionou recompilação em nível de instrução para que houvesse menos impacto.

    Agora, por que um plano com parâmetros "sniffed" é "pegajoso" em comparação com parâmetros mascarados/"desconhecidos", não tenho certeza.

    Eu usei o mascaramento de parâmetros desde o SQL Server 2000 para todos, exceto o código mais simples. Observei que isso pode acontecer com códigos mais complexos. E no meu antigo emprego, tenho alguns processos de relatório que eu poderia alterar os padrões de parâmetro do plano. Acho que a abordagem de "culto à carga" foi mais fácil do que uma chamada de suporte.

    • O mascaramento de parâmetros e OPTIMISE FOR UNKNOWNtem o mesmo efeito, tanto quanto eu posso dizer.
      A dica é mais limpa que a máscara, mas foi adicionada com o SQL Server 2008.

    • A detecção de parâmetros ocorre em tempo de compilação.
      WITH RECOMPILEgera um novo plano a cada execução. Isso significa que uma má escolha de padrões influenciará o plano. No meu último trabalho, pude demonstrar isso facilmente com algum código de relatório: a alteração dos padrões dos parâmetros alterou o plano independentemente dos parâmetros fornecidos.

    • Este artigo do MS Connect é interessante: Uso de índice abaixo do ideal no procedimento armazenado (mencionado em uma das respostas do SO abaixo)

    • Bob Beauchemin menciona isso também

    Problemas pendentes

    • O sniffing ainda se aplica a WITH RECOMPILE? Ou seja, se o otimizador sabe descartar o plano ele visa a reutilização?

    • Por que os planos cheirados são "pegajosos"?

    Links do SO:

    • https://stackoverflow.com/q/6919166/27535

    • https://stackoverflow.com/q/5236631/27535

    • https://stackoverflow.com/q/1392307/27535

    • https://stackoverflow.com/q/2905440/27535

    • https://stackoverflow.com/q/467513/27535

    • https://stackoverflow.com/q/272726/27535

    • Remus Rusanu (equipe MS SQL) e eu brigamos aqui no SO

    • Whitepaper sobre MSDN em conjunto com minha análise SO: https://stackoverflow.com/questions/414336/why-does-the-sqlserver-optimizer-get-so-confused-with-parameters/414368#414368

    • 6
  2. mrdenny
    2011-10-05T11:12:37+08:002011-10-05T11:12:37+08:00

    Não se esqueça de que as configurações ANSI que você configurou para o plano de conexão têm um papel na seleção do plano de execução. Quando o aplicativo chama o procedimento armazenado, ele provavelmente tem configurações ANSI diferentes da sua conexão SSMS.

    • 3

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

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 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
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +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