【发布时间】:2014-10-03 14:52:58
【问题描述】:
我们正在使用 SQL Server 2012 EE,但目前没有在 R/O 镜像上运行查询的选项,尽管这是我的长期目标,但我担心在这种情况下我也可能会遇到以下问题,因为镜像也会更新我正在查询的数据。
我有一个视图,它连接来自两个数据库的多个表,并用于从现有数据开具发票。其中三个表也被正在进行的事务主动更新。运行使用此视图的报告以前不是问题,但现在我们的数据库变得越来越大,我遇到了一些超时问题。首先,查询超时,所以我将命令超时设置为 0 并重新运行查询,该查询将所有 4 个 CPU 100% 挂钩 90 分钟,然后我将其杀死。在此期间,活动交易没有问题。我查看了查询,发现我加入的一个字段没有被索引,因此在该字段上创建了一个索引,重新运行报告,然后在三分钟内完成,所有 CPU 都很忙,但根本没有挂钩。两次查询的数据量相同。我想问题解决了。当然后来,我的老板运行了一个类似的查询,可能有更多数据,但可能不会更多,当他的查询运行时,我们的实时事务开始 100% 超时。那段时间我没有机会看到 CPU 使用率。
所以我的问题有两个:
鉴于我必须使用实时和活动数据库,运行长 R/O 查询以使活动事务仍然可以继续的正确方法是什么?我正在考虑 NO LOCK,但希望有更好的标准做法。
1234563事务开始 100% 超时?
我知道这不是很多信息。我对 sql 分析和性能监控不是很熟悉,但这种行为似乎很奇怪,我希望最佳实践是正确的解决方法。
【问题讨论】:
-
这个视图是否碰巧加入了另一个视图?
-
你看过底层查询的执行计划吗?
-
@HLGEM - 不,只是表,但来自同一服务器上的两个数据库。
-
@JiggsJedi - 不,但我将研究如何做到这一点。不知道这将如何解释不同的行为。
-
获取执行计划,并向我们展示查询——也许我们可以提供一些建议。但是在数据库中,随着时间的推移,统计信息会变得“陈旧”,并导致性能下降,未正确转换/处理的变量会影响它,索引列中的空值可能会导致它。
标签: sql-server tsql command-timeout