搜索TEXT字段时,Microsoft SQL中发生了一个有趣的问题。我有一个表,其中包含两个字段,Id(int)和Memo(text),其中填充了成千上万的数据行。现在,假设有一个查询,例如:


从表中选择ID WHERE ID = 1234


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


从表中的WHERE Id = 1234和Memo LIKE'%test%'中选择ID


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

尽管这是它的工作,但我只是发现它实际上是在“备注”字段上尝试创建统计信息。如果关闭“自动创建统计信息”,查询将立即运行。

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


设为AUTO_CREATE_STATISTICS OFF


(我知道,任何普通人都只会在此字段上创建全文索引并将其命名为“一天”。之所以不一定要这样做,是因为我们的数据中心正在使用相同的数据库设计为4000多家客户托管应用程序。更不用说,这个问题发生在数据库中的各种文本字段上,所以如果我走那条路线,将需要成千上万的全文索引。更不用说,添加全文索引会增加存储需求,备份变更,灾难恢复程序变更,繁文tape节等等)。

最佳答案

我认为您无法针对每个查询将其关闭。

最好的办法是识别所有可能有问题的列,然后使用指定的CREATE STATISTICS0 ROWS以及0 PERCENT自己对它们进行NORECOMPUTE识别。

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

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

10-07 19:33
查看更多