1. 程式人生 > 實用技巧 >sql執行速度優化

sql執行速度優化

1. 查詢最新的主單對應的子單的sum

1. 版本一 執行十幾秒沒有出現結果
select sum(c.putaway_qty),a.consignment_no,c.sku_code 
from odoo_dsf_inbound_order_info a 
inner join 
(select max(id) as id from odoo_dsf_inbound_order_info group by consignment_no) b on b.id=a.id 
inner join odoo_dsf_inbound_detail_sku_info c on a.consignment_no=
c.consignment_no and a.serial_number=c.serial_number where a.status='C' and c.putaway_qty !=0 group by a.consignment_no,c.sku_code

2. 版本二 400萬不到的資料,修改之後6秒出結果
select sum(c.putaway_qty),
a.consignment_no,c.sku_code
from odoo_dsf_inbound_order_info a
inner join
(select max(id) as id from odoo_dsf_inbound_order_info group by consignment_no) b on b.id=a.id
inner join (select * from odoo_dsf_inbound_detail_sku_info limit 4000000)
c on a.consignment_no=c.consignment_no and a.serial_number=c.serial_number
where a.status='C' and c.putaway_qty !=0 group by a.consignment_no,c.sku_code

3. 版本三 因為我們是一次性任務,而且只要結果就可以,使用臨時表(1秒左右)
---將最新的ID存在臨時表
drop table if exists temp_m;
select max(id) as id into temp temp_m from odoo_dsf_inbound_order_info group by consignment_no;

---查詢結果
select sum(c.putaway_qty),
a.consignment_no,c.sku_code -- INTO TEMP rrrr
from odoo_dsf_inbound_order_info a
inner join temp_m on temp_m.id=a.id
inner join odoo_dsf_inbound_detail_sku_info c on a.consignment_no=c.consignment_no and a.serial_number=c.serial_number
where a.status='C' and c.putaway_qty !=0 group by a.consignment_no,c.sku_code;