保留段落样式列的列统计信息?

Jim*_*ter 5 sql-server statistics

特定于 Microsoft SQL Server...

如果查询具有针对段落样式文本列的搜索谓词,它将创建系统创建的统计信息来回答查询。

知道了。

我的问题是是否应该稍后删除这些,因为它们没有多大帮助,因为它们纯粹基于文本字符串的前几个字符,并且在搜索中实际上没有用,这将是对表格的扫描,无论如何什么。稍后通过自动统计更新的“梳理”操作或自行开发的统计梳理过程会遇到这些并可能尝试更新它们。
更复杂的是,该列通常是“宽”的,并且通常可以是“深”的(例如,一亿多行)并导致大量 IO 命中以完成即使是小样本扫描以更新统计数据。

我的想法使我说它们应该被删除。别人怎么说?

我不是在问对这些类型的数据的查询是否可取。他们发生了。我只是怀疑这些自动生成的统计数据的用处及其存在的理由,除非您碰巧有一个文本列,其中前几个字符实际上对查找您需要的行有用 - 足以让您考虑创建一个索引那个专栏 - 我希望这是不寻常的。

你说什么?保留这些信天翁还是摆脱它们?

wBo*_*Bob 10

首先,也许最重要的是,信天翁并不倒霉。他们实际上被认为是一个好兆头。在诗中,年轻的水手用他的弩射它,这种鲁莽的行为被认为是不吉利的。

其次,SQL Server 使用一种称为特里树的技术来进行字符串统计。这些没有很好的文档记录,但在“字符串统计信息”部分的“Microsoft SQL Server 2012 内部”中简要提及。您不能删除特里树或控制它们。

如果您删除与列关联的普通列统计信息,则下次有人查询该列时,它们将被重新创建,除非您明确禁用它们,这是不可取的。同样,水手被迫将死去的信天翁戴在脖子上作为惩罚:)

我认为肖恩关于使用全文索引的建议是一个很好的建议。总之,不要射击信天翁,不要禁用自动统计。

让我们以“古代水手的霜”为例来做一个简单的演练。我从此处提供的古腾堡计划中下载了文本,对其进行了一些清理并将其加载到 SQL Server 表中。对于Like带通配符的简单查询,我得到一个完整的聚集索引扫描,估计行数为 1.55,实际行数为 7:

简单的 Like 查询

查看该列的统计数据,我们可以看到很多对于其他查询可能没有多大意义的统计数据,我认为这就是您的观点:

DBCC SHOW_STATISTICS 结果

尽管如此,估计行数与实际行数(1.55 对 7)还是相当合理的,并且处于相同的数量级,但由于通配符,我们将获得有效的表扫描。

打开全文索引,我们可以获得更准确的行数,并开始查询全文索引以获取它存储的有关文档的其他信息,例如

SELECT * 
FROM dbo.documentText
WHERE CONTAINS ( documentText, 'albatross' )
GO

SELECT *
FROM sys.dm_fts_index_keywords( DB_ID(), OBJECT_ID('dbo.documentText') )


SELECT *
FROM sys.dm_fts_index_keywords_by_document( DB_ID(), OBJECT_ID('dbo.documentText') )


SELECT TOP 10 display_term, COUNT(*)
FROM sys.dm_fts_index_keywords_by_document( DB_ID(), OBJECT_ID('dbo.documentText') )
GROUP BY display_term
ORDER BY 2 DESC
Run Code Online (Sandbox Code Playgroud)

我们现在得到索引查找,这可能会在更大的表上产生很大的性能差异。

此处提供完整的演练脚本。

PS 没有信天翁在这篇文章的制作过程中受到伤害。