我在所有列上都有一个名为Locations的表,其中包含FullText索引。有一个PK列(INT),其余的是TEXT / VARCHAR。该表有300,000条记录。
以下查询需要2分钟才能返回一条记录
SELECT TOP 1 * FROM Locations WHERE CONTAINS(*, '"1*"') ORDER BY LocationID
当使用长度为1到3位的任意数字组合时,这个慢查询时间是一致的。
使用字符(a-zA-Z)正常运行,响应时间小于25毫秒。
知道为什么数值会导致这样的性能下降吗?
答案 0 :(得分:0)
我怀疑这是两个原因的组合。
原因1:对公共前缀的通配符搜索速度很慢。记录是否包含许多以" 1"开头的字符串(数字或字母数字)?如果是这样,那可能解释了糟糕的表现。
通配符搜索往往比其他全文搜索慢。包含前缀的条款越多(" 1"在您的情况下),全文引擎必须做的工作越多。
尽管300,000条记录并不是全文引擎要处理的大量记录,但每条记录中唯一条款的数量以及每个条目的记录和列数等因素将对搜索性能。
原因2:ORDER BY列缺少索引。您应该确保将LocationID列编入索引,因为这是您对结果进行排序的方式。有可能" 1 *"正在产生大量结果,所有结果都需要进行排序。如果没有索引,排序可能需要很长时间。