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 / 259760
Accepted
J. Maes
J. Maes
Asked: 2020-02-16 03:03:02 +0800 CST2020-02-16 03:03:02 +0800 CST 2020-02-16 03:03:02 +0800 CST

Compilação de consulta lenta, muitas leituras durante a fase de compilação

  • 772

Eu tenho uma consulta do seguinte formulário

exec sp_executesql N' UPDATE table  SET column1 = 1, modify_date=N''2020-02-12 04:55:59.000'' WHERE (column5=@P1           AND column6=@P2           )',N'@P1 nvarchar(36),@P2 int',N'458986156148',87

Eu não posso mudar nada sobre esta consulta em si. Ele vem de um aplicativo.

Toda vez que ele é executado, os valores de atualização mudam, fazendo com que um novo plano de consulta seja gerado em vez de o plano anterior ser reutilizado.

A parametrização forçada está ativada, mas não parece ter efeito sobre essa consulta, provavelmente pela forma como ela é executada.

Ao executar a própria consulta vejo um total de 4 leituras para a atualização. Nesse caso, a execução em si não causou uma atualização, pois não há linhas retornadas para a cláusula where.

insira a descrição da imagem aqui

Usando o criador de perfil, vejo que o tempo entre a entrada e o início da consulta é quase todo o tempo da consulta (1 segundo). A execução real é quase imediata.

O perfilador mostra 455.000 leituras!! que não são mostrados na própria execução da consulta.

insira a descrição da imagem aqui

Então agora eu estou me perguntando

  1. Posso forçar a consulta a usar o mesmo plano aqui? Um guia de plano parece utilizável apenas para a mesma consulta ou para uma consulta afetada pela parametrização forçada.
  2. Podemos aumentar a velocidade de compilação desta consulta? De onde vêm as 455.000 leituras? Existem muitas estatísticas nessa tabela (+- 100), mas 455.000 leituras parecem um tanto excessivas.

Isso está no SQL Server 2019, ainda sem atualizações cumulativas. Eu escaneei o changelog CU para qualquer coisa que possa ter a ver com isso.

edit/ Investigações posteriores mostraram que existem muitos bloqueios em outras tabelas durante o tempo de compilação. Tenho 300 tabelas com chave estrangeira referenciando a chave primária na minha tabela onde quero inserir.

Todos os relacionamentos de chave estrangeira são confiáveis. Haveria alguma maneira de evitar essas verificações durante a fase de compilação?

edit 2/ As dependências não são restrições de chave estrangeira, mas visualizações na tabela. Todas as visualizações que usam essa tabela têm o bloqueio SCH-S durante a execução, o que é esperado. Não está claro se isso também está causando as leituras ...

edit 3/ Aparentemente as 455.000 leituras são feitas varrendo a tabela do sistema sys.sysmultiobjrefs mais de um milhão de vezes. Isso não parece um comportamento adequado.

sql-server query-performance
  • 2 2 respostas
  • 838 Views

2 respostas

  • Voted
  1. Josh Darnell
    2020-02-18T08:10:46+08:002020-02-18T08:10:46+08:00

    A parametrização forçada está ativada, mas não parece ter efeito sobre essa consulta, provavelmente pela forma como ela é executada.

    Isso mesmo, a parametrização forçada não funciona aqui porque a consulta "já foi parametrizada no aplicativo do lado do cliente" ( source ). Em outras palavras, o problema é que existem dois parâmetros reais, portanto, os parâmetros date e int incorporados não podem ser forçados.

    Vamos ao que está acontecendo com as leituras/CPU...

    Estatísticas criadas/atualizadas automaticamente

    No que diz respeito às leituras mostradas no criador de perfil, elas incluem atualizações e criação de estatísticas. Isso explicaria o problema se acontecesse apenas ocasionalmente. Como você mencionou esses longos tempos de compilação e leituras altas ocorrem em cada execução, não parece que esse seja o culpado (a menos que esse aplicativo esteja fazendo algo realmente incomum, como excluir agressivamente estatísticas automáticas).

    Leituras de armazenamento de versões

    Existem outros tipos de leituras que não são relatadas em SET STATISTICS IO ON, sobre as quais falei no meu blog . Isso inclui leituras de armazenamento de versão, portanto, se você tiver SNAPSHOTou READ COMMITTED SNAPSHOThabilitado nesse banco de dados, isso pode explicar algumas das discrepâncias de CPU / leitura. Especialmente se você tiver transações de longa duração.

    Solução de problemas adicionais

    Pode ser útil se você puder compartilhar um "Plano de Execução Real" para a consulta em questão ao reproduzir o problema. Pode haver pistas além das informações que você já forneceu.

    Forçar Plano

    Até onde eu sei, não há nenhuma maneira de impedir que um plano seja compilado toda vez que uma dessas consultas for recebida (como você observou, os guias de plano não funcionarão e o Repositório de consultas também não será forçado).

    Cargas de trabalho ad hoc

    Como uma observação lateral, como você tem esses parâmetros incorporados, sua carga de trabalho provavelmente pode se beneficiar bastante da optimize for ad hoc workloads opção de configuração no nível do servidor . Isso evitará que o cache do plano fique inchado, o que também pode estar contribuindo para problemas de CPU (já que o SQL Server precisa remover itens do cache do plano ao longo do tempo devido a todos os "novos" planos que chegam para cada consulta).

    • 1
  2. Best Answer
    J. Maes
    2020-03-04T04:03:16+08:002020-03-04T04:03:16+08:00

    Temos uma solução alternativa, resumindo, a fase de vinculação durante a compilação da consulta foi a mais demorada e desapareceu quando a propriedade SCHEMABINDING nas visualizações da tabela foi removida.

    As informações do repositório de consultas indicaram que o tempo de compilação da consulta foi ocupado principalmente pela associação, em vez de otimização ou análise.

    Embora ainda não esteja claro se isso é um bug ou um comportamento esperado, as leituras são feitas na tabela sys.sysmultiobjrefs. Esta tabela de acordo com a documentação "Existe em todos os bancos de dados. Contém uma linha para cada referência geral N-para-N." Ao examinar os valores, ele também contém as visualizações (não indexadas) na tabela. A tabela na qual queremos inserir registros possui cerca de 3.000 visualizações.

    Ao excluir as visualizações, o tempo de compilação diminuiu linearmente. É claro que não podemos excluir as visualizações e impedir que o estágio de vinculação verifique as visualizações, removi a propriedade SCHEMABINDING das visualizações nessa tabela. A compilação e a inserção da consulta agora são reduzidas a milissegundos em vez de 1-2 segundos.

    Claro que precisamos levar em conta as implicações durante futuras atualizações do aplicativo.

    • 1

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