Медленный запуск запроса при использовании 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 быстро выполняет соединения, тогда как в данный момент Вы запускаете этот подзапрос для каждого результата, и это происходит медленно.