SQL Server 2012 CPU使用率激增至100%

时间:2015-05-09 07:12:27

标签: sql-server hibernate amazon-web-services sql-server-2012

我正在使用SQL Server 2014 in AWS,AWS图像配置是4核和16GB RAM(m3.xlarge)。我正在运行以下简单查询,

SELECT * FROM user_table WHERE user_id = '10'

user_table包含1000k条记录,user_id是主键。当通过EJB hibernate从我的应用程序执行上述简单查询时,CPU暂时上升到10%并再次恢复正常。

所以我的用例是,100个用户将同时尝试命中应用程序,因此在上述查询的一小部分中,上述查询将尝试在几分之一秒内执行。因此CPU使用率达到100%。完成所有查询执行后,CPU使用率恢复正常,为1%。

  • 为什么会这样?我是否需要增加我的AWS实例类型?
  • 为了使SQL服务器能够处理100个或更多并发命中而不提高CPU使用率,我应该怎么做?如果我的查询非常复杂,那么可能有机会获得峰值,但我的查询很简单直接。
  • SQL Server 2014是否有可用的基准测试指标?
  • 通过低CPU使用率消耗来支持SQL服务器并发命中的任何解决方案?

修改1:

  • 我的数据文件大小的另一个信息是32.2GB和日志 我的数据库的文件大小约为894mb

  • 我的数据库的隔离级别为READ_COMMITTED_SNAPSHOT is set to ON。 但是当我尝试设置READ_COMMITTED_SNAPSHOT to OFF时,性能提升差异达到了20%,但性能却没有那么大提升。

7 个答案:

答案 0 :(得分:4)

我会在密钥上创建聚簇索引,因为所有内容都存储在堆中,直到您定义一个。这可能导致高CPU使用率(即使它在内存中)

Link to MSDN Article

特别是

  

如果表是堆并且没有任何非聚簇索引,则必须检查整个表(表扫描)以查找任何行。当表格很小时,例如公司的12个地区办事处的名单,这是可以接受的。

警告:

  

警告创建或删除聚簇索引需要重写   整张桌子。如果表具有非聚簇索引,则全部   无论何时聚簇,都必须重新创建非聚簇索引   索引已更改。因此,从堆更改为聚簇索引   结构或背部可能需要花费大量时间并需要磁盘空间   在tempdb中重新排序数据。

这个SQL应该可以解决问题(一旦你在某个地方得到了很好的备份)

CREATE CLUSTERED INDEX IDX_UserID on user_table(User_ID)

正常索引也可以正常工作,但是你应该总是有一个聚簇索引来对数据进行合理排序,然后是任何其他高使用率索引。

答案 1 :(得分:2)

很难(读不可能)用这么少的数据来确定,但对我来说这听起来很完美:100%CPU意味着sql-server完全不受IO的限制,但只使用CPU来执行查询,所以它可能会在内存中找到所需的一切,并且它也能够利用所有CPU,因此也没有瓶颈。

只要表现足够,就不用担心了。当然,一旦有更多的查询进入系统,事情可能会变得更有趣。我期望的一件事是数据库缓存中出现问题,因此CPU负载下降,而IO增加,性能下降。

答案 2 :(得分:1)

您可以采取以下方法:

  1. 如果您的大多数查询都基于user_id列作为where子句,请在user_id列上对表进行索引。
  2. 正如你所说,每次查询运行时CPU都会激活,这意味着CPU周期花费在为查询生成计划上,因为下次查询运行时不应该重复使用它应该重用计划。检查 PARAMETRIZATION
  3. 请考虑 PARTITIONING 是否适用于表格。
  4. 假设如果100个用户连接到同时执行相同查询的实例会发生什么情况,我建议您运行 SQLQueryStress 工具并观察实例的行为 sp_AskBrent 的帮助。这些结果将帮助您确定潜在的问题或根本原因。

答案 3 :(得分:0)

您是否运行过SQL Profiler以确保没有其他查询导致CPU峰值?

答案 4 :(得分:0)

您是否为数据库编制了索引?如果没有,请索引它。索引会对数据访问时间产生巨大影响。我的事情滞后不是休眠的问题。您只需索引数据库并尝试查询。

答案 5 :(得分:0)

如果user_id是BIGINT,查询不应该是

SELECT * FROM user_table WHERE user_id = 10

数据转换成本很高,具体取决于运行查询的次数

答案 6 :(得分:0)

如果您查看执行计划(在SQL Server Management Studio中激活按钮"包括实际执行计划")运行查询时唯一要看的事情应该是:

选择0%< -----聚集索引搜索(聚集)100%

如果不是:此表上的索引有问题。如果user_id是唯一的,则应该有唯一的聚簇索引。

试一试;)