【问题标题】:Doesn't Read-Only make a difference for SQL Server?只读对 SQL Server 没有影响吗?
【发布时间】:2011-02-16 02:09:33
【问题描述】:

我的任务是优化遗留系统中一个相当讨厌的存储过程。它是一个专门用于搜索的数据库,每天都会生成一个新副本,其中许多复杂的连接都被反规范化了。没有执行写入,只有 SELECT,所以我认为可以通过将整个数据库设置为只读并将恢复模型更改为“简单”来进行一些简单的改进。

令我惊讶的是,这根本没有帮助!存储过程仍然需要相同的完成时间。事实上,我很惊讶我认为我做错了!

我的问题:

  • 除了将“Database read-only”设置为“true”之外,我还需要执行其他操作吗?
  • 我期望通过将数据库设置为只读来显着提高性能是错误的吗?
  • 恢复模型也是如此:“简单”不应该有一些明显的影响吗?
  • 是否有其他类似的数据库范围配置可以提高这种情况下的性能?

存储过程很大,有临时表,40 多张表加入了 20 多个查询。但是我想在编辑这个过程之前优化数据库本身。

【问题讨论】:

  • Some graphs on readonly vs readwrite 表明您应该只期待适度的收益。大概这个查询没有做任何会被记录的数据修改,所以恢复模型不会有任何区别。您需要查看执行计划以确定实际的瓶颈。
  • 也许您应该从查看索引开始?创建索引会产生巨大的性能影响。
  • @Martin,感谢您的指点,这是一篇有趣的文章。我想我对性能显着提升的期望是错误的。
  • 我会说你的 2 个中间假设/问题是错误的;在只读的简单恢复模型数据库中,查询计划开销可能远远超过任何小的增量收益。修复坏掉的东西。
  • @LukLed,所有“明显”的索引似乎都设置正确,所以那里也没有简单的改进。

标签: performance sql-server-2005


【解决方案1】:

由于您的 SP 不执行任何写入操作,因此没有理由期望更改恢复模式和读写模式会显着提高性能。

正如其他人所提到的,您应该研究查询计划并优化您的查询。

另一个提示:当数据库被填满时,数据库中的索引可能会变得碎片化。由于数据不会再被修改,它可能有助于使用填充因子 100 重建所有索引 - 这可能有助于消除碎片并压缩数据。
为数据库中的每个表调用:ALTER INDEX ALL ON table_name REBUILD WITH (FILLFACTOR = 100)
一般来说,我不会期望由此带来太多的性能提升,但这取决于特定的数据库。

说到查询优化,SQL Server 2005 及更高版本中有非常有用的功能:Execution RelatedIndex-Related 动态管理视图。特别是,sys.dm_exec_query_statsmissing indexes 很有趣。
这些为您提供与 Tuning Advisor 几乎相同的信息,但使用的是真实的工作负载,因此您无需模拟它并提供给 Advisor。

【讨论】:

    【解决方案2】:

    您是否尝试过使用 SQL Server 中包含的数据库引擎优化顾问?它将分析您的查询并建议将提高查询性能的新索引。其中一些会很好,一些会很糟糕(例如,我看到它建议将表中的每一列都添加到索引中,有时像 30 个!),所以我不会盲目地遵循它。通常我会添加一些索引然后重新测试,以找到最重要的建议。我用它优化了许多我认为我已经正确索引的查询,却发现我可以从它们中获得更多的性能。

    【讨论】:

    • 是的,我已经运行了 Tuning Advisor,并且会非常仔细地查看索引。
    【解决方案3】:

    我有一个类似的设置,带有大量大型临时表的大型存储过程。
    我们的问题是临时表之间的连接非常慢。
    我建议您查看您的执行计划并尝试将相关索引添加到临时表(如果您还没有)。

    【讨论】:

      猜你喜欢
      • 2011-10-23
      • 2022-12-31
      • 2022-01-16
      • 2012-08-31
      • 2011-10-02
      • 2014-03-30
      • 2016-05-26
      • 2011-11-17
      • 1970-01-01
      相关资源
      最近更新 更多