我有一个查询,我试图搜索一个词,可以是人的名字,他/她母亲的名字,或他/她的身份证号码之一。
下面是我的疑问:
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'
我尝试了很多不同的方法,多连接,子查询在哪里,或交叉/外部应用...等,但没有运气。
我对要搜索的每个字段都有适当的索引。
每个表的记录数是400,000+条记录,我得到的时间是2秒。
如果我减少OR的数量(例如,只保留名字和母亲的名字),那么它完全可以(117毫秒)。
下面是我的执行计划链接:Execution Plan
如有任何提示,我们将不胜感激。
- 更新日期:**
下面是我使用OR的执行计划链接,时间从2秒增加到700多毫秒:
Execution Plan using UNION
- 更新2:**
我对数据库模式做了一个小的更改,并使用了UNION ALL
,现在的时间在60 - 90毫秒之间
EP using UNION ALL
1条答案
按热度按时间olmpazwi1#
@dale-k在评论中的回答正好解决了我的性能问题。
解决多个
OR
性能不佳的方法是使用UNION ALL
。我的执行时间从700+ ms下降到60- 90 ms。