sql-server - 设置 'auto create statistics' 导致通配符 TEXT 字段搜索挂起

标签 sql-server statistics

在搜索 TEXT 字段时,我在 Microsoft SQL 中遇到了一个有趣的问题。我有一个包含两个字段的表,Id (int) 和 Memo (text),其中填充了数十万行数据。现在,想象一个查询,例如:

SELECT Id FROM Table WHERE Id=1234

很简单。假设有一个 ID 为 1234 的字段,因此它返回一行。 现在,让我们在 WHERE 子句中再添加一个条件。

SELECT Id FROM Table WHERE Id=1234 AND Memo LIKE '%test%'

查询应该提取一条记录,然后检查 Memo 字段中是否存在单词“test”。但是,如果有足够的数据,这条语句就会挂起,就好像它是先搜索 Memo 字段,然后再与 Id 字段交叉引用结果。

虽然它看起来是这样做的,但我只是发现它实际上是在尝试在 Memo 字段上创建统计信息。如果我关闭“自动创建统计信息”,查询会立即运行。

所以我的问题是,如何禁用自动创建统计信息,但只针对一个查询?也许是这样的:

SET AUTO_CREATE_STATISTICS OFF

(我知道,任何普通人都会在这个字段上创建一个全文索引然后收工。我不一定能这样做的原因是因为我们的数据中心正在为超过 4,000 名客户托管一个应用程序,使用相同的数据库设计。更不用说,这个问题发生在数据库中的各种文本字段上。所以如果我走那条路,将需要数万个全文索引。更不用说,添加全文索引会增加存储空间要求、备份更改、灾难恢复程序更改、繁文缛节文书工作等...)

最佳答案

我不认为你可以在每个查询的基础上关闭它。

您能做的最好的事情是识别所有可能有问题的列,然后 CREATE STATISTICS使用指定的 0 ROWS0 PERCENTNORECOMPUTE 自己对它们进行处理。

如果您有一个维护窗口,您可以在其中运行它,最好在没有此 0 ROWS 限定符的情况下运行,但仍然保留 NORECOMPUTE

您也可以考虑启用 AUTO_UPDATE_STATISTICS_ASYNC,这样它们仍然会自动重建,但这是在后台发生的,而不是阻止当前查询的编译,但这是一个数据库范围的选项。

关于sql-server - 设置 'auto create statistics' 导致通配符 TEXT 字段搜索挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7508700/

相关文章:

python - 如何使用norm.ppf()?

asp.net - 您的灾难恢复计划是什么?

c# - 如何为 dbtype decimal 传递空值?

SQL Server : Rollback without BEGIN TRANSACTION

sql-server - SQL 服务器 : tools to show relations

algorithm - 用于计算数据子集的平均值和方差的在线算法

sql - nvachar 的时间和日期

machine-learning - 根据过去 3 年的季度客户数量预测 future 4 个季度的客户数量

drupal - UberCart 添加的产品统计信息

c++ - Armadillo 'cor' 函数返回标量