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 индексы никогда не будут использоваться.