Оптимизация запроса с несколькими условиями ИЛИ

#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 мс

EP, использующий ОБЪЕДИНЕНИЕ ALL

Комментарии:

1. Часто UNION ALL решает OR проблемы с производительностью.

2. @DaleK Пожалуйста, посмотрите мой обновленный ответ, я пытался использовать ИЛИ, я делаю это правильно?

3. @DaleK извините, я пробовал использовать union all и union, и оба дали похожие результаты

4. Ни один из этих планов не имеет a UNION ALL (что сильно отличается от UNION ). Каково время использования выполнения UNION ALL ? И, возможно, покажите свой UNION ALL , чтобы мы могли видеть, правильно ли вы это делаете.

5. @DaleK хорошо, теперь я обновил свой ответ ОБЪЕДИНЕНИЕМ all, есть ли еще возможности для повышения производительности или это лучшее, что я могу сделать