SQL Server более эффективная подстрока - PullRequest
0 голосов
/ 07 сентября 2018

Я выполняю запрос в SQL Server, где мне нужно объединить две таблицы в одну, где поле полного имени соответствует полю частичного имени в другой после удаления апострофов. Для примера кода соединение происходит так:

from [Data1]
right join [Data2]
    on replace([Data2].[PartialName], '''','')=Substring([Data1].[FullName],1,1+LEN(replace([Data2].[PartialName], '''','')))

И это работает. Но это займет то, что было бы выполнением за 10 секунд, если бы мы просто использовали где name = name и заставило бы это занять около 20 минут. Это довольно неприемлемо с точки зрения времени выполнения, поэтому мне было интересно, есть ли у кого-нибудь более эффективные альтернативы для рассмотрения.

Между прочим, данные 1 содержат около 800 строк, а данные 2 - около 1,6 миллиона, если это уместно.

Редактировать: мне сказали, что мне нужно дать немного больше описательной информации. В основном в этом примере Data1 представляет собой таблицу из внешнего источника, которая содержит поле имени [FullName], которое содержит полные имена людей в форме «Фамилия, Имя (и)) с удаленными апострофами (для Например, имя O'Neil будет просто ONeil). Так что примером будет «ONeil, Сара Коннер»

Данные2 содержат поле имени, имеющее имена в форме «Фамилия, Имя». Отчество опускается, а апострофы целы. Так, например, «О'Нил, Сара»

Эти таблицы должны быть объединены вместе в их полях имен, следовательно, логика выше.

1 Ответ

0 голосов
/ 07 сентября 2018

DavidG прав, колонка PERSISTED - путь сюда.После того, как вы выпили немного кофе, я думаю, вам нужен вычисляемый столбец, а затем LIKE в вашем JOIN.SQL столбца PERSISTED будет выглядеть примерно так:

ALTER TABLE [Data2] ADD PartialName_na AS REPLACE(PartialName,'''','') PERSISTED;

Вы можете захотеть добавить это в индекс.Тогда ваш новый (псевдо) SQL-запрос будет выглядеть так:

SELECT ...
FROM Data2 D2
     LEFT JOIN Data1 D1 ON D1.FullName = D2.PartialName_na + '%';

Нет необходимости использовать SUBSTRING.LIKE будет поддерживать SARGability, здесь не используются символы подстановки.

Редактировать: Пара примечаний.Я использовал суффикс _na для обозначения «без апострофа»;Вы можете называть колонку как хотите.Я также изменил запрос с RIGHT JOIN на LEFT JOIN.Лично я чувствую, что LEFT JOIN гораздо легче читать, однако, если вы хотите поменять его обратно, не стесняйтесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...