สรุปเนื้อหาจาก กิจกรรม SQL Tuning
โดยคุณ Narat Lar

Oracle Process มีกระบวนการ 2 ขั้นตอน คือวิเคราะห์ และประมวลผล การ Tuning จะเพิ่มความเร็วในการทำงานและ ทั้งยังลดกระบวนการวิเคราะห์ และการประมวลผล หรือทั้งสอง การ Tuning จะเกิดขึ้นหลังจากที่ได้ Statement ที่ทำงานได้ถูกต้องแล้ว

SQL Tuning Tip
1. Oracle จะหลีกเลี่ยงขั้นตอนการวิเคราะห์ สำหรับการใช้งานที่มีคำสั่งตามมาเหมือนๆกัน
2. หลีกเลี่ยงการใช้ where condition ที่ไม่มีใช่ index เช่น where substring(ColA,’B’,’’)
3. Tuning Viewเพื่อเพิ่มประสิทธิภาพการทำงาน ก็เหมือนการ Tune Statement ทั่วไป
4. ไม่ควรใช้ where clause ใน having ควรจะกรองข้อมูลก่อนที่จะทำการ Group by
5. ลดปริมาณการ Query ที่ไม่จำเป็นโดยเลือก column ที่ต้องการใช้เท่านั้น
6. พิจารณาเลือกการใช้ Exist ,in and Table join ให้เหมาะสมในการ join
7. ควรหลีกเลี่ยงการใช้ distinct ร่วมกับการ join table แต่ควรใช้ EXISTS จะให้ผลลัพธ์ที่เร็วกว่า
8. การใช้ Union และ Union All การทำงานของ Union All จะเร็วกว่าเพราะ จะรวมทุก records ทั้งที่เป็นข้อมูลซ้ำกัน โดยจะไม่มีขั้นตอนการ Sort ,merge และ filter แต่ Union จะต้อง Sort ,merge และ filter ถึงจะคืนค่าจึงทำใหมีการทำงานช้ากว่า
9. หากต้องการ Aggregation function ต้องการ sum({condition}) ,count({condition}) ควรใส่เงื่อนไข ใน function เพื่อที่จะได้ไม่ต้องมีการดึงข้อมูลซ้ำๆ หลายรอบเช่น

SELECT COUNT(DECODE(status, 'Y', 'X', NULL)) Y_count,
COUNT(DECODE(status, 'N', 'X', NULL)) N_count
FROM emp WHERE emp_name LIKE 'SMITH%'

10. ควรหลีกเลี่ยงการใช้ Implicit Conversion หากรู้ว่าข้อมูลนั้นมี Type แบบใดเพื่อช่วยลดขั้นตอนการแปลง Type Data
11. เพื่อประสิทธิภาพที่ดีขึ้นในการ count ควรใช้count(1) จะดีกว่า count(*)
12. ไม่เปรียบเทียบค่า Null กับ Null เพราะ Null ไม่ใช่ Empty String และไม่เท่ากับ 0
13. หากมีการใช้ table มากกว่า 1 table ควรใช้ alias table
14.ในการ Insert ควรจะระบุชื่อ column ในการ insert เช่น insert into A (a1,a2,..) values(1,2,…) เพื่อป้องกันความผิดพลาด
15. ใน Where condition ควรระบุเงื่อนไขให้เหมาะสมตรงกับ type data ของ column นั้น เช่น string=string
16. ใน where condition ใช้ in เร็วกว่า or จุดสำคัญอื่นๆที่สำคัญในการ tuning
  • การสร้าง Index ที่เหมาะสมกับการใช้งานที่เกิดขึ้นบ่อยๆ
  • เลือกวิธีการ Join ที่เหมาะสม ว่าควรใช้ Nest loop, Hash join loop
    • Nest loop คือการนำข้อมูลที่น้อย ไป Loop ในในข้อมูลที่มากกว่า
    • Hash loop คือการjoin ที่ข้อมูลทั้งสอง table มีปริมาณข้อมูลเท่าๆกัน
  • เลือกลำดับการ Join
  • เลือก Driving Tableที่ดี
  • เลือกข้อมูลเฉพาะที่ต้องการเท่านั้นมาใช้ในการ Join

Type of join in SQL

Cross Join (Cartesian product)
Cross Join เป็นรูปแบบการ Join โดยทั่วไป ผลลัพธ์มันคือจำนวนของเรคคอร์ดใน Tableแรก รวมกับ จำนวนของเรคคอร์ด ในTableที่สอง และแสดง Column ร่วมกัน
SELECT * FROM Departments, Employees
or SELECT * FROM Departments CROSS JOIN Employees

1. Inner Join เป็นรูปแบบการ Join โดยการอ้างถึง intersection ผลลัพธ์มันคือเรคคอร์ดที่ทั้งสองTable มีค่าเหมือนกัน
SELECT * FROM Departments d, Employees e WHERE d.ID = e.DepartmentID
or SELECT * FROM Departments d INNER JOIN Employees e ON d.ID = e.DepartmentID

2. Outer Joins มี 3 แบบ คือ
  • Full Outer Join การคืนค่าจะคล้ายกับ inner join แต่จะมีการคืนค่า null สำหรับค่าที่ไม่ตรงกันมาด้วย
  • Left Outer Join การคืนค่าโดยมีTable ทางด้านซ้ายเป็นตัวตั้งแล้วที่แล้วหาข้อมูลที่ตรงกันใน Table ทางด้านขวามือมาแสดงผล โดยจะไม่มีการคืนค่า Null
  • Right Outer Join การคืนค่าคล้ายกับ left joinโดยมีTable ทางด้านขวาเป็นตัวตั้งแล้วที่แล้วหาข้อมูลที่ตรงกันใน Table ทางด้านซ้ายมือมาแสดงผล โดยจะไม่มีการคืนค่า Null

2.1.Theta Join คือการ Join ที่ไม่ใช่ Equi Join
SELECT * FROM Departments d, Employees e WHERE d.ID < e.DepartmentID
or SELECT * FROM Departments d, Employees e WHERE d.ID <= e.DepartmentID

2.2.Natural join คือการJoin โดยที่เป็นการเปรียบกับ Column ที่มีชื่อเหมือนกันระหว่าง Table
โดยเป็นการ Default Join แบบ inner join แต่ก็สามารถใช้ outer join ได้ในตัวอย่างด้านล่าง
SELECT * FROM Departments NATURAL JOIN Employees
SELECT * FROM Departments NATURAL LEFT OUTER JOIN Employees

2.3. Equi Join คือการ Join ที่เหมือนกับ Inner Join (Inner Equi Join)

Index
Index เป็นตัวช่วยเพิ่มประสิทธิภาพของดึงข้อมูลในการใช้คำสั่ง select ,update and delete แต่จะทำให้การ Insert ช้าลงเพราะเมื่อมีการ insert จะทำงานถึง 2 รอบคือ ข้อมูลจะเพิ่มเข้าที่ Table และ Index การสร้าง Index ควรจะสร้างเท่าที่จำเป็นเหมาะสมกับงาน โดยColumn ที่จะนำมาสร้าง Index จะต้องมีค่าที่ไม่ซ้ำกันมาก และไม่เป็นค่า Null การเก็บข้อมูลใน Index จะเก็บเป็นค่า ROW_ID คู่กับ Column ที่นำไปสร้าง Index

141101.14:34:19
• เพิ่ม.