我正在使用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%。
修改1:
我的数据文件大小的另一个信息是32.2GB
和日志
我的数据库的文件大小约为894mb
。
我的数据库的隔离级别为READ_COMMITTED_SNAPSHOT is set to ON
。
但是当我尝试设置READ_COMMITTED_SNAPSHOT to OFF
时,性能提升差异达到了20%,但性能却没有那么大提升。
答案 0 :(得分:4)
我会在密钥上创建聚簇索引,因为所有内容都存储在堆中,直到您定义一个。这可能导致高CPU使用率(即使它在内存中)
特别是
如果表是堆并且没有任何非聚簇索引,则必须检查整个表(表扫描)以查找任何行。当表格很小时,例如公司的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)
您可以采取以下方法:
答案 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是唯一的,则应该有唯一的聚簇索引。
试一试;)