我们正在使用 SQL Server 2012 EE,但目前没有在 R/O 镜像上运行查询的选项,尽管这是我的长期目标,但我担心在这种情况下我也可能会遇到以下问题,因为镜像会还要更新我正在查询的数据。
我有一个视图,它连接来自两个数据库的多个表,并用于从现有数据开具发票。其中三个表也被正在进行的事务主动更新。运行使用此视图的报告以前不是问题,但现在我们的数据库变得越来越大,我遇到了一些超时问题。首先,查询超时,所以我将命令超时设置为 0 并重新运行查询,该查询将所有 4 个 CPU 100% 挂钩 90 分钟,然后我将其杀死。在此期间,活动交易没有问题。我查看了查询,发现我加入的一个字段没有被索引,因此在该字段上创建了一个索引,重新运行报告,然后在三分钟内完成,所有 CPU 都很忙,但根本没有挂钩。两次查询的数据量相同。我想问题解决了。当然后来,我的老板运行了一个类似的查询,可能有更多数据,但可能不会更多,当他的查询运行时,我们的实时事务开始 100% 超时。在那段时间里,我没有机会看到 CPU 的使用情况。
所以我的问题有两个:
鉴于我必须使用实时和活动数据库,运行长 R/O 查询以使活动事务仍然可以继续的正确方法是什么?我正在考虑 NO LOCK,但希望有更好的标准做法。
什么可能导致 sqlserver 以 100% 繁忙的速度将 4 个 CPU 挂起并且不会导致实时事务超时,但是当我的老板运行他的查询时,在我添加索引并且我的查询运行得更好之后,实时更新事务开始超时 100% ?
我知道这不是很多信息。我对 sql 分析和性能监控不是很熟悉,但这种行为似乎很奇怪,我希望最佳实践是正确的解决方法。