SQL:其WHERE子句包含CHARINDEX()的内连接 - 提高性能

时间:2017-02-01 11:48:34

标签: sql-server sqlperformance sql-server-performance

我有两个表:A和B,每个表都包含字符串。 当表A的字符串包含表B的字符串时,我需要找到表A和表B之间的所有匹配项(B.stringColumn是A.stringColumn的子字符串)。

我是使用CHARINDEX()函数通过以下代码完成的:

SELECT *
FROM A, B
WHERE CHARINDEX(B.stringColumn, A.stringColumn) > 0 

有更有效的方法吗?

此表可能包含大量数据,这就是我提出这个问题的原因。

提前致谢, Nuriel

2 个答案:

答案 0 :(得分:2)

我更倾向于将其称为:

SELECT *
FROM A JOIN
     B
     ON A.stringColumn LIKE '%' + B.stringColumn + '%';
唉,这根本没有帮助。问题是在字符串中间查找模式不能使用优化或任何其他技术。您仍然坚持使用嵌套循环连接算法。

在某些情况下,您可以使用full text index。在两个表之间进行连接时,这可能会有点挑战。

此问题有一个技术解决方案。它涉及建立在称为n-gram(例如,3个字符组合)的东西上的索引。但是,SQL Server不支持此索引类型。

答案 1 :(得分:0)

嗯,你可以使用LIKE运算符。这可能不会给你一些重要的性能升级,但它有可能使用索引(如果该列上有索引),而使用where子句中的函数,将永远不会使用索引。