在搜索TEXT字段时,我在Microsoft SQL中发生了一个有趣的问题。我有一个包含两个字段的表,Id(int)和Memo(文本),填充了数十万行数据。现在,设想一个查询,例如:
SELECT Id FROM Table WHERE Id = 1234
非常简单。假设有一个Id 1234的字段,所以它返回一行。 现在,让我们在WHERE子句中再添加一个条件。
SELECT Id FROM Table WHERE Id = 1234 AND Memo LIKE'%test%'
查询应拉出一条记录,然后检查“备注”字段中是否存在“test”一词。但是,如果有足够的数据,则此语句将挂起,就好像它首先搜索“备注”字段,然后使用“Id”字段交叉引用结果。
虽然这就是它的表现,但我发现它实际上是在尝试在Memo字段上创建统计数据。如果我关闭“自动创建统计信息”,查询会立即运行。
所以我的问题是,如何禁用自动创建统计信息,但仅限一个查询?也许是这样的事情:
SET AUTO_CREATE_STATISTICS OFF
(我知道,任何普通人都会在这个字段上创建一个全文索引并将其称为一天。我不一定要这样做的原因是因为我们的数据中心正在为超过4,000名客户托管应用程序相同的数据库设计。更不用说,这个问题发生在数据库中的各种文本字段上。如果我走这条路线就需要成千上万的全文索引。更不用说,添加全文索引会增加存储空间要求,备份更改,灾难恢复程序更改,繁文缛节文书工作等......)
答案 0 :(得分:3)
我认为你不能在每个查询的基础上关闭它。
您可以做的最好的方法是识别所有可能存在问题的列,然后使用0 ROWS
或0 PERCENT
指定的NORECOMPUTE
自行CREATE STATISTICS
。
如果你有一个维护窗口,你可以运行它,最好在没有0 ROWS
限定符的情况下运行,但仍然保留NORECOMPUTE
。
您也可以考虑启用AUTO_UPDATE_STATISTICS_ASYNC
,以便它们仍然可以自动重建,但这在后台发生,而不是阻止当前查询的编译,但这是一个数据库范围的选项。