比较sql server中两个字符串之间的substring属性的最快方法

时间:2014-06-12 20:41:26

标签: sql sql-server-2008

给定两个字符串A和B,比较A是B的子串还是B的子串的最快方法是什么?

 A LIKE '%' + B + '%' OR B LIKE '%' + A + '%'

CHARIDNEX(A,B) <> 0 OR CHARINDEX(B,A) <> 0

我认为它是前者,因为它没有计算位置   问题1:有更快的方法,因为我想最小化B必须使用的次数,因为B是我通过处理另一个列值得到的字符串。

作为补充说明,

基本上我想用C,C

列做如下的事情
SELECT
CASE WHEN A LIKE Processing(C) THEN 0
     WHEN A LIKE '%' + PROCESSING(C) + '%' OR PROCESSING(C) LIKE '%' + A + '%' THEN LEN(A) - LEN(PROCESSING(C))
END AS Score
FROM @table

其中A和C是表格中的列,@ table。可以看出,我调用Processing(C)的次数是巨大的,因为它对每条记录都是如此 问题2:我应该将Processing(C)放在单独的临时表中,然后针对该列运行子字符串检查,或者继续使用相同的方法。

1 个答案:

答案 0 :(得分:0)

我的猜测是charindex()like在这种情况下会有类似的表现。不要犹豫,测试哪个更快(并报告结果,以便我们都可以学习)。

但是,这种特殊的优化可能不会对整体查询产生影响。您的问题可能是过早优化的一个例子。

曾几何时,我认为like的表现比同等的字符串操作差。但是,like在许多数据库中都得到了优化,包括SQL Server。作为优化的示例,like能够使用索引(当没有通配符或通配符在末尾时)。 charindex()不使用索引。如果您在相应字符串的开头查找匹配项,那么您的查询可能会利用索引。

编辑:

关于PROCESSING(c)的问题,您可以考虑使用子查询:

SELECT (CASE WHEN A LIKE Processing_C THEN 0
             WHEN A LIKE '%' + Processing_C + '%' OR Processing_C LIKE '%' + A + '%'
             THEN LEN(A) - LEN(Processing_C)
        END) AS Score
FROM (select t.*, PROCESSING(C) as Processing_C
      from @table
     ) t