【发布时间】:2016-08-19 01:20:29
【问题描述】:
好的,所以我为一家销售具有 MS SQL Server 后端的网络产品的公司工作(可以是任何版本,我们刚刚将我们的要求更改为 2008+,因为 05 已不再提供扩展支持)。所有数据库都归购买产品的公司所有,但我们有 VPN 访问权限,并且有技术支持部门来处理任何问题。我的职责之一是充当 SQL 问题的第三线支持。
当关注性能时,通常的检查之一是未使用/缺失索引。我们有通常的标准索引,但取决于哪些模块或公司如何使用系统,那么它将需要不同的索引(其中有一个会计模块和一个文档管理模块)。对于数百个客户,不可能定期远程访问每个客户以执行优化工作。我想知道在我的职位上是否有其他人考虑过可以在需要时删除和创建索引的计划任务?
我有顾虑(显然),此过程所做的任何更改也将存储在包含更改的完整详细信息和时间戳的表中。我需要这个是防弹的,如果它可能会导致问题,就不能将它发送到野外。我正在考虑一个通宵或(可能)每周的任务。
删除索引:
- 要求服务器至少运行一段时间,以确保所有相关的服务器统计信息都是最新的(例如 2 周或 1 个月)。
- 仅删除正在使用的表的未使用索引(系统未使用部分的索引不是问题)。
- 记录下来。
- 这不会突出显示重复的索引(必须手动),只会突出显示快速获胜(写入时未使用的索引)。
创建索引
- 仅查找值高于某个阈值的索引。
- 必须检查是否可以修改任何类似的索引来满足要求。这可能是一个排名(检查所有索引字段是否相同,然后对包含的字段进行评分,看看是否需要额外的字段)。
- 限制要创建的索引的最大数量(例如每周 5 个),以确保它不会被忘却并一次创建一堆)。这应该有助于只关注最重要的索引。
- 记录下来。
这需要是动态的,因为我们在不同版本的系统上拥有不同使用模式的客户。
澄清一下:我不希望任何人为此编写代码,这更像是一个与此类任务的可行性和关注点有关的问题。
编辑:我已经为此提供了赏金,以收集一些进一步的意见,并从以前可能尝试过此操作的任何人那里获得反馈。在赏金持续时间结束时,我会将其奖励给投票最多的答案。
【问题讨论】:
-
为什么要从 SQL Server 2005 升级到 SQL Server 2008,而不是 2014 或 2016?
-
我可以看到删除未使用的索引,但动态创建索引似乎是个坏主意。您应该使用缺少的索引作为建议,并评估它们是否真的是一个好主意。你必须着眼于更大的图景。我曾多次建议索引,但我可以向现有索引添加另一列并节省一些空间但提高性能。只是说,我会格外小心。
-
这里有一些相关链接dba.stackexchange.com/a/44002/3690
-
简而言之:这是一个难题(在 NP 硬意义上)。通过删除索引,您可能会面临在财政年度结束时生成“非常重要的报告”需要几天而不是几分钟的风险,并且系统的其余部分在此期间几乎无法使用。如果创建太多索引,优化器将开始无法选择最佳执行计划。将有太多可能的变体供优化器分析。 @MartinSmith 链接到 dba.se 很棒。
-
也许你想看看这里:brentozar.com/blitzindex 这个网站有一堆针对 MS-SQL-Servers 的优化内容,链接的 SP 会为你提供建议。
标签: sql sql-server indexing scheduled-tasks