SQL执行计划在白天更改

SQL执行计划在白天更改,sql,sql-execution-plan,Sql,Sql Execution Plan,我有一个查询在上午11点运行时永远不会完成(需要2个多小时),在晚上7点运行时需要1分钟。很明显,执行计划在白天会发生变化。是什么原因造成的 数据没有改变。自动统计被关闭,统计数据和索引在夜间重建 我在客户机的环境中运行它,所以我不能真正说出还有什么使用相同的SQL server。所以这是我主要关心的问题,我认为服务器被其他东西加载得太多,以至于它无法处理我的查询 我应该查看服务器的哪些参数以查找问题的原因 我还应该去哪里寻找问题?我还应该考虑哪些因素呢? 我们将非常感谢您的帮助 更新:忘了提到

我有一个查询在上午11点运行时永远不会完成(需要2个多小时),在晚上7点运行时需要1分钟。很明显,执行计划在白天会发生变化。是什么原因造成的

数据没有改变。自动统计被关闭,统计数据和索引在夜间重建

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

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

我还应该去哪里寻找问题?我还应该考虑哪些因素呢? 我们将非常感谢您的帮助

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

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

更新不幸的是,由于权限限制,我没有晨跑的执行计划


更新我不认为表锁是原因,因为我知道服务器上的数据库在使用什么,我可以在中午12点运行相同的查询,而我这边没有其他任何东西运行(即,我的表上应该没有锁和未提交的事务),并且该查询需要同样可怕的时间

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

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

将事务隔离级别设置为“读取未提交”

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


我会在晚上检查查询的执行计划,并优化该查询,即使1分钟是可以接受的,它可能会上载大量的数据,而这些数据是您在晚上有能力处理的,但在早上正在争用的。

做一个SPU who2检查是否有减速。
显然,执行计划会发生变化。
您应该验证通过拉取这至少两个不同的执行计划,可能您的数据库在上午11点非常繁忙,因此“显然执行计划在一天中会发生变化”。不可能发生变化的是服务器负载(但这不太可能导致这种差异),或者有一些糟糕的程序滥用锁。如果您谈论的是查询(而不是存储过程),您无法预见执行计划是否相同或不同,这将取决于许多因素,包括可用资源。也就是说,我建议您在查询暂停时调查现有锁。@drCopyPaste无法拉出早晨执行计划,因为缺少权限,而且查询永远找不到。如何确定服务器是否“非常忙”谢谢