我们的应用程序最近运行速度非常慢。在调试和跟踪时发现该进程显示高CPU周期并且SQL Server显示高I / O活动。您能否指导一下如何优化它?
该应用程序现在大约一年了,数据库文件大小不是很大或任何东西。数据库设置为自动缩小。它在win2003上运行,SQL Server 2005和应用程序是一个用c#编码的web应用程序,即vs2005
答案 0 :(得分:4)
在数据库上运行SQL Profiler一段时间,以查看“慢度”是否是由于任何问题查询引起的。然后,您可以分析这些查询,以便运行任何索引或统计信息以提高性能。
正如评论所暗示的那样,自动缩小可能会导致数据库非常分散。数据库通常会根据需要增长,通常最好不要担心它有多大。只要您执行常规事务日志备份,那么最好让它增长。您可能需要问自己,性能比购买new.more磁盘更重要。
您还可以针对数据库运行一些维护计划以重建索引和统计信息。这可能会在短期内解决问题。
答案 1 :(得分:4)
答案 2 :(得分:1)
接下来查看查询的性能问题,我还会检查数据库中的数据库和表是否没有太多碎片。
您可以发出DBCC showcontig
语句来检查这一点。如果它显示表格严重分散,则应考虑创建定期执行的维护计划。在该维护计划中,您应指定应重建索引。通过这样做,表格将被整理碎片。
答案 3 :(得分:1)
我知道这个帖子已经有一段时间了,但我想我会加入我的2位。我们在sql server 2005生产数据库上遇到问题,其中cpu一直在80%到100%不断地运行。我们尝试了运行跟踪,评估作业,碎片整理,释放磁盘空间,我们能想到的每一个,但没有什么真正帮助。最后,我们在一个博客网站上发现了一篇帖子(我担心我们不记得哪一个)推荐使用Sql Server的缺失索引功能。
事实证明,SQL Server 2005及更高版本都具有此功能; SQL Server不断评估和记录它认为有助于提高性能的推荐索引。我们运行了下面的查询并实现了前130个索引(显示最大潜在收益的索引)。在一天中最繁忙的时段,我们的整体db cpu性能现在降至30%到40%,并且用户全面告诉我们他们的应用程序响应速度更快。
一些警告。我们不是DBA,因此您可以自行决定添加索引。同时向任何一个表添加太多索引可能对性能有害 - 因此请注意要添加的索引,并始终关注索引过载。
SELECT mid.database_id,
db.name,
migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) AS improvement_measure,
'CREATE INDEX [missing_index_' + CONVERT (varchar, mig.index_group_handle) + '_' + CONVERT (varchar, mid.index_handle) + '_' + LEFT (PARSENAME(mid.statement, 1), 32) + ']' + ' ON ' + mid.statement + ' (' + ISNULL (mid.equality_columns,'') + CASE WHEN mid.equality_columns IS NOT NULL AND mid.inequality_columns IS NOT NULL THEN ',' ELSE '' END + ISNULL (mid.inequality_columns, '') + ')' + ISNULL (' INCLUDE (' + mid.included_columns + ')', '') AS create_index_statement,
migs.*, mid.database_id, mid.[object_id]
FROM sys.dm_db_missing_index_groups mig
INNER JOIN sys.dm_db_missing_index_group_stats migs
ON migs.group_handle = mig.index_group_handle
INNER JOIN sys.dm_db_missing_index_details mid
ON mig.index_handle = mid.index_handle
INNER JOIN sys.databases db
ON mid.database_id = db.database_id
WHERE migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) > 10
ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC
答案 4 :(得分:0)
对于经常使用的查询,您可以使用EXPLAIN语句对它们进行分析。这将告诉您是否正在使用适当的索引以及正在扫描的行数。
答案 5 :(得分:0)
自动缩小的一个问题是,您无法控制它何时启动,因此它可以在实时使用期间运行并使一切都停止运转。如果您确实希望缩小数据库,请设置维护计划以在数小时内完成此操作。但实际上,我不确定你什么时候想要这个选项。如果有足够的磁盘空间,请让DB自然增长。如果没有,那就得到更多。磁盘空间很便宜,但缓慢的应用程序延迟可能会变得昂贵。同时关闭自动关闭功能。