ออกรายงานนับจำนวนคงเหลือ sql ให้ประมวลผลเร็ว

ถาม-ตอบ แนะนำไอเดียว โค้ดตัวอย่าง แนวทาง วิธีแก้ปัญหา ออกรายงานนับจำนวนคงเหลือ sql ให้ประมวลผลเร็ว

ออกรายงานนับจำนวนคงเหลือ sql ให้ประมวลผลเร็ว
ขอสอบถามคะ พอดีว่าจะทำรายงานแสดงยอดคงเหลือ แสดงตามสินค้า ข้อมูลมีเยอะกว่า 1 แสนเรคคอร์ด อยากทราบวิธีเขียนคำสั่ง sql ที่ทำให้ประมวลผลเร็วที่สุดค่ะ




SELECT a.bid, b.name_pro, 
(SELECT COUNT(bb.Docno) FROM carsale_campaign aa LEFT JOIN subpro bb ON aa.DocNo = bb.DocNo WHERE aa.bid  = a.bid AND bb.StatusDoc = 'Y'
AND DATE(aa.DocDate) BETWEEN '2018-01-01' AND '2018-12-31') AS campaignALL,
 
(SELECT COUNT(bb.Docno) FROM carsale_campaign aa LEFT JOIN subpro bb ON aa.DocNo = bb.DocNo WHERE aa.bid  = a.bid AND bb.StatusDoc = 'Y' AND bb.step IN ('3','4')
AND DATE(aa.DocDate) BETWEEN '2018-01-01' AND '2018-12-31') AS campaignSuccess,
 
(SELECT COUNT(bb.Docno) FROM carsale_campaign aa LEFT JOIN subpro bb ON aa.DocNo = bb.DocNo WHERE aa.bid  = a.bid AND bb.StatusDoc = 'Y' AND bb.step = '2'
AND DATE(aa.DocDate) BETWEEN '2018-01-01' AND '2018-12-31') AS campaignWait,
 
(SELECT COUNT(bb.Docno) FROM carsale_campaign aa LEFT JOIN subpro bb ON aa.DocNo = bb.DocNo WHERE aa.bid  = a.bid AND bb.StatusDoc = 'Y' AND bb.step IN ('0','1') 
AND DATE(aa.DocDate) BETWEEN '2018-01-01' AND '2018-12-31') AS campaignNet,
 
(SELECT SUM(bb.Price) FROM carsale_campaign aa LEFT JOIN subpro bb ON aa.DocNo = bb.DocNo WHERE aa.bid  = a.bid AND bb.StatusDoc = 'Y'
AND DATE(aa.DocDate) BETWEEN '2018-01-01' AND '2018-12-31') AS SumALL,
 
(SELECT SUM(bb.Price) FROM carsale_campaign aa LEFT JOIN subpro bb ON aa.DocNo = bb.DocNo WHERE aa.bid  = a.bid AND bb.StatusDoc = 'Y' AND bb.step IN ('3','4')
AND DATE(aa.DocDate) BETWEEN '2018-01-01' AND '2018-12-31') AS SumSuccess,
 
(SELECT SUM(bb.Price) FROM carsale_campaign aa LEFT JOIN subpro bb ON aa.DocNo = bb.DocNo WHERE aa.bid  = a.bid AND bb.StatusDoc = 'Y' AND bb.step = '2'
AND DATE(aa.DocDate) BETWEEN '2018-01-01' AND '2018-12-31') AS SumWait,
 
(SELECT SUM(bb.Price) FROM carsale_campaign aa LEFT JOIN subpro bb ON aa.DocNo = bb.DocNo WHERE aa.bid  = a.bid AND bb.StatusDoc = 'Y' AND bb.step IN ('0','1') 
AND DATE(aa.DocDate) BETWEEN '2018-01-01' AND '2018-12-31') AS SumNet
FROM carsale_campaign a
LEFT JOIN province b ON a.bid = b.code_pro
WHERE 1=1 AND a.bid IN ('10','11','12','13','14','15','16','20','21','22','23','30','31','32','33','40','41','42','50','51','60','61','70','71','72','73','74','75','76','80') AND DATE(a.DocDate) BETWEEN '2018-01-01' AND '2018-12-31' GROUP BY a.bid

อันนี้เป็นโค้ดที่ใช้อยู่คะ พอรันบน Server มันช้ามากจนระบบ error เลยคะ


 


Anyarut 25-05-2019 11:45:07

คำแนะนำ และการใช้งาน

สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก


  • ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ
  • เปลี่ยน


    ( หรือ เข้าใช้งานผ่าน Social Login )

 ความคิดเห็นที่ 1
อาจจะต้องดูในเรื่องการทำ index ฟิลด์ข้อมูล ซึ่งสำคัญหากมีข้อมูลจำนวนมากๆ จะเห็นผลชัดเจน
และก็ดูเรื่องการเลือกใช้คำสั่งการคิวรี่ การเลือกคิวรี่่ข้อมูล
ดูเรื่องการเพิ่มฟิลด์เพื่อแยกหรือจำแนกข้อมูล 
ดูเรื่องการใช้งาน view หรืออาจจะสร้างตารางแยก
ดูเรื่องการใช้งานพวก cronjob หรือ mysql schedule จัดการข้อมูล เช่น สร้างข้อมูลรายงานอัตโนมัติ
อย่างไรก็ตาม ก็ขึ้นอยู่กับข้อมูล ว่าเป็นข้อมูลที่อัพเดทตลอดเวลา หรือข้อมูลที่แค่นำมาแสดง เป็นข้อมูลที่ไม่ได้อัพเดทบ่อยๆ หรืออื่นๆ 
ที่เหลือก็เป็นส่วนของ hardware พวก server ประสิทธิภาพและความแรงของ server  แนวทางจะประมาณนี้


ninenik 25-05-2019






เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ