【问题标题】:SQL: Inner join which its WHERE clause contains CHARINDEX() - Improve performenceSQL:它的 WHERE 子句包含 CHARINDEX() 的内部连接 ​​- 提高性能
【发布时间】:2025-12-21 19:20:13
【问题描述】:

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

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

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

有没有更有效的方法?

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

提前致谢, 努里尔

【问题讨论】:

  • 我相信,如果您只是在另一个字符串中的任何位置搜索子字符串,那么只有全文索引可以提供帮助(尽管对 FTI 不太熟悉)。如果是字符串以子字符串开头的情况,那么您可以利用目标列上的索引。我会使用语法:A.stringColumn LIKE %B.stringColumn% 并查​​看执行计划是否能够使用索引。

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


【解决方案1】:

我更倾向于将其表述为:

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

唉,这对性能毫无帮助。问题是在字符串中间寻找模式不能利用优化或任何其他技术。你被嵌套循环连接算法困住了。

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

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

【讨论】:

【解决方案2】:

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

【讨论】: