如何优化Sum SQL查询?

时间:2019-12-01 08:05:41

标签: sql

我有这个查询。

select  a.NoSPKJahit as 'TglSPKJahit',
        c.TglSPKJahit as 'spkJahit',
        a.SeriBarang as 'KodeSeri',
        b.NamaBarang as 'NamaBarang',
        a.JmlTotalPotong-a.JmlTotalRusakSablon as 'JumlahSPKJahit',
        a.JmlTotalSelesaiJahit as 'JumlahHasilJahit',
        (select sum(Qty) from PenjualanDTL where KodeBarang = a.KodeBarang) as 'JumlahPenjualan',
        (select sum(JumlahRetur) from StokBS where KodeBarang = a.KodeBarang) as 'JumlahRetur',
        (select sum(JumlahRusak) from StokBS where KodeBarang = a.KodeBarang) as 'JumlahRusak',
        (a.JmlTotalSelesaiJahit - (select sum(Qty) from PenjualanDTL where KodeBarang = a.KodeBarang) +((select sum(JumlahRetur) from StokBS where KodeBarang = a.KodeBarang)-(select sum(JumlahRusak) from StokBS where KodeBarang = a.KodeBarang))) as 'SisaBarang',
        (select sum(JumlahStok) from StokToko where KodeBarang = a.KodeBarang and KodeToko = 'GD000')as 'Gudang',
        (select sum(JumlahStok) from StokToko where KodeBarang = a.KodeBarang and KodeToko = 'GD001')as 'GudangAtas',
        (select sum(JumlahStok) from StokToko where KodeBarang = a.KodeBarang and KodeToko = 'GD002')as 'Mobil',
        (select sum(JumlahStok) from StokToko where KodeBarang = a.KodeBarang and KodeToko = 'OL01')as 'MissMode',
        (select sum(JumlahStok) from StokToko where KodeBarang = a.KodeBarang and KodeToko = 'TK005')as 'SilverLeafM'
from DetilBarang a
left join MsBarang b on b.KodeBarang = a.KodeBarang
left join SPKJahit c on c.NoSPKJahit = a.NoSPKJahit

但是执行速度很慢。如何提高查询性能? 谢谢。

2 个答案:

答案 0 :(得分:2)

我将子查询移到join子句,并对所有SUM(CASE WHEN ...)的总和使用条件聚合(StokToko.JumlahStok

select
  db.NoSPKJahit as "TglSPKJahit",
  sj.TglSPKJahit as "spkJahit",
  db.SeriBarang as "KodeSeri",
  mb.NamaBarang as "NamaBarang",
  db.JmlTotalPotong - db.JmlTotalRusakSablon as "JumlahSPKJahit",
  db.JmlTotalSelesaiJahit as "JumlahHasilJahit",
  pd."JumlahPenjualan",
  sb."JumlahRetur",
  sb."JumlahRusak",
  db.JmlTotalSelesaiJahit - pd."JumlahPenjualan" + sb."JumlahRetur" - sb."JumlahRusak"
    as "SisaBarang",
  st."Gudang",
  st."GudangAtas",
  st."Mobil",
  st."MissMode",
  st."SilverLeafM"
from DetilBarang db
left join MsBarang mb on mb.KodeBarang = db.KodeBarang
left join SPKJahit sj on sj.NoSPKJahit = db.NoSPKJahit
left join
(
  select
    KodeBarang,
    sum(Qty) as "JumlahPenjualan"
  from PenjualanDTL
  group by KodeBarang
) pd on pd.KodeBarang = db.KodeBarang
left join
(
  select
    KodeBarang,
    sum(JumlahRetur) as "JumlahRetur",
    sum(JumlahRusak) as "JumlahRusak"
  from StokBS
  group by KodeBarang
) sb on sb.KodeBarang = db.KodeBarang
left join
(
  select
    KodeBarang,
    sum(case when KodeToko = 'GD000' then JumlahStok end) as "Gudang",
    sum(case when KodeToko = 'GD001' then JumlahStok end) as "GudangAtas",
    sum(case when KodeToko = 'GD002' then JumlahStok end) as "Mobil",
    sum(case when KodeToko = 'OL01' then JumlahStok end) as "MissMode",
    sum(case when KodeToko = 'TK005' then JumlahStok end) as "SilverLeafM"
  from StokToko
  group by KodeBarang
) st on st.KodeBarang = db.KodeBarang
order by db.NoSPKJahit;

请在适当的地方将左外部联接更改为内部联接。

推荐索引以加快查询速度

create index idx1 on msbarang (kodebarang, namabarang);
create index idx2 on spkjahit (nospkjahit, tglspkjahit);
create index idx3 on penjualandtl (kodebarang, qty);
create index idx4 on stokbs (kodebarang, jumlahretur, jumlahrusak);
create index idx5 on stoktoko (kodebarang, kodetoko, jumlahstok);

这可能会尽快。没有任何WHERE子句,您可能正在查询大量数据。

答案 1 :(得分:0)

您可以尝试

SELECT A.*, sum(ISNULL(B.qty, 0)) as TotQty
from SiteInformation A
left join ItemSite B on A.SiteID = B.SiteID and A.InvtID = B.InvtID

我认为它会比TotQty =(SELECT FROM SUM(Qty)FROM where ...)