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 / 48956
Accepted
Richard Hansell
Richard Hansell
Asked: 2013-08-30 07:37:05 +0800 CST2013-08-30 07:37:05 +0800 CST 2013-08-30 07:37:05 +0800 CST

Por que executar uma consulta SQL durante a noite interromperia meu banco de dados para o dia seguinte?

  • 772

Peço desculpas antecipadamente se esta for uma pergunta duplicada (o que aposto que será). Fiz uma boa pesquisa e encontrei perguntas semelhantes, mas nada que parecesse uma correspondência exata.

Escrevi um relatório que leva cerca de 30 minutos para ser executado. Ele faz muitos cálculos numéricos e estou muito feliz que demore tanto para ser executado, mas isso significa que o relatório não pode ser interativo. Basicamente, o relatório deve calcular um relatório de lucros e perdas como se a empresa tivesse perdido exatamente um cliente. Em seguida, ele coloca esse cliente de volta e executa o relatório novamente como se o próximo cliente tivesse sido perdido, etc. Acho que 30 minutos é realmente um bom desempenho, considerando o quão intenso isso é.

Os usuários estão satisfeitos com este relatório sendo atualizado todas as noites e, em seguida, podem ver os resultados em cache no dia seguinte. Portanto, o plano era executar o relatório durante a noite e salvar a saída em algum lugar.

Escrevi um procedimento armazenado para fazer isso e posso executá-lo durante o dia em cerca de 30 minutos. No entanto, quando o relatório é executado durante a noite como um trabalho do SQL Agent, ele NUNCA é concluído. Ele começa às 21h e, quando chego ao trabalho no dia seguinte, encontro minha caixa de entrada inundada de e-mails dizendo que o SQL Server está quebrado, não está funcionando corretamente, etc. Eu mato o trabalho e tudo volta ao normal.

Só que não volta ao normal. O que acontece a seguir é que QUALQUER relatório executado no mesmo banco de dados atingirá o tempo limite. A única maneira de corrigir isso é esperar um dia (sem executar o relatório noturno) ou executar outra consulta no mesmo banco de dados diretamente do SSMS, pois isso parece redefinir o problema por algum motivo.

Perguntas óbvias:

  • é o trabalho do SQL Agent que está causando o problema (talvez permissões)? Não, se eu executar o SQL Agent Job durante o dia, ele funcionará bem, acho que é algum tipo de problema de tempo.
  • você já tentou mudar a programação? Eu tentei de tudo, desde executá-lo às 18h até executá-lo às 6h e não parece fazer nenhuma diferença.
  • o que mais funciona durante a noite? Há toda uma carga de outros trabalhos que são executados para diferentes bancos de dados. Mudei o cronograma para que meu trabalho seja executado isoladamente (em teoria). Há um trabalho que executa uma otimização de índice em TODOS os bancos de dados, mas não posso desativá-lo porque ele é gerenciado externamente.
  • O plano de consulta muda para outros relatórios? Não tenho como saber, se eu rodar um relatório via SSMS então funciona, se eu rodar pelo suplemento do Excel que faz exatamente a mesma coisa, mas por meio de uma conexão SQL então ele expira. Posso visualizar o processo no Activity Monitor e vê-lo rodar por muito tempo antes de finalmente morrer.

Minha opinião pessoal é que o mecanismo de consulta está tomando decisões ruins sobre qual índice usar, mas quando executo um relatório interativamente do SSMS, isso de alguma forma redefine "algo" internamente e volta a executar relatórios usando os índices corretos novamente. Não tenho evidências para fazer backup disso, exceto que o comportamento é o mesmo se eu desabilitar um dos índices em uma das tabelas de "dados brutos".

Quando digo "executar um relatório interativamente", quero dizer apenas o seguinte:

SELECT * FROM FormatMonthEndReport(2013, 1);

Onde FormatMonthEndReport é uma função com valor de tabela.

Não sei se isso é relevante, mas uso muito o APPLY em todos esses relatórios.

Imagino que mais detalhes serão solicitados, mas não quero adicionar muitos detalhes neste estágio, pois isso rapidamente se transformaria em uma parede de texto. Voltarei e verei o que é solicitado primeiro, para que meu detalhe seja mais direcionado.

Editar nº 1 - parece que executar um perfil SQL será o primeiro passo. Vou configurar isso para funcionar durante a noite e, em seguida, relatar amanhã. Preciso sair para não ter tempo de responder as outras sugestões até lá... mas não estou te ignorando!

Edição nº 2 - funcionou ontem à noite, muito estranho, pois é a primeira vez que esse trabalho é executado com sucesso durante a noite! A única coisa que parecia diferente era que o rastreamento estava sendo executado. O rastreamento detectou alguma atividade interessante e houve uma vítima de impasse por volta das 23h58. Eu verifiquei o trabalho noturno e demorou 12,5 horas para ser executado, então isso ainda está demorando mais do que deveria, mas pelo menos está sendo concluído agora.

sql-server sql-server-2008
  • 1 1 respostas
  • 1878 Views

1 respostas

  • Voted
  1. Best Answer
    Stuart Ainsworth
    2013-08-30T11:23:05+08:002013-08-30T11:23:05+08:00

    Meu instinto é que está relacionado à detecção de parâmetros; quando você chama o TVF, você passa valores parametrizados ou valores codificados? Por exemplo:

    SELECT * FROM FormatMonthEndReport(2013, 1);

    terá um desempenho diferente do

    DECLARE @p1 int = 2013, @p2 int = 1; SELECT * FROM FormatMonthEndReport(@p1, @p2);
    
    • 3

relate perguntas

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

  • Quanto "Padding" coloco em meus índices?

  • Existe um processo do tipo "práticas recomendadas" para os desenvolvedores seguirem para alterações no banco de dados?

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

  • Downgrade do SQL Server 2008 para 2005

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • 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

    Conceder acesso a todas as tabelas para um usuário

    • 5 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
    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
    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

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