在搜索 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 ROWS
或 0 PERCENT
和 NORECOMPUTE
自己对它们进行处理。
如果您有一个维护窗口,您可以在其中运行它,最好在没有此 0 ROWS
限定符的情况下运行,但仍然保留 NORECOMPUTE
。
您也可以考虑启用 AUTO_UPDATE_STATISTICS_ASYNC
,这样它们仍然会自动重建,但这是在后台发生的,而不是阻止当前查询的编译,但这是一个数据库范围的选项。
关于sql-server - 设置 'auto create statistics' 导致通配符 TEXT 字段搜索挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7508700/