解决 SQL 服务器中的性能问题
Troublshooting performance issue in SQL Server
我有两个 tables - Things
和 History
。假设 Things
有一个列 Id
作为主键,另一列 LastUpdated
是某种时间戳值。 LastUpdated
列上有一个索引。还有其他专栏,但我认为应该没有太大关系。我的 ASP.NET MVC Web API 应用程序
有两个业务工作流程
获取自上次以来更改的内容。运行格式查询:SELECT [Columns] FROM Things WHERE LastUpdated > @LastUpdated
。此查询在连接 w/o 事务或事务范围上触发。
更新特定的东西。这发生在两个数据库事务中——第一个事务在 Things
上有一个 SELECT
和 Id
,然后是 UPDATE Things
使用 Id
。第二个事务在 History
table 中插入行。两个事务都使用 TransactionScope
和 Read Committed
隔离级别进行控制。
我正在尝试使用
等场景对性能进行基准测试
- 5000 行
Things
table
- 每秒 25 次查询(上面的#1)
- 每秒 200 次更新(上面的#2)
环境:我的开发机器(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 无关。
我有两个 tables - Things
和 History
。假设 Things
有一个列 Id
作为主键,另一列 LastUpdated
是某种时间戳值。 LastUpdated
列上有一个索引。还有其他专栏,但我认为应该没有太大关系。我的 ASP.NET MVC Web API 应用程序
获取自上次以来更改的内容。运行格式查询:
SELECT [Columns] FROM Things WHERE LastUpdated > @LastUpdated
。此查询在连接 w/o 事务或事务范围上触发。更新特定的东西。这发生在两个数据库事务中——第一个事务在
Things
上有一个SELECT
和Id
,然后是UPDATE Things
使用Id
。第二个事务在History
table 中插入行。两个事务都使用TransactionScope
和Read Committed
隔离级别进行控制。
我正在尝试使用
等场景对性能进行基准测试- 5000 行
Things
table - 每秒 25 次查询(上面的#1)
- 每秒 200 次更新(上面的#2)
环境:我的开发机器(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 无关。