-1

この SQL リクエストを最適化したいと思います。大きなデータベースがあり、それを実行しようとしましたが、7 時間かかりました。結果をSQL DEVELOPPERでExcelにエクスポートできませんでした。

最適化して応答時間を改善するのを手伝ってください。また、これによりすべての出現がもたらされ、「グループ化」式を使用して che.ncp と che.typ でそれらを統合したいのですが、選択に多くのフィールドがあるため機能しません。

あなたの貴重な助けに感謝します

select distinct 
   (select sum(che1.mon) 
    from awbeprod_fr.CHE_BKFRACOMC che1 
    where che.ncp = che1.ncp and
             che.typ = che1.typ and che.typ='T'),

   (select count(che1.typ) 
    from awbeprod_fr.CHE_BKFRACOMC che1 
    where che.ncp = che1.ncp 
    and che.typ=che1.typ and che.typ='T'),

   (select sum(che1.mon) 
    from awbeprod_fr.CHE_BKFRACOMC che1 
    where che.ncp = che1.ncp 
    and che.typ=che1.typ and che.typ='C'),

   (select count(che1.typ) 
    from awbeprod_fr.CHE_BKFRACOMC che1 
    where che.ncp = che1.ncp 
    and che.typ=che1.typ and che.typ='C'),

   che.ncp, che.mon, che.typ, che.dco, che.dag, 
   che.pie, m.cpro, m.age,  m.ribdec,  m.dev,
   p.lib, cli.cli, cli.lib, cli.pre, cli.nom, 
   adcli.adr1, adcli.adr2, adcli.adr3, adcli.cpos, adcli.ville
from 
   awbeprod_fr.CHE_BKFRACOMC che, awbeprod_fr.bkcom m, 
   awbeprod_fr.bkprod p, awbeprod_fr.bkcli cli, 
   awbeprod_fr.bkadcli adcli
where che.ncp = m.ncp 
and che.cli = m.cli and m.cli = cli.cli
and cli.cli = adcli.cli and m.cpro = p.cpro
order by che.ncp    

ありがとうございました。

4

2 に答える 2

3

問題の一部は、最終結果を得るために 4 つの相関サブクエリを実行していることです。サブクエリを使用して取得することから始め、これsum()count()似ています。これは と の結果を取得しCTそれを に結合しますawbeprod_fr.CHE_BKFRACOMC:

select 
  che1.sum_T,
  che1.count_T,
  che1.sum_C,
  che1.count_C,
  che.ncp, 
  che.mon, 
  che.typ, 
  che.dco, 
  che.dag, 
  che.pie,
  m.cpro,m.age, 
  m.ribdec, 
  m.dev,
  p.lib, 
  cli.cli, 
  cli.lib, 
  cli.pre, 
  cli.nom, 
  adcli.adr1, 
  adcli.adr2, 
  adcli.adr3, 
  adcli.cpos, 
  adcli.ville
from awbeprod_fr.CHE_BKFRACOMC che
inner join awbeprod_fr.bkcom m 
  on che.ncp = m.ncp 
  and che.cli = m.cli
inner join awbeprod_fr.bkcli cli
  on m.cli = cli.cli
inner join awbeprod_fr.bkadcli adcli
  on cli.cli = adcli.cli
inner join awbeprod_fr.bkprod p   
  on m.cpro = p.cpro
left join
(
  select typ, ncp,
    sum(case when typ='T' then mon else 0 end) sum_T,
    count(case when typ='T' then 1 else null end) count_T,
    sum(case when typ='C' then mon else 0 end) sum_C,
    count(case when typ='C' then 1 else null end) count_C
  from awbeprod_fr.CHE_BKFRACOMC
  group by typ, ncp
) che1
   on che.ncp = che1.ncp
   and che.typ=che1.typ
order by che.ncp  
于 2013-01-24T16:43:58.847 に答える
1

JOINわかりやすくするために、ファーを明示的なsに変更してみてください。そして、サブクエリを削除します。サブクエリは必要ありません。

SELECT  SUM(CASE WHEN che.typ = 'T' THEN che1.mon END) SumT,
        SUM(CASE WHEN che.typ = 'T' THEN 1 END) CountT,
        SUM(CASE WHEN che.typ = 'C' THEN che1.mon END) SumC,
        SUM(CASE WHEN che.typ = 'C' THEN 1 END) CountC,
        che.ncp, che.mon, che.typ, che.dco, che.dag, 
        che.pie, m.cpro, m.age,  m.ribdec,  m.dev,
        p.lib, cli.cli, cli.lib, cli.pre, cli.nom, 
        adcli.adr1, adcli.adr2, adcli.adr3, adcli.cpos, adcli.ville
FROM awbeprod_fr.CHE_BKFRACOMC che
INNER JOIN awbeprod_fr.bkcom m
    ON che.ncp = m.ncp AND che.cli = m.cli
INNER JOIN awbeprod_fr.bkprod p
    ON m.cpro = p.cpro
INNER JOIN awbeprod_fr.bkcli cli
    ON m.cli = cli.cli
INNER JOIN awbeprod_fr.bkadcli adcli
    ON cli.cli = adcli.cli
GROUP BY che.ncp, che.mon, che.typ, che.dco, che.dag, 
         che.pie, m.cpro, m.age,  m.ribdec,  m.dev,
         p.lib, cli.cli, cli.lib, cli.pre, cli.nom, 
         adcli.adr1, adcli.adr2, adcli.adr3, adcli.cpos, adcli.ville
ORDER BY che.ncp  
于 2013-01-24T16:46:31.527 に答える