#sql #sql-server
#sql #sql-сервер
Вопрос:
У меня есть запрос, который я пытаюсь выполнить с помощью одного слова, которое может быть именем человека, именем его / ее матери или одним из его / ее идентификаторов.
Вот мой запрос:
select pf.id,
(i.FirstName ' ' i.SecondName ' ' i.ThirdName ' ' i.FourthName) as Name
,(i.MotherFirstName ' ' i.MotherSecondName ' ' i.MotherThirdName) as MotherName
,(select Alias From FormStatuses where id = (select top(1) StatusId from BeneficiaryStatus where BeneficiaryId = pf.Id order by CreatedDate desc)) ALias
,(select NameEn From FormStatuses where id = (select top(1) StatusId from BeneficiaryStatus where BeneficiaryId = pf.Id order by CreatedDate desc)) Status
,(Case When exists (select 1 from CaseManagementForms where PeopleId = pf.Id) then 1 Else 0 End) HasCase
from PeopleForms pf inner join FormPersonalInfos i on pf.Id = i.PeopleFormId
Left outer join CivilStatusIds c on pf.CivilStatusId = c.Id
left outer join NationalCards n on pf.NationalCardId = n.Id
left outer join PdsCards p on pf.PdsCardId = p.Id
where i.FullName like 'Azad100087%' or i.MotherFullName like 'Azad100087%'
or c.Number = 'Azad100087'
or n.Number = 'Azad100087'
or p.Number = 'Azad100087'
or pf.Code = 'Azad100087'
or pf.OldCode = 'Azad100087'
Я перепробовал так много разных способов, мультисоединения, вложенные запросы в where или перекрестное / внешнее применение… и т.д., но безуспешно.
У меня есть соответствующие индексы для каждого из тех полей, которые я хочу найти.
Количество записей в каждой таблице составляет более 400 000 записей, а время, которое я получаю, составляет 2 секунды.
Если я уменьшу количество OR (например, останутся только имя и имя матери), тогда все будет в порядке (117 мс).
Вот ссылка на мой план выполнения: План выполнения
Любые советы приветствуются.
Обновить:
Вот ссылка на мой план выполнения с использованием ИЛИ, время увеличилось с 2 секунд до 700 мс:
План выполнения с использованием ОБЪЕДИНЕНИЯ
Обновление 2:
Я вношу небольшие изменения в схему базы данных и использую UNION ALL
, сейчас время составляет 60-90 мс
Комментарии:
1. Часто
UNION ALL
решаетOR
проблемы с производительностью.2. @DaleK Пожалуйста, посмотрите мой обновленный ответ, я пытался использовать ИЛИ, я делаю это правильно?
3. @DaleK извините, я пробовал использовать union all и union, и оба дали похожие результаты
4. Ни один из этих планов не имеет a
UNION ALL
(что сильно отличается отUNION
). Каково время использования выполненияUNION ALL
? И, возможно, покажите свойUNION ALL
, чтобы мы могли видеть, правильно ли вы это делаете.5. @DaleK хорошо, теперь я обновил свой ответ ОБЪЕДИНЕНИЕМ all, есть ли еще возможности для повышения производительности или это лучшее, что я могу сделать