Sql 优化嵌套查询和连接

Sql 优化嵌套查询和连接,sql,oracle,optimization,Sql,Oracle,Optimization,我知道有一个查询是在单个客户帐户上运行的。然而,当我打开它来查询所有帐户时,它变得非常慢。我还没有找到一篇文章可以让我对脚本进行任何改进 我将在下面发布脚本。我没有具体的问题,但我想知道是否有任何优化改进可以提高这个查询的速度 select count ( distinct abc.OrderNo) as Total_Orders, sum (case when abc.ItemDescription_Detail = 'Hi-Res Digital Image'then 1 els

我知道有一个查询是在单个客户帐户上运行的。然而,当我打开它来查询所有帐户时,它变得非常慢。我还没有找到一篇文章可以让我对脚本进行任何改进

我将在下面发布脚本。我没有具体的问题,但我想知道是否有任何优化改进可以提高这个查询的速度

select 

  count ( distinct abc.OrderNo) as Total_Orders,
  sum (case when abc.ItemDescription_Detail = 'Hi-Res Digital Image'then 1 else 0 end) as Total_DIDs,
  count (distinct  (case when abc.ItemDescription_Detail = 'Hi-Res Digital Image'  then abc.OrderNo end ))  as Total_DID_Orders,
  sum (case when abc.ItemDescription_Detail = 'CD High and Low Resolution'then 1 else 0 end) as Total_CD_Looks,
  count (distinct  (case when abc.ItemDescription_Detail = 'CD High and Low Resolution'  then abc.OrderNo end ))  as Total_CD_Orders, 

  sum (case when abc.ItemDescription_Detail = 'Hi-Res Digital Image' and abc.NORMALPKGFLAG = '1' then 1 else 0 end) as Total_PKG_DIDs,
  count (distinct  (case when abc.ItemDescription_Detail = 'Hi-Res Digital Image' and abc.NORMALPKGFLAG = '1' then abc.OrderNo end ))  as Total_PKG_DID_Orders,
  sum (case when abc.ItemDescription_Detail = 'CD High and Low Resolution' and abc.NORMALPKGFLAG = '1' then 1 else 0 end) as Total_PKG_CD_Looks,
  count (distinct  (case when abc.ItemDescription_Detail = 'CD High and Low Resolution' and abc.NORMALPKGFLAG = '1' then abc.OrderNo end ))  as Total_PKG_CD_Orders, 

  sum (case when abc.ItemDescription_Detail = 'Hi-Res Digital Image' and abc.SPECIALFLAG = '1' then 1 else 0 end) as Total_SPL_OFFER_DIDs,
  count (distinct  (case when abc.ItemDescription_Detail = 'Hi-Res Digital Image' and abc.SPECIALFLAG = '1' then abc.OrderNo end ))  as Total_SPL_OFFER_DID_Orders,
  sum (case when abc.ItemDescription_Detail = 'CD High and Low Resolution' and abc.SPECIALFLAG = '1' then 1 else 0 end) as Total_SPL_OFFER_CD_Looks,
  count (distinct  (case when abc.ItemDescription_Detail = 'CD High and Low Resolution' and abc.SPECIALFLAG = '1' then abc.OrderNo end ))  as Total_SPL_OFFER_CD_Orders, 

  sum (case when abc.ItemDescription_Detail = 'Hi-Res Digital Image' and abc.CREATEPKG = '1' then 1 else 0 end) as Total_CYOP_DIDs,
  count (distinct  (case when abc.ItemDescription_Detail = 'Hi-Res Digital Image' and abc.CREATEPKG = '1' then abc.OrderNo end ))  as Total_CYOP_DID_Orders,
  sum (case when abc.ItemDescription_Detail = 'CD High and Low Resolution' and abc.CREATEPKG = '1' then 1 else 0 end) as Total_CYOP_CD_Looks,
  count (distinct  (case when abc.ItemDescription_Detail = 'CD High and Low Resolution' and abc.CREATEPKG = '1' then abc.OrderNo end ))  as Total_CYOP_CD_Orders, 

  sum (case when abc.ItemDescription_Detail = 'Hi-Res Digital Image' and abc.CREATEPKG <> '1' and abc.SPECIALFLAG <> '1' and abc.NORMALPKGFLAG <> '1' then 1 else 0 end) as Total_Not_PKG_DIDs,
  count (distinct  (case when abc.ItemDescription_Detail = 'Hi-Res Digital Image' and abc.CREATEPKG <> '1' and abc.SPECIALFLAG <> '1' and abc.NORMALPKGFLAG <> '1' then abc.OrderNo end ))  as Total_Not_PKG_DID_Orders,
  sum (case when abc.ItemDescription_Detail = 'CD High and Low Resolution' and abc.CREATEPKG <> '1' and abc.SPECIALFLAG <> '1' and abc.NORMALPKGFLAG <> '1' then 1 else 0 end) as Total_Not_PKG_CD_Looks,
  count (distinct  (case when abc.ItemDescription_Detail = 'CD High and Low Resolution' and abc.CREATEPKG <> '1' and abc.SPECIALFLAG <> '1' and abc.NORMALPKGFLAG <> '1' then abc.OrderNo end ))  as Total_Not_PKG_CD_Orders 

from (select
        distinct
        oh.Event_Ref_ID,
        --oc.CHANNEL_NAME,
        oh.Order_Header_OID OrderHeader,
        oh.Order_No OrderNo,
        oh.Order_Date OrderDate,
        ol.Order_Line_OID OrderLine,
        ol.Unit_Price UnitPrice,
        ol.Ordered_Quantity Qty,
        --ol.List_Price ListPrice,
        --ol.Line_Total LineTotal,
        --ol.Est_Pretax_Amount EstPreTaxAmount,
        ------old.Order_Line_Detail_OID OrderLineDetail,
        ------old.Sheet_Size SheetSize,
        i.SKU_Category,
        i.Description ItemDescription,
        bi.SKU_Category SKUCategory_Detail,
        bi.Description ItemDescription_Detail,
        --ole.LookID,
        --bole.LookID,
        case when i.sku_category = 'PACKAGE' and i.Description  like '%Special%' then 1 else 0 end as SpecialFlag,
        case when i.sku_category = 'PACKAGE' and i.Description  like '%Create%' then 1 else 0 end as CreatePKG,
        case when i.sku_category = 'PACKAGE' and i.Description  not like '%Special%' and i.Description  not like '%Create%' then 1 else 0 end as NormalPKGFlag,
        case when bole.LookID IS NOT NULL  then bole.LookID else ole.LookID end as LookIDV2,
        Round (case when i.sku_category = 'PACKAGE' then ((ol.line_total) / (count(*) over (partition by ol.Order_Line_OID))) else (case when ol.line_total = '0' then ol.List_Price else ol.line_total end)  end, 2) as LINETOTAL,
        Round (case when i.sku_category = 'PACKAGE' then ((ol.Est_Pretax_Amount) / (count(*) over (partition by ol.Order_Line_OID))) else ol.Est_Pretax_Amount end, 2) as EST_PRE_TAX_LINETOTAL
        --count(*) over (partition by ol.Order_Line_OID) TotalinPKG

from (select * from ODS_OWN.ORDER_HEADER oh 
        where 
                EXISTS (select * from ODS_OWN.EVENT e where e.School_Year = 2019 and e.EVENT_REF_ID = oh.EVENT_REF_ID)
                and
                EXISTS (select * from ODS_OWN.ORDER_CHANNEL oc where CHANNEL_NAME = 'MLT' and oh.ORDER_CHANNEL_OID = oc.ORDER_CHANNEL_OID)

        ) oh


--inner join (select distinct ORDER_CHANNEL_OID, CHANNEL_NAME from ODS_OWN.ORDER_CHANNEL where CHANNEL_NAME = 'MLT') oc on oh.ORDER_CHANNEL_OID = oc.ORDER_CHANNEL_OID -- 
inner join ODS_OWN.APO apo on apo.APO_OID = oh.APO_OID
left join ODS_OWN.ORDER_LINE ol on oh.ORDER_HEADER_OID =  ol.ORDER_HEADER_OID
left join ODS_OWN.ORDER_LINE_DETAIL olde on ol.ORDER_LINE_OID = olde.ORDER_LINE_OID
left join ODS_OWN.ITEM i on ol.ITEM_OID = i.ITEM_OID
left join ODS_OWN.ORDER_LINE bol ON (ol.ORDER_LINE_OID = bol.BUNDLE_PARENT_ORDER_LINE_OID)
left join ODS_OWN.ITEM bi ON (bol.ITEM_OID = bi.ITEM_OID)
left join ODS_OWN.ORDER_LINE_DETAIL bold ON (bol.ORDER_LINE_OID = bold.ORDER_LINE_OID)
left join (select 
                ORDER_LINE_DETAIL_OID, 
                SUBSTR(ALIAS_ID,instr(alias_ID,' ')+1,LENGTH(ALIAS_ID)) as LookID
        from ODS_OWN.ORDER_LINE_ELEMENT
        where length(trim(alias_id)) > 0) ole on olde.ORDER_LINE_DETAIL_OID = ole.ORDER_LINE_DETAIL_OID
left join (select 
                ORDER_LINE_DETAIL_OID, 
                SUBSTR(ALIAS_ID,instr(alias_ID,' ')+1,LENGTH(ALIAS_ID)) as LookID
        from ODS_OWN.ORDER_LINE_ELEMENT 
        where length(trim(alias_id)) > 0) bole on bold.ORDER_LINE_DETAIL_OID = bole.ORDER_LINE_DETAIL_OID

where
ol.list_price != 0) abc

选择
将(不同的abc.OrderNo)计数为总订单,
总和(当abc.itemsdescription\u Detail='Hi Res Digital Image'然后1或0结束时的情况)作为总DIDs,
计数(不同(当abc.itemsdescription\u Detail='Hi Res Digital Image'然后是abc.OrderNo end时的情况)为总订单数,
求和(当abc.itemsdescription\u Detail='CD High and Low Resolution'然后为1,否则为0结束时的情况)作为总计\u CD\u的外观,
计数(不同(当abc.itemsdescription\u Detail='CD High and Low Resolution'然后abc.OrderNo end时的情况)作为总的\u CD\u订单,
求和(当abc.itemsdescription\u Detail='Hi Res Digital Image'和abc.NORMALPKGFLAG='1'然后1或0结束时的情况)作为总的\u PKG\u DIDs,
将(不同的(当abc.itemsdescription\u Detail='Hi Res Digital Image'和abc.NORMALPKGFLAG='1'然后abc.OrderNo end时的情况)计算为总订单数量,
求和(当abc.itemsdescription\u Detail='CD High and Low Resolution'和abc.NORMALPKGFLAG='1'然后1 else 0 end时的情况)作为总计\u PKG\u CD\u的外观,
将计数(不同(当abc.itemsdescription\u Detail='CD High and Low Resolution'和abc.NORMALPKGFLAG='1'然后abc.OrderNo end时的情况)作为总的\u PKG\u CD\u订单,
求和(当abc.itemsdescription\u Detail='Hi Res Digital Image'和abc.SPECIALFLAG='1'时,则为1,否则为0结束)作为总的\u SPL\u OFFER\u DIDs,
将(不同的(当abc.itemsdescription\u Detail='Hi Res Digital Image'和abc.SPECIALFLAG='1'然后abc.OrderNo end时的情况)计算为总的\u SPL\u OFFER\u DID\u Orders,
求和(当abc.itemsdescription\u Detail='CD High and Low Resolution'和abc.SPECIALFLAG='1'然后1 else 0 end时的情况)作为总的\u SPL\u OFFER\u CD\u外观,
计数(不同(当abc.itemsdescription\u Detail='CD High and Low Resolution'和abc.SPECIALFLAG='1'然后abc.OrderNo end时的情况)作为总的\u SPL\u OFFER\u CD\u订单,
求和(当abc.itemsdescription\u Detail='Hi Res Digital Image'和abc.CREATEPKG='1'时,则为1,否则为0结束)作为总计,
将(不同的(当abc.itemsdescription\u Detail='Hi Res Digital Image'和abc.CREATEPKG='1'然后abc.OrderNo end时的情况)计算为总订单,
求和(当abc.itemsdescription\u Detail='CD High and Low Resolution'和abc.CREATEPKG='1'然后1 else 0 end时的情况)作为总计,
计数(不同(当abc.itemsdescription\u Detail='CD High and Low Resolution'和abc.CREATEPKG='1'然后abc.OrderNo end时的情况)作为总的\u CYOP\u CD\u订单,
合计(当abc.itemsdescription\u Detail='Hi Res Digital Image'和abc.CREATEPKG'1'和abc.SPECIALFLAG'1'和abc.NORMALPKGFLAG'1'时,则为1,否则为0结束)作为总计,
将(不同的(当abc.itemsdescription\u Detail='Hi Res Digital Image'和abc.CREATEPKG'1'和abc.SPECIALFLAG'1'和abc.NORMALPKGFLAG'1'然后abc.OrderNo end时的情况)计算为总计\u非\u PKG\u未完成订单,
求和(当abc.itemsdescription\u Detail='CD High and Low Resolution'和abc.CREATEPKG'1'和abc.SPECIALFLAG'1'和abc.NORMALPKGFLAG'1'时,则为1,否则为0结束)作为总计,
计数(不同(当abc.itemsdescription\u Detail='CD High and Low Resolution'和abc.CREATEPKG'1'和abc.SPECIALFLAG'1'和abc.NORMALPKGFLAG'1'然后abc.OrderNo end时的情况)为总计\u非\u PKG\u CD\u订单
从(选择
不同的
哦,事件参考号,
--主管频道名称,
哦,订单头订单头,
哦,命令不命令不,
哦,订单日期订单日期,
ol.订单行\ OID订单行,
其他单价单价,
其他订单数量,
--ol.List_价格列表价格,
--ol.Line_总计LineTotal,
--其他税前金额,
------old.Order\u Line\u Detail\u OID OrderLineDetail,
------旧图纸尺寸图纸尺寸,
i、 SKU_类别,
i、 描述项描述,
bi.SKU类别SKU类别详细信息,
bi.说明项目说明\详细信息,
--ole.LookID,
--bole.LookID,
当i.sku_category='PACKAGE'和i.Description(如“%Special%”)时,则1或0以SpecialFlag结束,
当i.sku_category='PACKAGE'和i.Description(如“%Create%”)时,则1或0结束为CreatePKG,
当i.sku_category='PACKAGE'和i.Description不象'%Special%'和i.Description不象'%Create%'时,则1或0以NormalPKGFlag结束,
当bole.LookID不为NULL时,则bole.LookID else ole.LookID结束为LookIDV2,
四舍五入(i.sku\U类别为“包装”时的情况,然后((ol.line\U total)/(count(*)(按ol.Order\U line\U OID划分))其他(ol.line\U total为“0”时的情况,然后ol.List\U价格其他ol.line\U TOTALL end)结束,2)作为LINETTALL,
四舍五入(当i.sku\U类别='包装'时,则((ol.Est\U税前金额)/(计数(*)超过(按ol.Order\U行\U OID划分)),否则ol.Est\U税前金额结束,2)作为Est\U税前金额总计
--总计inpkg上的计数(*)(按ol.Order\U Line\U OID划分)
from(从ODS_OWN.ORDER_标题中选择*)
哪里
存在(从ODS_OWN.EVENT e中选择*,其中e.School_Year=2019,e.EVENT_REF_ID=oh.EVENT_REF_ID)
和
存在(从ODS_OWN.ORDER_CHANNEL oc中选择*,其中CHANNEL_NAME='MLT'和oh.ORDER_CHANNEL_OID=oc.ORDER_CHANNEL_OID)
)噢
--内部联接(从oh.ORDER\u CHANNEL\u OID=oc.ORDER\u通道上的ODS\u OWN.ORDER\u通道中选择不同的ORDER\u通道\u OID、通道\u名称,其中通道\u名称='MLT')oc
内部连接ODS_OWN.APO APO APO on APO.APO_OID=oh.APO_OID
在oh.ORDER\U HEADER\U OID=ol.ORDER\U HEADER\U OID上左连接ODS\U OWN.ORDER\U行ol
左连接ODS_OWN.ORDER_LINE_olde on ol.ORDER_LI上的详细信息
(select * from ODS_OWN.ORDER_HEADER oh 
        where 
                EXISTS (select * from ODS_OWN.EVENT e where e.School_Year = 2019 and e.EVENT_REF_ID = oh.EVENT_REF_ID)
                and
                EXISTS (select * from ODS_OWN.ORDER_CHANNEL oc where CHANNEL_NAME = 'MLT' and oh.ORDER_CHANNEL_OID = oc.ORDER_CHANNEL_OID)

        ) oh
left join (select 
                ORDER_LINE_DETAIL_OID, 
                SUBSTR(ALIAS_ID,instr(alias_ID,' ')+1,LENGTH(ALIAS_ID)) as LookID
        from ODS_OWN.ORDER_LINE_ELEMENT
        where length(trim(alias_id)) > 0) ole on olde.ORDER_LINE_DETAIL_OID = ole.ORDER_LINE_DETAIL_OID
left join (select 
                ORDER_LINE_DETAIL_OID, 
                SUBSTR(ALIAS_ID,instr(alias_ID,' ')+1,LENGTH(ALIAS_ID)) as LookID
        from ODS_OWN.ORDER_LINE_ELEMENT 
        where length(trim(alias_id)) > 0) bole on bold.ORDER_LINE_DETAIL_OID = bole.ORDER_LINE_DETAIL_OID