可以知道行存储索引的使用量,但是全文呢?
我在任何 GUI 或 DMV 中都找不到任何内容。甚至 dbatools 也不支持它。
我继承了一个具有一些全文索引的服务器,但我不知道是否需要它们。这个问题是我尝试获取所需的数据,以便在丢弃它们时感到安全。
可以知道行存储索引的使用量,但是全文呢?
我在任何 GUI 或 DMV 中都找不到任何内容。甚至 dbatools 也不支持它。
我继承了一个具有一些全文索引的服务器,但我不知道是否需要它们。这个问题是我尝试获取所需的数据,以便在丢弃它们时感到安全。
据我所知,没有 DMV 或类似的东西来显示全文索引的使用情况。我确实想知道是否可以使用 sys.dm_db_index_usage_stats (并发现一个结果表明可以),但我认为这行不通(更多内容见下文)。
一种可行的方法是使用查询存储。如果启用此功能(并捕获所有查询),您可以搜索使用全文搜索功能的存储计划,并从中查找相关表/索引。
确保查询存储已启用并将捕获模式设置为 ALL:
由于查询存储中的计划以文本形式存储,因此您可以查询任何命中的全文索引。像这样的事情会起作用:
(改编自: https: //www.scarydba.com/2020/05/11/find-indexes-used-in-query-store/)
您还可以利用查询存储的其他方面,例如查询的性能开销。
当然也有缺点 - 如果查询存储尚未启用,您将必须等待足够长的时间才能出现查询,并且在繁忙的环境中(特别是在捕获模式设置为 ALL 的情况下),您必须确保您不会因查询缓存刷新而丢失数据。也许最重要的是,您需要确保全文不会偶尔用于非常重要的事情(每年运行的一份报告,其中充满了依赖于您 11 个月前删除的索引的全文搜索)。也许您可以随着时间的推移定期导出查询存储结果并进行后期分析(但这超出了这个问题的范围)。
您无法证明负面结果并 100% 确定某些东西从未被使用过。您对此的确定程度在很大程度上取决于您环境的复杂性以及您对环境的了解程度(以及您的风险偏好)。更好的确定方法是询问组织中使用您数据库的人员。这可能并非在所有情况下都是可行的,但开发人员/报告编写者等可能能够提供帮助 - 一种非技术解决方案,但可能更有效。
如果您不介意主动提出的建议,为什么要删除这些索引呢?“如果它没有坏,就不要修理它”这句古老的格言是有价值的。您希望从删除它们中获得什么好处,以及如果需要但删除它们可能带来的风险。我理解想要“整理”继承的系统,但我建议有更简单、更安全且可能更有价值的方法来做到这一点。我当然不知道你的情况,但我建议只有当你认为这些索引实际上引起了问题时才采取这种做法。
使用 sys.dm_db_index_usage_stats
一篇旧的 stackoverflow 帖子建议,这可以用于通过 sys.dm_db_index_usage_stats 查找使用统计信息,并加入 sys.fulltext_catalogs 和 sys.fulltext_indexes。对那些命中索引的表的任何查询都会导致这些计数器增加,而不仅仅是全文搜索。
我在 AdventureWorks2019 上对此进行了测试,全文目录和索引已设置为默认值。
使用 dm_db_index_usage_stats 查询:
dm_db_index_usage_stats 测试开始时的结果:
运行全文查询:
dm_db_index_usage_stats 查询导致 user_scans 增加(如预期):
但是,非全文查询:
还会导致 dm_db_index_usage_stats 查询返回该索引的扫描增加:
我对此进行了更多尝试,但没有取得任何进展。可能其中还有一些可以使用的东西,但我找不到它,而且我认为旧帖子中的内容不起作用。