代码之家  ›  专栏  ›  技术社区  ›  zapping

SQL Server高CPU和I/O活动数据库调优

  •  3
  • zapping  · 技术社区  · 16 年前

    我们的应用程序最近运行得很慢。在调试和跟踪过程中,我们发现该进程显示了较高的cpu周期,而SQL Server显示了较高的I/O活动。您能否就如何进行优化提供指导?

    6 回复  |  直到 16 年前
        1
  •  4
  •   Robin Day    16 年前

    在数据库上运行SQL Profiler一段时间,查看“缓慢”是否是由于任何问题查询造成的。然后,您可以分析这些查询,以便运行任何索引或统计信息以提高性能。

    不过,正如评论所指出的,自动收缩可能会导致数据库非常零碎。数据库通常会按需要增长,最好不要担心它希望有多大。只要您执行定期事务日志备份,那么最好让它增长。您可能需要问问自己,性能比购买更多新磁盘更重要。

    您还可以对数据库运行一些维护计划,以重建索引和统计信息。这可能会在短期内解决问题。

        2
  •  4
  •   lmsasu    16 年前
    1. 使用SQL 2005中的分析工具;它会告诉你哪些请求最持久;然后使用“显示执行计划”工具查看执行步骤;也许你会得到一个关于应该添加什么索引的提示;例如,对于大型表,应避免全表扫描。
        3
  •  1
  •   Frederik Gheysels    16 年前

    您可以发布 DBCC showcontig 声明来检查这一点。如果显示表严重碎片化,则应考虑创建定期执行的维护计划。在该维护计划中,您应该指定应该重建索引。这样,表将被碎片整理。

        4
  •  1
  •   Jesse    12 年前

    事实证明,SQLServer2005和更高版本都具有此功能;SQL Server不断评估和记录它认为有助于提高性能的推荐索引。我们运行下面的查询并实现了前130个索引(显示最大潜在收益的索引)。在一天中最繁忙的时候,我们的总体db cpu性能现在下降到30%到40%,所有用户都告诉我们,他们的应用程序响应速度更快。

    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
    
        5
  •  0
  •   Chris J    16 年前

    此外,对于经常使用的查询,可以使用EXPLAIN语句对其进行分析。这将告诉您是否使用了适当的索引以及扫描了多少行。

        6
  •  0
  •   MartW    16 年前

    自动收缩的一个问题是,您无法控制它何时启动,因此它可以在现场使用期间运行,并使一切都停止。如果您确实希望缩小数据库,请设置一个维护计划,以便在数小时内完成此操作。但我不确定你什么时候想要这个选项。如果有足够的磁盘空间,让数据库自然增长。如果没有,那就多买一些。磁盘空间很便宜,但速度慢的应用程序的延迟可能会很昂贵。同时关闭自动关闭。