加速文本搜索查询大数据集

时间:2015-07-14 14:44:33

标签: sql sql-server tsql

嗨,我希望有人给我一个提示。我在下面有一个查询,它在#TempLogins表中过滤了详细信息字段。详细信息字段是一个文本字段,其中包含许多类型的文本字符串,其中一些包含具有“ResultID = 5”部分的URL,这些部分包含在ResultIDSearch和ResultSetIDSearch字段中。带有“ResultID = 5”条目的记录是我要过滤的记录。

我遇到的问题是查询运行时间太长而无法运行。 TempLogin表有大约200 K记录,TempSearch表有大约80 K记录。

有关如何重写或加快此查询的任何提示将不胜感激。

enter code here: select * from #TempLogins a where exists
                      (select 1 from #TempSearch t1 where 
                                 a.detail like '%' + t1.ResultIDSearch + '%'
                                 or 
                                 a.detail like '%' + t1.ResultSetIDSearch + '%')

2 个答案:

答案 0 :(得分:0)

这是连接版本,但问题是像%将是一个表扫描
#TempLogins.detail上的索引可能会有所帮助,但我对此表示怀疑

select distinct a.* 
  from #TempLogins a
  join #TempSearch t1 
    on a.detail like '%' + t1.ResultIDSearch + '%'
    or a.detail like '%' + t1.ResultSetIDSearch + '%';

这可能会做得更好

select a.* 
  from #TempLogins a
  join #TempSearch t1 
    on a.detail like '%' + t1.ResultIDSearch + '%'
UNION
select a.* 
  from #TempLogins a
  join #TempSearch t1 
    on a.detail like '%' + t1.ResultSetIDSearch + '%'

如果您可以从ResultIDSearch和ResultSetIDSearch中解析这些术语,然后加入=

答案 1 :(得分:0)

你可以尝试PATINDEX ..有时它比LIKE % %

更快
SELECT
    *
FROM
    #TempLogins a
WHERE
    EXISTS ( SELECT
                1
             FROM
                #TempSearch t1
             WHERE
                PATINDEX('%' + t1.ResultIDSearch + '%', a.detail) > 0           
                OR PATINDEX('%' + t1.ResultSetIDSearch + '%', a.detail) > 0           
    )