Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用CHARINDEX时,SQL Select非常慢_Sql_Sql Server_Database - Fatal编程技术网

使用CHARINDEX时,SQL Select非常慢

使用CHARINDEX时,SQL Select非常慢,sql,sql-server,database,Sql,Sql Server,Database,我正在使用sql server,有一个包含两列的表 myId varchar(80) cchunk varchar(最大值) 基本上,它存储大量文本,因此我需要它varchar(max)。 我的问题是,当我执行以下查询时: select * from tbchunks where (CHARINDEX('mystring1',tbchunks.cchunk)< CHARINDEX('mystring2',tbchunks.cchunk)) AND CHARINDEX('mystri

我正在使用sql server,有一个包含两列的表
myId varchar(80)

cchunk varchar(最大值)

基本上,它存储大量文本,因此我需要它
varchar(max)
。 我的问题是,当我执行以下查询时:

select *
from tbchunks
where
  (CHARINDEX('mystring1',tbchunks.cchunk)< CHARINDEX('mystring2',tbchunks.cchunk))
AND
  CHARINDEX('mystring2',tbchunks.cchunk) - CHARINDEX('mystring1',tbchunks.cchunk) <=10
选择*
从tbchunks
哪里
(CHARINDEX('mystring1',tbchunks.cchunk)CHARINDEX('mystring2',tbchunks.cchunk)-CHARINDEX('mystring1',tbchunks.cchunk)索引对CHARINDEX毫无帮助。特定列上的索引只能快速查找索引字段中的值正好是索引值的行。事实上,我很惊讶查询只需要3秒钟,因为它必须将每一行读取四次(或者至少两次)。

除了这里介绍的好想法,没有人能够真正解决我的问题,而是提供了一些有用的提示,引导我找到解决方案,我很乐意与大家分享

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


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

那么,您是否考虑并正确配置了它?说你“试过了,但速度很慢”并不能让你确信你正确地创建了目录,正确地填充了一个或多个索引,对数据进行了正确的查询以产生准确高效的近似搜索结果,等等。你花了多少时间进行全文搜索?不太长,我只是设置了目录并进行了测试,但速度很慢,所以我忘记了。不管怎样,我能用charindex吗?我上周开了一辆保时捷,它比我妻子的日产慢。哦,我忘了提油门下有一个啤酒瓶!如果我们不知道您是如何配置全文搜索的,也不知道您针对它运行了哪些查询,那么很难告诉您为什么全文搜索会变慢。另外,
'mystring1'/'mystring2'
始终是此查询的硬编码部分,或者它实际上是一个变量吗?不,您不使用
CHARINDEX
进行全文搜索。看见您已经放弃了专门为您的用例设计的技术,但没有对其进行适当的测试。是的,那么您有什么建议?索引可以在一定程度上减少I/O,提高某些查询的性能。如果所讨论的表有较大的行,那么使用索引而不是数据页可以更快地读取所有
cchunk
值。在OP的具体案例中不太可能有帮助。A可以在正确的环境中做令人惊讶的事情。对于CHARINDEX来说,它的等价物是CONTAINS(tbchunks,'NEAR((mystring1,mystring2),0,TRUE)-,它与“mystring1-mystring2”匹配,两者之间正好有一个空格