SQL Server 使用多个OR条件优化查询

68de4m5k  于 2022-12-22  发布在  其他
关注(0)|答案(1)|浏览(562)

我有一个查询,我试图搜索一个词,可以是人的名字,他/她母亲的名字,或他/她的身份证号码之一。
下面是我的疑问:

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

olmpazwi

olmpazwi1#

@dale-k在评论中的回答正好解决了我的性能问题。
解决多个OR性能不佳的方法是使用UNION ALL。我的执行时间从700+ ms下降到60- 90 ms。

相关问题