ahmed_sa Ответов: 2

Когда выполняется запрос только для одной части, это занимает слишком много времени только для одной части, почему ?


Я работаю над запросом sql server 2012 и сталкиваюсь с проблемой : при выполнении запроса возвращаю 10 строк только для одной части

это займет 50 секунд я пытаюсь запустить его в другое время может быть ПК имеет большую нагрузку

но это займет столько же времени 50 секунд, чтобы вернуть 10 строк только для одной части .

У меня может быть 10000 деталей и записей может быть 15 миллионов так что мне нужно повысить производительность чтобы быть лучшим

Итак, что я делаю, чтобы запрос выполнялся за короткое время

это мой вопрос

Вставьте План - Brent Ozar Unlimited®[^]

EDIT: запрос OPs скопирован из ссылки выше
Select  distinct top 100 [Is Match]= case when isnull(NAVO.Name ,'') = DUFP.Value or (isnull(NAVO.Name ,'') = N'N/A' And DUFP.Value =N'-') then cast(1 as bit) else cast(0 as bit) end 
,DDD.ColumnName [Flat Feature],DUFP.FeatureName [Sourcing Feature],NAVO.Name [Flat Value],DUFP.Value [Sourcing value]
,C.CompanyName,p.PartNumber,dd.DataDefinition [PL]
, isnull(AVOS.Name,'') ApprovalStatus 
,isnull(rl.local_url,'') [local url],isnull( l.local_url,'') [DataSheet] ,isnull(NAVOUrl.Name ,'') [Data Sheet Type]
,isnull(NV.DKValue,'') [DK Value],FM.StatusId,FM.SplitFlag,FM.DkFeatureId,FM.separator,FM.separatororder
--test
,NPP.PartID , DUFP.ZpartID,starformat,Endformat into #finalTable 

from #getDeliveryConfiguration FM with(nolock)  
join [Excel_DK].dbo.Excel_DK DUFP with(nolock) on DUFP.FeatureName =FM.DK_Feature 
join [Z2DataCore].[Parts].[Nop_Part] p with(nolock) on DUFP.ZpartID =p.PartID
join [Z2DataCompanyManagement].[CompanyManagers].[Company] C with(nolock) on p.CompanyID = C.CompanyID

left join [Z2DataCore].[parts].[Nop_PartParamtric] NPP with(nolock) on NPP.PartID = DUFP.ZpartID 
left join [Z2DataCore].[dbo].[Core_DataDefinitionDetails] DDD with(nolock) on FM.Z_FeatureID=DDD.ColumnNumber

 join [Z2DataCore].[Parts].[Nop_PartParamtricAttribute] NPPA with(nolock) on NPP.[PartParamtricID] =NPPA. [PartParamtricID] and DDD.ColumnNumber= NPPA.[Key]
left join [Z2DataCore].[dbo].[Nop_AcceptedValuesOption] NAVO with(nolock) on NPPA.Value =NAVO. AcceptedValuesOptionID 
left join [Z2DataCore].[dbo].Nop_AcceptedValuesOption AVOS with(nolock) on AVOs.AcceptedValuesOptionID= NPPA.ApprovalID/*[ApprovalStatus]*/ and AVOS.AcceptedValuesID=2941
LEFT JOIN Z2URLSystem.zsrc.Local_URL l with(nolock) ON l.rec_id = NPPA.SourceURLID 

left JOIN [Z2DataCore].Parts.Nop_PartsFamilyAttribute fa with(nolock) ON fa.PartFamilyID = p.PartsFamilyID AND fa.[Key] = 20281007


left JOIN [Z2DataCore].dbo.Core_DataDefinition dd with(nolock) ON dd.ZproductCategoryID = fa.Value
LEFT JOIN [Z2DataCore].Parts.Nop_PartsFamilyAttribute Nfa with(nolock) ON Nfa.PartFamilyID = p.PartsFamilyID AND Nfa.[Key]=1400040081 

LEFT JOIN Z2URLSystem.zsrc.Revision r with(nolock) ON r.rec_id = Nfa.Value
LEFT JOIN Z2URLSystem.zsrc.Local_URL rl with(nolock) ON rl.rec_id = r.local_id
Left join [Z2DataCore].[dbo].[Nop_AcceptedValuesOption] NAVOUrl with(nolock) on NPPA.SourceURLType =NAVOUrl. AcceptedValuesOptionID

 left join [Z2DataCore].dbo.Core_DataDefinitiondeTails CDD with(nolock) on CDD.ColumnNumber=NPPA.[Key] and CDD.FeatureType in(2044,2043)
left outer join [Z2DataCore].dbo.Core_DataDefinition CD with(nolock) on CD.ID=CDD.DataDefinitionID
left join [Z2DataCore].[dbo].[NormalizationValue] NV with(nolock) on NAVO.AcceptedValuesOptionID=NV.AcceptedValuesOptionId and NV.ProductID=CD.ZNumber
   where C.CompanyName=@companyName And DUFP.PartNumber=@partNumber

order by DUFP.FeatureName


Что я уже пробовал:

CREATE NONCLUSTERED INDEX index1 
ON [dbo].[Excel_DK] ([PartNumber]) INCLUDE ([ZPartId],[FeatureName],[Value])

CHill60

Я думаю, что вы серьезно зашли слишком далеко с нормализацией, если вам нужно объединить 19 таблиц, чтобы получить свои данные!
Я не готов пытаться распутать все это без некоторой помощи с вашей стороны - например, примеры данных для каждой из таблиц и некоторые ожидаемые результаты

ahmed_sa

Итак, что я делаю, чтобы повысить производительность этого длинного запроса

CHill60

Я этого не заметил - Если вы используете ссылку "ответить" на сообщение, то участник сразу же получает уведомление.

Richard MacCutchan

Восемнадцать присоединений! Неудивительно, что это занимает много времени. Попробуйте сделать это вручную, когда все файлы находятся в разных ящиках картотечного шкафа.

2 Ответов

Рейтинг:
7

CHill60

Упростите свою схему базы данных, которой вы до сих пор не поделились с нами (я не собираюсь делать никаких явных предложений, пока вы не предоставите таблицы с некоторыми образцами данных)

Читайте о том, как настроить свои запросы - вы уже нашли сайт Брента, но здесь тоже есть статьи, например
Учебник по настройке SQL - понимание плана выполнения базы данных (1)[^]

Подумайте о том, чтобы разбить запрос на несколько запросов и использовать больше временных таблиц - добавьте весь "пух" (такие вещи, как название компании, URL-адреса) в самом конце, когда вы выполнили основную часть поисковой работы.


Рейтинг:
2

#realJSOP

19 таблиц (18 соединений), с предложением where и сортировкой. Вот почему это занимает 50 секунд.


ahmed_sa

так что же я делаю, чтобы сделать это быстро

#realJSOP

Вы можете изучить план выполнения, чтобы найти узкие места, и ожидать, что вам придется создать несколько ников.