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



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

我使用以下代码使用CHARINDEX()函数做到了这一点:

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

有没有更有效的方法?

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

提前感谢,努里尔

我更倾向于将其表述为:

SELECT *
FROM A JOIN
     B
     ON A.stringColumn LIKE '%' + B.stringColumn + '%';

唉,这根本无助于性能。 问题是在字符串中间查找模式不能使用优化或任何其他技术。 您坚持使用嵌套循环联接算法。

在某些情况下,您可能能够使用全文索引。 在两个表之间连接时,这可能有点挑战性。

这个问题有一个技术解决方案。 它涉及基于称为 n 元语法(例如 3 个字符组合)的索引。 但是,SQL Server 不支持此索引类型。

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

最新更新