【问题标题】:SQL Execution plan changes during the daySQL 执行计划在白天发生变化
【发布时间】:2014-02-25 11:44:34
【问题描述】:

我有一个查询在上午 11 点运行时永远不会完成(需要超过 2 小时),而当我在晚上 7 点运行时需要 1 分钟。所以很明显,执行计划在白天会发生变化。什么会导致这种情况?

数据不会改变。自动统计信息被关闭,统计信息和索引在夜间重建。

我在客户端环境中运行它,所以我真的不知道还有什么使用相同的 SQL 服务器。所以这是我主要关心的问题,我认为服务器被其他东西加载得太厉害了,以至于它无法处理我的查询。

我应该查看服务器的哪些参数来查找问题的原因?

我还应该在哪里寻找问题?我还要考虑哪些其他因素?

任何帮助将不胜感激。

更新:忘了提到我有一大堆其他大型查询同时运行(上午 11 点),它们都运行良好。实际上,我有 7 个查询在晚上运行良好,但在早上没有完成。它们都使用相同的视图来连接相当大的表,这是失败的查询和失败的查询之间的唯一区别。所以我想知道SQL服务器是否没有足够的内存或其他东西来保存视图执行的中间结果,这就是查询永远不会完成的原因。

那么我应该监控服务器的哪些参数来发现问题?

UPDATE很遗憾,由于权限原因我没有晨跑的执行计划

更新我不认为表锁定是原因,因为我知道服务器上的数据库在使用什么,我可以在下午 12 点运行相同的查询,而我的边(即我的表上应该没有锁和未提交的事务)并且查询花费了同样可怕的时间。

【问题讨论】:

  • 做一个 sp_who2 检查减速。
  • obviously the execution plan changes 您应该通过提取至少 2 个不同的执行计划来验证这一点,也许您的数据库只是上午 11 点的REALLY BUSY
  • “很明显,执行计划在白天发生了变化。”。不?可能会改变的是服务器负载(但这不太可能导致这样的差异),或者有一些糟糕的程序滥用了锁。
  • 如果您谈论的是查询(并且不是存储过程),您无法预见执行计划是相同还是不同,这取决于许多因素,包括可用资源。也就是说,我建议您在查询停止时调查现有的锁。
  • @drCopyPaste 由于缺少权限以及查询永远不会完成的事实,无法拉出早上的执行计划。我怎样才能确定服务器是“真的很忙”谢谢

标签: sql sql-execution-plan


【解决方案1】:

很多事情都会影响这一点。这真的是查询还是存储过程调用?我查询是重新编译每次调用存储过程使用缓存计划。如果存储过程的参数可以提供变化很大的结果,那么您可以使用 WITH RECOMPILE 提示

如果你能忍受脏读,我会说:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

在代码的顶部。这将允许您的查询访问被其他进程锁定的数据。风险在于,如果数据发生变化,您的答案可能不会 100% 正确。如果您的数据始终是可加的,或者某个时间点的值是可以接受的,那么这非常有效。

我会在晚上完成查询的执行计划并优化该查询,即使 1 分钟是可以接受的,它也可能会上传大量数据,这些数据您在晚上有容量,但在早上却在争夺.

【讨论】:

    猜你喜欢
    • 2016-07-07
    • 2017-06-05
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 2022-11-18
    • 1970-01-01
    相关资源
    最近更新 更多