-2

我正在使用 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 何时开始变得准确?

4

2 回答 2

2

索引根本不会帮助 CHARINDEX。特定列上的索引只能快速找到索引字段中的值恰好是索引值的行。实际上,我很惊讶查询只需要 3 秒,因为它必须读取每一行四次(或至少两次)。

于 2013-04-14T18:42:11.207 回答
1

这里提出的想法很好,没有人能够真正解决我的问题,而是提供了有用的提示,引导我找到我愿意分享的解决方案。

使用全文确实是许多人提到的答案,但我设法将 Contains 与 Near 结合使用,因此它可以完全取代我当前的 sql 查询并提供惊人的速度。

包含(tbchunks,'NEAR((mystring1,mystring2),3,TRUE)')

于 2013-04-15T17:03:03.377 回答