2017-02-01 96 views
0

我有两个表:A和B,他们每个都包含字符串。 当表A的字符串包含表B的字符串时(B.stringColumn是A.stringColumn的子串),我需要查找表A和表B之间的所有匹配。SQL:内部连接,其WHERE子句包含CHARINDEX() - 提高性能

我做到了用CHARINDEX()功能如下代码:

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

有没有更有效的方法来做到这一点?

这张表可能包含大量的数据,这就是为什么我问这个问题。

由于提前, Nuriel

+1

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

回答

2

我会更倾向于此语为:

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

唉,这不利于性能的。问题是,在字符串中查找模式不能使用优化或其他技术。你坚持使用嵌套循环连接算法。

在某些情况下,您可能可以使用full text index。加入两个表格时,这可能有点困难。

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

+0

出于好奇,RDBMS支持这些索引吗? –

+0

@RaduGheorghiu。 。 。 Postgres(https://www.postgresql.org/docs/9.6/static/textsearch-indexes.html)。其他数据库可能有支持它们的扩展。 –

0

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