Sql server 优化现有数据库时,首先要检查哪些问题?

Sql server 优化现有数据库时,首先要检查哪些问题?,sql-server,database,performance,database-design,configuration,Sql Server,Database,Performance,Database Design,Configuration,在优化(性能调整、故障排除)现有(但您不知道)数据库时,最重要的问题是什么,以及按照什么顺序进行研究? 在您以前的优化中,哪些操作/措施的效果最好(可能工作量最少) 我想把这个问题分成以下几类(按我感兴趣的顺序): 我们需要在最短的时间内展示性能提升(改进)。i、 e.最具成本效益的方法/行动 非侵入性或最少麻烦的最有效方法(不改变现有模式等) 侵入式方法 更新: 假设我在dev机器上有一个数据库副本,但无法访问生产环境以观察实际使用的统计数据、最常用的查询、性能计数器等。 这是与开发相关但与D

在优化(性能调整、故障排除)现有(但您不知道)数据库时,最重要的问题是什么,以及按照什么顺序进行研究?
在您以前的优化中,哪些操作/措施的效果最好(可能工作量最少)

我想把这个问题分成以下几类(按我感兴趣的顺序):

  • 我们需要在最短的时间内展示性能提升(改进)。i、 e.最具成本效益的方法/行动
  • 非侵入性或最少麻烦的最有效方法(不改变现有模式等)
  • 侵入式方法
  • 更新:
    假设我在dev机器上有一个数据库副本,但无法访问生产环境以观察实际使用的统计数据、最常用的查询、性能计数器等。
    这是与开发相关但与DBA无关的问题。
    更新2:
    假设数据库由其他人开发,并在交付生产之前交给我进行优化(审查)。
    将外包开发与最终用户分离是很常见的

    此外,还有一种数据库设计范例,与应用程序数据存储不同,数据库本身应该是一种独立于使用它的特定应用程序或其使用上下文的价值

    更新3:感谢所有的回答者!你们都逼我打开子问题

    • 创建性能基线(非侵入式,使用性能计数器)

    • 确定最昂贵的查询(非侵入式,使用SQL Profiler)

    • 确定最常运行的查询(非侵入式,使用SQL Profiler)

    • 识别任何过于复杂的查询,或者使用执行缓慢的结构或模式的查询。(识别、使用SQL探查器和/或代码检查的非侵入性;如果更改,可能是侵入性的,可能需要大量重新测试)

    • 评估你的硬件

    • 确定有利于测量工作负载的索引(非侵入式,使用SQL Profiler)

    • 测量并与基线进行比较

    • 如果您有非常大的数据库或极端的操作条件(如24/7或超高的查询负载),请查看RDBMS提供的高端功能,如表/索引分区


    这可能很有趣:

    最重要的事情是收集最新的统计数据。数据库的性能取决于:

    • 图式
    • 数据库中的数据;及
    • 正在执行的查询
    孤立地观察其中任何一个都远没有整体有用

    一旦收集了统计数据,就可以开始识别低于标准的操作

    值得一提的是,我们修复的绝大多数性能问题都是通过添加索引、添加额外的列和触发器,将计算成本从
    select
    转移到
    insert/update
    ,并巧妙地通知用户他们的查询(我们可以说)不是最优的:-)


    他们通常很高兴我们可以给他们一个运行速度更快的等价查询。

    如果您不知道数据库,并且您处于压力之下,那么您可能没有时间查看Mitch的检查表,这是监控服务器运行状况的最佳实践

    您还需要访问生产,从您可以运行的各种查询中收集真实信息。没有这个,你注定要失败。服务器负载模式很重要:您不能自己在开发服务器上重现许多问题,因为您不会像最终用户那样使用系统

    此外,关注“最大的成功”。每天凌晨3点运行一次的昂贵查询可以忽略。一个不太昂贵的每秒钟运行一次是非常值得优化的。但是,如果不了解服务器负载模式,您可能不知道这一点

    所以,基本步骤

    假设你是消防队员:

    • 服务器日志
    • SQL Server日志
    • sys.sys进程,例如异步\u网络\u IO等待
    反应慢:

    • 分析器,带有持续时间筛选器。什么东西经常跑而且很长
    • ,根据使用频率加权
    你应该拥有的东西:

    • 备份
    • 上述备份的测试还原
    • 定期索引与统计维护
    • 定期DBCC和完整性检查
    编辑:更新后

    • 静态分析只是最佳实践:您无法优化使用。这就是你所能做的。这是marc_的答案

    • 您可以猜测最常见的查询可能是什么,但无法猜测将写入多少数据,也无法猜测一个查询使用更多数据时的扩展程度

    • 在许多商店中,开发人员直接或作为第三行提供一些支持”

    • 如果另一个团队给了您一个DB供您审查,并将其交给另一个团队进行部署:这很奇怪


    如果您对数据库的运行时行为不感兴趣,例如,什么是执行最频繁的查询,什么是消耗时间最多的查询,则只能执行“静态查询”“分析数据库结构本身。事实上,这样做的价值要小得多,因为你只能检查一些糟糕设计的关键指标——但你无法真正了解所使用系统的“动态”

    我将在数据库中检查作为
    .bak
    文件获取的内容(没有收集实时和实际运行时性能统计数据的能力)将是:

  • 规范化-表结构是否规范化为第三种标准形式?(至少在大多数情况下——可能有一些例外)

  • 所有表都有主键吗?(“如果它没有主