-1

Я пытаюсь подключить некоторые общие результаты поиска и хотел бы, чтобы он выполнялся так же хорошо, как я мог это сделать. Сейчас это не так страшно, но я чувствую, что могу потенциально улучшить «где» часть этого, или даже конденсировать это до одного места. Я также обеспокоен тем, как это будет происходить по мере роста базы данных с течением времени.Более эффективное заявление Союза, чем это?

Мой вопрос в том, есть ли лучший способ объединения этой информации (альтернатива объединению всех, когда мы в основном используем аналогичное подмножество таблиц многократно). Все это довольно хорошо проиндексировано, и план выполнения показывает, что большая часть расходов довольно равномерно распределена.

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]+'%' 

Заранее благодарен!

+0

Возможно, это не ваша ошибка, но вы должны рассмотреть возможность денормализации своей базы данных. Тогда наверняка вам будет проще запросить его. –

+0

Существует много отношений для многих и многих, и мы также используем его с Entity Framework. Адреса/телефоны/электронная почта/люди/и т. Д. Сохраняются один раз. Соглашение об именах по большей части также является реляционным и облегчает переход следующего парня, чтобы определить, где находится внешний ключ ... Денормализация становится настоящей головной болью, когда человек (имя и фамилия и т. Д.) В этом база данных может применяться к пользователю, сотруднику, агенту, контакту или другому. То же самое лицо может быть более одного или двух из этих объектов одновременно. –

+0

Я вижу вашу точку зрения, но я должен не согласиться. Вы код выглядит очень грязным и громоздким, и в основном это связано с его дизайном. Даже если это больно денормализовать, это будет огромной выгодой в будущем. Я также добавил некоторые отзывы в свой ответ (к вашим соображениям, почему бы не денормализовать вашу базу данных). Надеюсь, поможет. –

ответ

-1

Я хотел бы предложить использовать CTE, б ut, как я упоминал выше, вы должны рассмотреть вопрос о денормализации дизайна вашей базы данных. Даже если «человек (имя и фамилия и т. Д.) В этой базе данных могут применяться к пользователю, сотруднику, агенту, контакту или другому». Одно из предложений этой проблемы - использовать тип (например, Пользователь, Сотрудник, Агент, Контакт или другое). О, «облегчает для следующего парня, входящего, чтобы определить, куда указывает иностранный ключ», я не знаю, может быть. Однако это выглядит очень грязно. Ваш выбор в конце.

Вот что я предлагаю, если вы в конечном итоге не денормализации:

with cte_noWhere as 
(
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, 
m.MLSNumber as MLSNumber, StreetLine1, p.FirstName as FirstName, p.LastName as LastName, ph.PhoneNumber, 
e.EmailAddress 
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 p2.FirstName like '%'[email protected]+'%' or p2.LastName like '%'[email protected]+'%' or p2.FirstName + ' ' + p2.LastName 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, 
m.MLSNumber as MLSNumber, StreetLine1, p.FirstName as FirstName, p.LastName as LastName, ph.PhoneNumber, 
e.EmailAddress 
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 

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, 
m.MLSNumber as MLSNumber, StreetLine1, p.FirstName as FirstName, p.LastName as LastName, ph.PhoneNumber, 
e.EmailAddress 
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 

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, 
m.MLSNumber as MLSNumber, StreetLine1, p.FirstName as FirstName, p.LastName as LastName, ph.PhoneNumber, 
e.EmailAddress 
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 
) 
select * 
from cte_noWhere w 
Where w.MLSNumber like '%'[email protected]+'%' or w.StreetLine1 like '%'[email protected]+'%' 
    or w.FirstName like '%'[email protected]+'%' 
     or w.LastName like '%'[email protected]+'%' or w.FirstName + ' ' + w.LastName like '%'[email protected]+'%' 
    or w.PhoneNumber like '%'[email protected]+'%' 
    or w.EmailAddress like '%'[email protected]+'%' 

Я использую большую часть своего кода в КТР и вытаскивать общее, где положение. Это может работать быстрее и эффективнее, но я не уверен. Если это так, то это, вероятно, потому, что теперь вы делаете одно там, где предложение вместо 4.

+0

Я не рассматривал CTE. Я дал ему ход, и он практически идентичен во время загрузки (> 1 секунда), хотя и чище (поэтому я возьму его). Что касается поля типа, это все равно позволит использовать несколько строк с тем же именем, чего я пытался избежать. Когда у человека есть несколько телефонов и электронных писем, они не привязываются к каждой из строк с уникальными типами, которые вы предлагаете. Кроме того, этот шаблон хорошо работает в приложении C#, поскольку пользователь наследует тип «Person», а также объекты типа другого лица. Это кажется слишком сложным, но оно работает по многим причинам. –

+0

Также ... У меня кончились линии ... Спасибо, что нашли время ответить. Я по-прежнему взвешиваю варианты с дизайном базы данных, но у нас есть клиент, которому было обещано это приложение примерно на 6 месяцев раньше, когда я его процитировал ... так что я нахожусь в какой-то момент. –

+0

@BradL Я полностью понимаю. Был там, сделал это. Просто подумал, что вы должны знать об альтернативах и о том, почему другой способ может работать лучше. Если бы мой ответ был полезен, то повысьте или выберите ответ, щелкнув галочку. :) Удачи. –

-1

Лот проблем
Вы ломаете налево на котором

Вы могли бы принести на это в #temp поэтому она вычисляется только один раз
Но так как вы не всегда маркировать таблицу я должен был сделать некоторые догадываясь
Вы затем присоединиться к #temp
И объявить PK на #Temp, как это должно помочь оптимизатор запросов

insert into #temp (ID) 
select m.MLSDataId 
    from MLSDatas m -- 
    Join People p on PersonId = PersonFK -- 
    Join PersonPhones pp on pp.PersonFK = p.PersonId 
    Join Phones ph on ph.PhoneId = pp.PhoneFK -- 
    Join PersonEmails pe on pe.PersonFK = p.PersonId 
    Join Emails e on e.EmailId = pe.EmailFK -- 
Where m.MLSNumber 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]+'%' 


... 
From Listings l 
join #temp as m 
    on m.MLSDataId = l.MLSDataFK 

    on #tempID = 
+0

Дайте понять, что нужно объяснить – Paparazzi

+0

Это не я, просто говорю. –

+0

@PaulKar. И я не голосовал за вас. Хотя я не думаю, что вы отвечаете за эффективность адресов. – Paparazzi

Смежные вопросы