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 

Есть ли более эффективный способ сделать это?

Эти таблицы могут содержать огромное количество данных, поэтому я задаю этот вопрос.

Заранее спасибо, Нуриэль

2 ответа

Я был бы более склонен сформулировать это так:

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

Увы, это никак не влияет на производительность. Проблема в том, что поиск шаблонов в середине строки не может использовать оптимизацию или любые другие методы. Вы застряли с алгоритмами объединения вложенных циклов.

В некоторых случаях вы можете использовать полнотекстовый индекс. Это может быть немного сложным при объединении двух таблиц.

Есть техническое решение этой проблемы. Он включает в себя индексы, построенные на чем-то, называемом n-граммами (скажем, 3-символьные комбинации). Однако SQL Server не поддерживает этот тип индексации.

Хм, вы можете использовать как оператор. Возможно, это не даст вам существенного повышения производительности, но у него есть шанс использовать индекс (если в этом столбце есть индекс), в то время как с функциями в предложении where индексы никогда не будут использоваться.

Другие вопросы по тегам