我正在使用 sql server 并且有一个包含 2 列的表
myId varchar(80)
cchunk varchar(max)
基本上它存储大量文本,这就是我需要它的原因varchar(max)
。我的问题是当我做这样的查询时:
select *
from tbchunks
where
(CHARINDEX('mystring1',tbchunks.cchunk)< CHARINDEX('mystring2',tbchunks.cchunk))
AND
CHARINDEX('mystring2',tbchunks.cchunk) - CHARINDEX('mystring1',tbchunks.cchunk) <=10
完成大约需要 3 秒,表块大约只有 500,000 条记录,从上述查询返回的数据最大在 0 到 800 之间
我在 myid 列上有非聚集索引,它有助于快速选择计数(*),但对上述查询没有帮助。
我尝试使用全文但速度很慢。我尝试将 cchunk 中的文本拆分为更小的部分并添加一个 id 列,该列将连接所有这些拆分的块,但最终得到一个包含 200 万条拆分文本块记录的表(我这样做是为了添加索引)但仍然查询甚至更慢。
编辑: 修改表以包含主键(int)创建的全文目录,使用“Accent Senstive=true”在我的表上的“cchunk”列上创建全文索引运行相同的上述查询,它最终需要 22 秒,但速度要慢得多
更新 感谢大家建议全文(@Aaron Bertrand 谢谢!),我将我的查询转换为此
SELECT * FROM tbchunksAS FT_TBL INNER JOIN CONTAINSTABLE(tbchunks, cchunk, '(mystring1 NEAR mystring2)') AS KEY_TBL ON FT_TBL.cID = KEY_TBL.[KEY]
顺便说一句,cID 是我稍后添加的主键。无论如何,我得到了 borad 结果,我注意到返回的 RANK 列越高,结果就越好。我的问题是 RANK 何时开始变得准确?