解决 SQL 服务器中的性能问题

Troublshooting performance issue in SQL Server

我有两个 tables - ThingsHistory。假设 Things 有一个列 Id 作为主键,另一列 LastUpdated 是某种时间戳值。 LastUpdated 列上有一个索引。还有其他专栏,但我认为应该没有太大关系。我的 ASP.NET MVC Web API 应用程序

有两个业务工作流程
  1. 获取自上次以来更改的内容。运行格式查询:SELECT [Columns] FROM Things WHERE LastUpdated > @LastUpdated。此查询在连接 w/o 事务或事务范围上触发。

  2. 更新特定的东西。这发生在两个数据库事务中——第一个事务在 Things 上有一个 SELECTId,然后是 UPDATE Things 使用 Id。第二个事务在 History table 中插入行。两个事务都使用 TransactionScopeRead Committed 隔离级别进行控制。

我正在尝试使用

等场景对性能进行基准测试

环境:我的开发机器(Core i7、8GB)带有 Sql Server 2016 LocalDB 引擎。

我观察到的是,随着 History table 中行数的增加,#1 和 #2 的性能都会下降。 #2 是可以理解的,因为它实际上更新了历史 table。然而,我很困惑为什么#1 会急剧下降。例如,对于 history table 中的 250K 行,#2 时间从空数据库的大约 10 毫秒降低到大约 65 毫秒,而#1 时间从大约 10 毫秒降低到 200 毫秒。请注意,Things table 具有恒定的行数 (5000)。我能想到的唯一解释是由于磁盘 IO 争用。

我在这儿吗?有什么方法可以验证这一点(比如,使用 SQL Profiler)?

我不能在这上面花很多时间,但正如我所怀疑的那样,接缝的明显原因是磁盘 I/O 争用。我将历史 table 移动到不同机器上的另一个数据库。现在,历史记录中的行数 table 不再影响 #1 时间,它或多或少保持不变(6-7% 方差),而与历史记录中的行数 table 无关。