动态索引创建 - SQL Server

时间:2016-04-25 14:56:38

标签: sql sql-server indexing scheduled-tasks

好的,所以我为一家销售具有MS SQL Server后端的网络产品的公司工作(可以是任何版本,我们刚刚将我们的要求更改为2008+,现在05已超出扩展支持)。所有数据库都归购买产品的公司所有,但我们拥有VPN访问权限并且有技术支持部门来处理任何问题。我的一部分职责是充当SQL问题的第三线支持。

当性能受到关注时,通常的检查之一是未使用/缺失的索引。我们有通常的标准索引,但取决于哪些模块或公司如何利用系统,那么它将需要不同的索引(有一个会计模块和文档管理模块等)。由于有数百名客户,因此无法定期远程访问每个客户以进行优化工作。我想知道我职位上的其他人是否考虑过可以在需要时删除并创建索引的计划任务?

我很担心(显然),此程序所做的任何更改也将存储在一个表中,其中包含更改的完整详细信息和时间戳。我需要这是防弹,如果它可能导致问题,不能将某些东西送到野外。我在考虑一夜之间或(可能)每周任务。

删除索引:

  • 要求服务器启动至少一段时间,以确保所有相关的服务器统计信息都是最新的(例如2周或1个月)。
  • 仅删除正在使用的表的未使用索引(系统未使用部分的索引不是问题)。
  • 记录下来。
  • 这不会突出显示重复索引(必须是手动),只是快速获胜(带有写入的未使用索引)。

创建索引

  • 仅查找值高于特定阈值的索引。
  • 必须检查是否可以修改任何类似的索引以满足要求。这可以是排名(检查所有索引字段是否相同,然后对包含的字段进行评分,以查看是否需要额外的字段。)
  • 限制为要创建的最大索引数(例如每周5个),以确保它不会被带走并立即创建一堆)。这应该只关注最重要的索引。
  • 记录下来。

这需要是动态的,因为我们在不同版本的系统上拥有不同使用模式的客户。

只是为了澄清:我不希望任何人为此编码,这更像是一个与此类任务的可行性和关注点相关的问题。

编辑:我已经在这方面投了很多钱来收集一些进一步的意见,并从之前可能尝试过的人那里获得反馈。在奖金持续时间结束时,我会以最多的投票给予答案。

2 个答案:

答案 0 :(得分:2)

我无法推荐您正在考虑的内容,但您可以通过收集预期计划的输入并将其提供给客户和支持团队来简化您的生活。

如果问题像您想象的那样简单,那么服务器本身或调优顾问肯定会解决它。你至少做了一个无根据的假设,

  

要求服务器启动最短时间,以确保所有相关的服务器统计信息都是最新的。

表统计信息仅与上次重大更改后的更新一样好。正常运行时间不保证 truncate table 或批量插入的任何内容。

  

这不会突出显示重复索引

但是,您可以使用系统表在单个查询中执行此操作。 (如果调整小工具没有帮助,那将是令人失望的。)您可以类似地查找重叠索引,例如列{a,b}和{a};除非{b}具有选择性存在未提及{b}的查询,否则第二个将无用。

为了寻找新的索引,我很想尝试检测查询使用频率并自动分析查询计划输出。如果您可以识别经常使用的长时间运行的查询并将其物理操作(表扫描,散列连接等)映射到表和现有索引,那么您将有良好的输入来添加和删除索引。但是,您必须考虑不经常运行的季度报告,如果没有其他未使用的索引,则需要数天才能完成。

我必须告诉你,当我几年前做过那种分析时,我很失望地得知大多数有问题的孩子都是糟糕的问题,通常是由糟糕的桌面设计引起的。没有索引可以帮助SQL mule。希望这不是你的经历。

您没有触及的一个方面可能与机器容量同样重要。您可能会考虑收集SQL Server统计信息的每小时快照,例如磁盘队列深度和分页。几乎没有服务器存在,无法通过更多RAM进行改进,有时这确实是最好的答案。

答案 1 :(得分:1)