Я пытаюсь подключить некоторые общие результаты поиска и хотел бы, чтобы он выполнялся так же хорошо, как я мог это сделать. Сейчас это не так страшно, но я чувствую, что могу потенциально улучшить «где» часть этого, или даже конденсировать это до одного места. Я также обеспокоен тем, как это будет происходить по мере роста базы данных с течением времени.Более эффективное заявление Союза, чем это?
Мой вопрос в том, есть ли лучший способ объединения этой информации (альтернатива объединению всех, когда мы в основном используем аналогичное подмножество таблиц многократно). Все это довольно хорошо проиндексировано, и план выполнения показывает, что большая часть расходов довольно равномерно распределена.
Select Distinct m.MLSDataId as ResultId, m.MLSNumber as ResultName, '#/mlsrecord/'+convert(varchar(20),m.MLSDataId) as ResultLink, a.StreetLine1 as Description, 'fa-home large' as Icon,
IsNull(m.UpdateDate,m.CreateDate) as ModifiedDate, 'Property' as TypeName
From MLSDatas m
Inner Join Addresses a on a.AddressId = m.AddressFK
Left Join MLSContacts mc on mc.MLSDataFK = m.MlsDataId
Left Join Contacts c on ContactId = ContactFK
Left Join People p on PersonId = PersonFK
Left Join MLSAgents ma on ma.MLSDataFK = m.MlsDataId
Left Join Agents ag on ag.AgentId = ma.AgentFK
Left Join People p2 on p2.PersonId = ag.PersonFK
Left Join PersonPhones pp on pp.PersonFK = p.PersonId
Left Join Phones ph on ph.PhoneId = pp.PhoneFK
Left Join PersonEmails pe on pe.PersonFK = p.PersonId
Left Join Emails e on e.EmailId = pe.EmailFK
Where m.MLSNumber like '%'[email protected]+'%' or StreetLine1 like '%'[email protected]+'%'
or p.FirstName like '%'[email protected]+'%' or p.LastName like '%'[email protected]+'%' or p.FirstName + ' ' + p.LastName like '%'[email protected]+'%'
or p2.FirstName like '%'[email protected]+'%' or p2.LastName like '%'[email protected]+'%' or p2.FirstName + ' ' + p2.LastName like '%'[email protected]+'%'
or ph.PhoneNumber like '%'[email protected]+'%'
or e.EmailAddress like '%'[email protected]+'%'
Union ALL
Select Distinct l.ListingId as ResultId, l.DisplayTitle as ResultName, '#/listing/'+convert(varchar(20),l.ListingId) as ResultLink, l.DisplayTitle as Description, 'fa-globe large' as Icon,
IsNull(m.UpdateDate,m.CreateDate) as ModifiedDate, 'Listing' as TypeName
From Listings l
Inner Join MLSDatas m on m.MLSDataId = l.MLSDataFK
Inner Join Addresses a on a.AddressId = m.AddressFK
Left Join MLSContacts mc on mc.MLSDataFK = MlsDataId
Left Join Contacts c on ContactId = ContactFK
Left Join People p on PersonId = PersonFK
Left Join PersonPhones pp on pp.PersonFK = p.PersonId
Left Join Phones ph on ph.PhoneId = pp.PhoneFK
Left Join PersonEmails pe on pe.PersonFK = p.PersonId
Left Join Emails e on e.EmailId = pe.EmailFK
Where m.MLSNumber like '%'[email protected]+'%' or StreetLine1 like '%'[email protected]+'%'
or p.FirstName like '%'[email protected]+'%' or p.LastName like '%'[email protected]+'%' or p.FirstName + ' ' + p.LastName like '%'[email protected]+'%'
or ph.PhoneNumber like '%'[email protected]+'%'
or e.EmailAddress like '%'[email protected]+'%'
Union All
Select Distinct c.ContactId as ResultId, p.FirstName + ' ' + p.LastName as ResultName, '#/contact/'+convert(varchar(20),c.ContactId) as ResultLink, p.FirstName + ' ' + p.LastName as Description, 'fa-book large' as Icon,
IsNull(p.UpdateDate,p.CreateDate) as ModifiedDate, 'Contact' as TypeName
From MLSDatas m
Inner Join Addresses a on a.AddressId = m.AddressFK
Left Join MLSContacts mc on mc.MLSDataFK = m.MlsDataId
Left Join Contacts c on ContactId = ContactFK
Left Join People p on PersonId = PersonFK
Left Join PersonPhones pp on pp.PersonFK = p.PersonId
Left Join Phones ph on ph.PhoneId = pp.PhoneFK
Left Join PersonEmails pe on pe.PersonFK = p.PersonId
Left Join Emails e on e.EmailId = pe.EmailFK
Where m.MLSNumber like '%'[email protected]+'%' or StreetLine1 like '%'[email protected]+'%'
or p.FirstName like '%'[email protected]+'%' or p.LastName like '%'[email protected]+'%' or p.FirstName + ' ' + p.LastName like '%'[email protected]+'%'
or ph.PhoneNumber like '%'[email protected]+'%'
or e.EmailAddress like '%'[email protected]+'%'
Union All
Select Distinct ag.AgentId as ResultId, p.FirstName + ' ' + p.LastName as ResultName, '#/agent/'+convert(varchar(20),ag.AgentId) as ResultLink, p.FirstName + ' ' + p.LastName as Description, 'fa-suitcase large' as Icon,
IsNull(p.UpdateDate,p.CreateDate) as ModifiedDate, 'Agent' as TypeName
From MLSDatas m
Inner Join Addresses a on a.AddressId = m.AddressFK
Left Join MLSAgents ma on ma.MLSDataFK = m.MlsDataId
Left Join Agents ag on ag.AgentId = ma.AgentFK
Left Join People p on PersonId = ag.PersonFK
Left Join PersonPhones pp on pp.PersonFK = p.PersonId
Left Join Phones ph on ph.PhoneId = pp.PhoneFK
Left Join PersonEmails pe on pe.PersonFK = p.PersonId
Left Join Emails e on e.EmailId = pe.EmailFK
Where m.MLSNumber like '%'[email protected]+'%' or StreetLine1 like '%'[email protected]+'%'
or p.FirstName like '%'[email protected]+'%' or p.LastName like '%'[email protected]+'%' or p.FirstName + ' ' + p.LastName like '%'[email protected]+'%'
or ph.PhoneNumber like '%'[email protected]+'%'
or e.EmailAddress like '%'[email protected]+'%'
Заранее благодарен!
Возможно, это не ваша ошибка, но вы должны рассмотреть возможность денормализации своей базы данных. Тогда наверняка вам будет проще запросить его. –
Существует много отношений для многих и многих, и мы также используем его с Entity Framework. Адреса/телефоны/электронная почта/люди/и т. Д. Сохраняются один раз. Соглашение об именах по большей части также является реляционным и облегчает переход следующего парня, чтобы определить, где находится внешний ключ ... Денормализация становится настоящей головной болью, когда человек (имя и фамилия и т. Д.) В этом база данных может применяться к пользователю, сотруднику, агенту, контакту или другому. То же самое лицо может быть более одного или двух из этих объектов одновременно. –
Я вижу вашу точку зрения, но я должен не согласиться. Вы код выглядит очень грязным и громоздким, и в основном это связано с его дизайном. Даже если это больно денормализовать, это будет огромной выгодой в будущем. Я также добавил некоторые отзывы в свой ответ (к вашим соображениям, почему бы не денормализовать вашу базу данных). Надеюсь, поможет. –