我的任务是优化遗留系统中一个相当讨厌的存储过程。它是一个专门用于搜索的数据库,每天都在生成一个新副本,其中有很多复杂的连接被去规范化。没有执行写入,只有 SELECT,所以我认为可以通过将整个数据库设置为只读并将恢复模型更改为“简单”来进行一些简单的改进。
令我惊讶的是,这根本没有帮助!存储过程仍然需要相同的时间才能完成。事实上,我很惊讶我认为我做错了!
我的问题:
- 除了将“数据库只读”设置为“true”之外,我还需要做其他事情吗?
- 我期望通过将数据库设置为只读来显着提高性能是否错误?
- 恢复模型也一样:“简单”不应该有一些显着的影响吗?
- 是否有其他类似的数据库范围配置可以提高这种情况下的性能?
存储过程非常庞大,有临时表,40 多个表连接在 20 多个查询中。但我想在编辑此过程之前优化数据库本身。
最佳答案
由于您的 SP 不执行任何写入操作,因此没有理由期望通过更改恢复模型和读写模式来显着提高性能。
正如其他人提到的,您应该查看查询计划并优化您的查询。
另一个提示:当数据库被填满时,数据库中的索引可能会变得碎片化。由于数据不会再被修改,因此可能有助于使用 fillfactor 100 重建所有索引 - 这可能有助于消除碎片并压缩数据。
为数据库中的每个表调用此方法:ALTER INDEX ALL ON table_name REBUILD WITH (FILLFACTOR = 100)
。
通常,我不会期望从中获得太多性能提升,但这取决于特定的数据库。
说到查询优化,SQL Server 2005 及更高版本中有一些非常有用的功能:Execution Related和 Index-Related动态管理 View 。特别是,sys.dm_exec_query_stats和 missing indexes很有趣。
它们为您提供与 Tuning Advisor 几乎相同的信息,但使用的是真实工作负载,因此您无需模拟它并提供给 Advisor。
关于performance - 只读对 SQL Server 没有影响吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5011807/