Взгляните на мой ответ об использовании LIKE
оператора здесь
Это может быть весьма эффективным, если вы используете некоторые трюки
Вы можете получить большую скорость, есливы играете с сопоставлением, попробуйте это:
SELECT DISTINCT TOP 10 p.[Id], n.[LastName], n.[FirstName]
FROM [dbo].[people] p
INNER JOIN [dbo].[people_NAME] n on n.[Id] = p.[Id]
WHERE EXISTS (
SELECT 'x' x
FROM [dbo].[people_NAME] n2
WHERE n2.[Id] != p.[id]
AND
lower(n2.[FirstName]) collate latin1_general_bin
LIKE
'%' + lower(n1.[FirstName]) + '%' collate latin1_general_bin
)
Как вы можете видеть, мы используем двоичное сравнение вместо сравнения строк, и это гораздо более производительно.
Обратите внимание, вы работаете симена людей, поэтому у вас могут возникнуть проблемы со специальными символами Юникода или странными акцентами ... и т.д ... и т. д.
Обычно предложение EXISTS
лучше, чем INNER JOIN
, но вы также используете DISTINCT
это GROUP BY
во всех столбцах .. так почему бы не использовать это?
Вы можете переключиться на INNER JOIN
и использовать GROUP BY
вместо DISTINCT
, поэтому тестирование COUNT(*)>1
будет(очень мало) более производительно, чем тестирование WHERE n2.[Id] != p.[id]
, особенно если ваше предложение TOP извлекает много строк.
Попробуйте это:
SELECT TOP 10 p.[Id], n.[LastName], n.[FirstName]
FROM [dbo].[people] p
INNER JOIN [dbo].[people_NAME] n on n.[Id] = p.[Id]
INNER JOIN [dbo].[people_NAME] n2 on
lower(n2.[FirstName]) collate latin1_general_bin
LIKE
'%' + lower(n1.[FirstName]) + '%' collate latin1_general_bin
GROUP BY n1.[Id], n1.[FirstName]
HAVING COUNT(*)>1
Здесь мы сопоставляем и само имя, поэтомумы найдем хотя бы одно совпадение для каждого имени. Но нам нужны только имена, совпадающие с другими именами, поэтому мы будем хранить только строки с количеством совпадений больше единицы (count (*) = 1 означает, что имя совпадает только с самим собой).
EDIT: Iвсе тестировали с использованием таблицы случайных имен с 100000 строк и обнаружили, что в этом сценарии обычное использование оператора LIKE примерно в три раза хуже, чем двоичное сравнение.