动态索引创建 - SQL 服务器

Dynamic Index Creation - SQL Server

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

当关注性能时,通常的检查之一是 unused/missing 索引。我们有通常的标准索引,但取决于哪些模块或公司如何使用系统,那么它将需要不同的索引(其中有一个会计模块和一个文档管理模块)。对于数百个客户,不可能定期远程访问每个客户以执行优化工作。我想知道是否有其他人处于我的位置考虑过一个计划任务,该任务可以在需要时删除和创建索引?

我很担心(很明显),此过程所做的任何更改也将存储在 table 中,其中包含更改的完整详细信息和时间戳。我需要它是防弹的,如果它可能会引起问题,就不能将其发送到野外。我在考虑一个通宵或(可能)每周的任务。

下降指数:

创建索引

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

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

编辑: 我对此悬赏以收集一些进一步的意见,并从以前可能尝试过的任何人那里获得反馈。在赏金期限结束时,我会将其奖励给投票最多的答案。

SQL perf 调整顾问值得一试:https://msdn.microsoft.com/en-us/library/ms186232.aspx

另一种方法是获取性能数据,从这里开始:https://www.experts-exchange.com/articles/17780/Monitoring-table-level-activity-in-a-SQL-Server-database-by-using-T-SQL.html 并根据性能 table 数据生成索引

也检查这个:https://msdn.microsoft.com/en-us/library/dn817826.aspx

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

如果问题像您想象的那么简单,那么现在服务器本身或优化顾问肯定已经解决了。您至少做出了一个毫无根据的假设,

require the server to be up for a minimum amount of time to ensure all relevant server statistics are up to date.

Table 统计数据仅与上次重大更改后更新时一样好。正常运行时间不能保证任何有关 t运行cate table 或批量插入的内容。

This won't highlight duplicate indexes

但这是您 可以 使用系统 table 在单个查询中完成的事情。 (如果调优工具对这些没有帮助,那将令人失望。)您可以类似地查找重叠索引,例如列 {a,b} 和 {a};第二个将没有用,除非 {b} 是选择性的 and 有些查询没有提到 {b}。

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

我必须告诉你,当我几年前做过一次这种分析时,我很失望地发现大多数问题儿童都是糟糕的查询,通常是由糟糕的 table 设计引起的。没有索引可以帮助 SQL 骡子。希望那不会是你的经历。

您没有提到的一个方面可能与机器容量同样重要。您可能会考虑收集 SQL 服务器统计信息的每小时快照,例如磁盘队列深度和分页。几乎所有的服务器都不能通过增加 RAM 来改进,有时这确实是最好的答案。