给定两个字符串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)放在单独的临时表中,然后针对该列运行子字符串检查,或者继续使用相同的方法。
答案 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