SQL Tuning หรือ SQL Optimization Query Part Only
บทความเกี่ยวกับ : SQL Tuning หรือ SQL Optimization Query Part Only
SQL Tuning หรือ SQL Optimization Query Part Only
เห่อ สร้างหัวข้อซะ อินเตอร์ วันนี้เด็ดครับ เอาของดีมาฝาก
ผมว่าเพื่อนๆ Developer ทุกคนถ้าจับงานใหญ่ๆ เล่นกับ Data เยอะๆ ต้องเจอปัญหานี้แน่นอน
Query ข้อมูลไม่ขึ้นว่ะ หรือ กำ Query แล้วค้าง แงๆๆ ทำไงดี
วันนี้ห้ามพลาดครับกับไม้เด็ดในการ Tuning Query ให้เร็วขั้นเทพ
เทคนิคง่ายๆ ผมเคยโพสไปแล้ว จะไม่กล่าวถึงนะครับ วันนี้เอาแบบมือโปร เท่านั้น หุหุ
โม้ซะเยอะ เริ่มกันเลยดีกว่า
1. Query ด้วยการระบุ field ให้ชัดเจนเร็วกว่าแน่นอน
แม้จะไม่ค่อยเห็นผลใน 1 query
แต่คิดดูถ้าคุณ query ซัก สิบล้านรอบมันจะมีผลแค่ใหน หุหุ
select f1,f2,f3 from my_table
เร็วกว่า
select * from my_table
ฟันธง
2. ใช้ Select ซ้อน Select ให้ฉลาด ๆ ในบางเคส ยกตัวอย่างเช่น
select f1,f2,f3 from my_table where
(f1,f2) = (select max(f1),max(f2) from my_table)
เร็วกว่า
select f1,f2,f3 from my_table where
f1 = (select max(f1) from my_table)
and f2 = (select max(f2) from my_table)
ฟันธง
3. ใช้ EXISTS เร็วกว่า IN แน่นอน
ยกตัวอย่างอันนี้ผมใช้ใน Oracle นะครับ
select f1,f2,f3 from my_table where
exists (select 1 from dual where f1=1 or f1=2 or f1=3)
เร็วกว่า
select f1,f2,f3 from my_table where
f1 in (1,2,3)
ฟันธง
4. ใช้ UNION ALL เร็วกว่า UNION
แต่ก็อย่างว่าแหละบางทีมันก็จำเป็นต้องใช้ UNION อ่ะเพราะต้องการข้อมูลที่มันไม่ซ้ำ ชิมิ
ก็ดูเป็นกรณีไปครับเช่นถ้าเรารู้อยู่แล้วข้อมูลไม่มีทางซ้ำแน่ๆ ก็แนะนำให้ใช้ UNION ALL ครับเร็ว
กว่าแน่นอน
เพิ่มเติม กรณีที่ผมใช้ใน Oracle นะครับ
- f1 like 'cat%' เร็วกว่า substr(f1,1,3)='cat'
- f1 between 1 and 10000 เร็วกว่า f1>=1 and f1<=10000
- f1='x' and f2='y' เร็วกว่า f1||f2='xy'
- f1 < 20000 เร็วกว่า f1+10000<30000
- f1 exists (select 1 from dual where f1 in (1,2,3,4,5,6,7,8,9,10))
เร็วกว่า f1 in (1,2,3,4,5,6,7,8,9,10)
SQL Tuning หรือ SQL Optimization Query Part Only
เห่อ สร้างหัวข้อซะ อินเตอร์ วันนี้เด็ดครับ เอาของดีมาฝาก
ผมว่าเพื่อนๆ Developer ทุกคนถ้าจับงานใหญ่ๆ เล่นกับ Data เยอะๆ ต้องเจอปัญหานี้แน่นอน
Query ข้อมูลไม่ขึ้นว่ะ หรือ กำ Query แล้วค้าง แงๆๆ ทำไงดี
วันนี้ห้ามพลาดครับกับไม้เด็ดในการ Tuning Query ให้เร็วขั้นเทพ
เทคนิคง่ายๆ ผมเคยโพสไปแล้ว จะไม่กล่าวถึงนะครับ วันนี้เอาแบบมือโปร เท่านั้น หุหุ
โม้ซะเยอะ เริ่มกันเลยดีกว่า
1. Query ด้วยการระบุ field ให้ชัดเจนเร็วกว่าแน่นอน
แม้จะไม่ค่อยเห็นผลใน 1 query
แต่คิดดูถ้าคุณ query ซัก สิบล้านรอบมันจะมีผลแค่ใหน หุหุ
select f1,f2,f3 from my_table
เร็วกว่า
select * from my_table
ฟันธง
2. ใช้ Select ซ้อน Select ให้ฉลาด ๆ ในบางเคส ยกตัวอย่างเช่น
select f1,f2,f3 from my_table where
(f1,f2) = (select max(f1),max(f2) from my_table)
เร็วกว่า
select f1,f2,f3 from my_table where
f1 = (select max(f1) from my_table)
and f2 = (select max(f2) from my_table)
ฟันธง
3. ใช้ EXISTS เร็วกว่า IN แน่นอน
ยกตัวอย่างอันนี้ผมใช้ใน Oracle นะครับ
select f1,f2,f3 from my_table where
exists (select 1 from dual where f1=1 or f1=2 or f1=3)
เร็วกว่า
select f1,f2,f3 from my_table where
f1 in (1,2,3)
ฟันธง
4. ใช้ UNION ALL เร็วกว่า UNION
แต่ก็อย่างว่าแหละบางทีมันก็จำเป็นต้องใช้ UNION อ่ะเพราะต้องการข้อมูลที่มันไม่ซ้ำ ชิมิ
ก็ดูเป็นกรณีไปครับเช่นถ้าเรารู้อยู่แล้วข้อมูลไม่มีทางซ้ำแน่ๆ ก็แนะนำให้ใช้ UNION ALL ครับเร็ว
กว่าแน่นอน
เพิ่มเติม กรณีที่ผมใช้ใน Oracle นะครับ
- f1 like 'cat%' เร็วกว่า substr(f1,1,3)='cat'
- f1 between 1 and 10000 เร็วกว่า f1>=1 and f1<=10000
- f1='x' and f2='y' เร็วกว่า f1||f2='xy'
- f1 < 20000 เร็วกว่า f1+10000<30000
- f1 exists (select 1 from dual where f1 in (1,2,3,4,5,6,7,8,9,10))
เร็วกว่า f1 in (1,2,3,4,5,6,7,8,9,10)