Rahul_Pandit Ответов: 1

Медленный запуск запроса при использовании case в SQL server


Здравствуйте друзья,

Я использую ниже запрос-

select case WHEN (
						
	    select count(1)from( select count(1) as cnt
								from WCF_INDENT wi LEFT OUTER JOIN INDENT_INVOICE_DETAILS iid  ON  wi.WCF_NO=iid.WCF_NO and wi.ITEM_CODE=iid.ITEM_CODE
								--where wi.WCF_NO='WC/63912'
								group by wi.ITEM_CODE,wi.QTY having SUM(ISNULL(iid.QTY,0))<wi.QTY
								UNION
								select count(1) as cnt
								from VOR_ORDER_DETAILS vod LEFT OUTER JOIN INDENT_INVOICE_DETAILS iid ON vod.ITEM_CODE=iid.ITEM_CODE and vod.VOR_NO=iid.WCF_NO
								where vod.VOR_NO='WC/63912'
								group by iid.ITEM_CODE,vod.QTY
								having SUM(ISNULL(iid.QTY,0))<vod.QTY 
						     )bb
						)>0  
				
	then 'Partial Dispatch'  else 'Full Dispatch' end


но работает непрерывно, даже запрос в течение, когда предложение проходит в 1 сек.
что я упускаю?

Есть ли способ, потому что я буду использовать этот запрос для обновления таблицы на основе WCF_NO. Поэтому я не могу поместить внутренний запрос во временную таблицу или любой другой объект.

Ниже приведен запрос обновления



update A set A.Dispatch_Status=
                              (select distinct case WHEN EXISTS ( select count(1) as cnt
                                                                  from WCF_INDENT wi
                                                                  LEFT OUTER JOIN INDENT_INVOICE_DETAILS iid  ON  wi.WCF_NO=iid.WCF_NO and wi.ITEM_CODE=iid.ITEM_CODE
                                                                  where wi.WCF_NO=A.WCF_NO --83184
                                                                  group by wi.ITEM_CODE,wi.QTY having SUM(ISNULL(iid.QTY,0))<wi.QTY
                                                                  UNION
                                                                  select count(1)
                                                                  from VOR_ORDER_DETAILS vod
                                                                  LEFT OUTER JOIN INDENT_INVOICE_DETAILS iid ON vod.ITEM_CODE=iid.ITEM_CODE and vod.VOR_NO=iid.WCF_NO
                                                                  where vod.VOR_NO=A.WCF_NO--21051
                                                                  group by iid.ITEM_CODE,vod.QTY
                                                                  having SUM(ISNULL(iid.QTY,0))<vod.QTY
                                                              )
                                      then 'Partial Dispatch'
                                      else 'Full Dispatch' end as AA
                                      from INDENT_INVOICE_DETAILS
                              )
      FRom #T3 A WHERE FSR_REQD='1'

В этом случае я обновляю #T3 на основе WCF_No, поэтому я не могу использовать табличную переменную в этом случае.

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

Я пытался--

select case WHEN EXISTS (	select count(1) as cnt
										from WCF_INDENT wi LEFT OUTER JOIN INDENT_INVOICE_DETAILS iid  ON  wi.WCF_NO=iid.WCF_NO and wi.ITEM_CODE=iid.ITEM_CODE
										--where wi.WCF_NO='WC/63912' --83184
										group by wi.ITEM_CODE,wi.QTY having SUM(ISNULL(iid.QTY,0))<wi.QTY
										UNION
										select count(1)
										from VOR_ORDER_DETAILS vod LEFT OUTER JOIN INDENT_INVOICE_DETAILS iid ON vod.ITEM_CODE=iid.ITEM_CODE and vod.VOR_NO=iid.WCF_NO
										where vod.VOR_NO='WC/63912'--21051
										group by iid.ITEM_CODE,vod.QTY
										having SUM(ISNULL(iid.QTY,0))<vod.QTY
									)  
				then 'y'  else 'n' end as AA

F-ES Sitecore

Я не эксперт по SQL, поэтому не могу дать конкретики, но вам нужно попытаться хотя бы избавиться от подзапросов. Подумайте об одном выборе, который вы можете сделать, чтобы получить все необходимые данные в этом подзапросе объединения за один удар, и сделайте это CTE или табличной переменной, а затем вместо того, чтобы делать EXISTS, вы можете сделать соединение в этой таблице. Таким образом, вы генерируете данные один раз, и SQL быстро выполняет соединения, тогда как в данный момент Вы запускаете этот подзапрос для каждого результата, и это происходит медленно.

1 Ответов

Рейтинг:
1

Ashwin. Shetty

Будет трудно судить без информации о типе данных для полей и без знания размера данных в каждой таблице, если temp является проблемой и индивидуальное выполнение запроса занимает секунду, вы можете подумать о табличной переменной. Вставить данные в табличную переменную и выполнить дело на вершине. Приведенная ниже ссылка должна дать некоторое представление о табличной переменной

Табличные переменные в T-SQL[^]


Rahul_Pandit

Спасибо за ответ..У меня есть улучшенный вопрос с причиной, по которой я не могу использовать табличную переменную.