2017-02-01 5 views
0

У меня есть две таблицы: A и B, каждая из которых содержит строки. Мне нужно найти все соответствия между таблицей A и таблицей B, когда строка таблицы A содержит строку таблицы B (B.stringColumn - подстрока A.stringColumn).SQL: Внутреннее соединение, в котором предложение WHERE содержит CHARINDEX() - Улучшение производительности

Я сделал это с помощью следующего кода с помощью CHARINDEX() функции:

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

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

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

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

+1

Я считаю, что если вы просто выполняете поиск по подстроке в любой другой строке, то может помочь только полнотекстовое индексирование (но не слишком знакомое с FTI). Если это случай строки, начинающейся с подстроки, вы можете воспользоваться индексом в целевом столбце. Я бы использовал синтаксис: A.stringColumn LIKE% B.stringColumn% и посмотреть, может ли план выполнения использовать индексы. – BlackjacketMack

ответ

2

я был бы более склонен фразу это как:

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

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

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

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

+0

Из любопытства, что RDBMS поддерживает эти индексы? –

+0

@RaduGheorghiu. , , Postgres (https://www.postgresql.org/docs/9.6/static/textsearch-indexes.html). Другие базы данных могут иметь расширения, которые их поддерживают. –

0

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