Привет, у меня есть запрос ниже в SP
@CrmContactId — это параметр SP.
Select distinct A.PolicyBusinessId, A.PolicyDetailId
from TPolicyBusiness A
inner join TPolicyOwner B on a.PolicyDetailId=b.PolicyDetailId
Left Join TAdditionalOwner C on c.PolicyBusinessId=A.PolicyBusinessId
where (b.CRMContactId = @CRMContactId)
мы внесли новое изменение и ввели условие ИЛИ
Select distinct A.PolicyBusinessId, A.PolicyDetailId
from TPolicyBusiness A
inner join TPolicyOwner B on a.PolicyDetailId=b.PolicyDetailId
Left Join TAdditionalOwner C on c.PolicyBusinessId=A.PolicyBusinessId
where (b.CRMContactId = @CRMContactId OR C.CRMContactId = @CRMContactId)
План выполнения:
Приложение : План выполнения
но это изменение вызвало огромную проблему с производительностью на реальном сервере. TPolicyBusiness и TPolicyOwner — тяжелые таблицы с миллионами записей. Таблица TAdditionalOwner — это легкая таблица с небольшим количеством записей.
Чтобы решить эту проблему, вместо условия OR было Union all.
Select distinct A.PolicyBusinessId, A.PolicyDetailId
From
(
Select A.PolicyBusinessId, A.PolicyDetailId
from TPolicyBusiness A
inner join TPolicyOwner B on a.PolicyDetailId=b.PolicyDetailId
where b.CRMContactId = @CRMContactId
union all
Select A.PolicyBusinessId, A.PolicyDetailId
from TPolicyBusiness A
Join TAdditionalOwner C on c.PolicyBusinessId=A.PolicyBusinessId
where C.CRMContactId = @CRMContactId
) as A
План выполнения:
Приложение План выполнения
Может кто-нибудь объяснить, почему введение OR вызвало проблему и почему использование Union лучше, чем OR в этом случае?