วันอังคารที่ 29 กรกฎาคม พ.ศ. 2557

Tip การเขียน SQL กับ DB2

Tip: กับการเขียน DB2 

ผมพบปัญหาว่า  SQL แล้วเครื่องทำงาน  "ช้า"
สิ่งแรกที่ผมจะทำคือ  ปรับ SQL    ถ้ายังไม่ดีขึ้น จะสร้าง Index, L-File

ตัวอย่างวันนี้   ผมสงสัยกับการเขียน SQL แบบต่างๆ มีผลต่อความเร็วหรือไม่ ?
File ที่มี Field = Y,M,D  แยกกัน  (พบบ่อย ในระบบที่สร้างมานาน)
มักจะสร้าง Logical-File  ที่มี Key แบบนี้  Y,M,D

Q: การเขียน SQL Statement แบบไหน  ทำงานเร็วที่สุด
(1) sql ...    เขียนตาม หลักการข้างต้น
and Y = wFromY and M =wFromM and D>= wFromD
and Y = wToY and M =wToM and D<= wToD

2)  ...sql...
       and (Y = wFromY and M =wFromM and D>= wFromD)
and (Y = wToY and M =wToM and D<= wToD)

3)  ...sql...
and Y|| M || D >= wFromY || wFromM || wFromD
and Y|| M || D <= wToY || wToM || wToD

ใคร เลือกข้อ 1)  เขียนผิดน๊ะครับ ลองทดสอบข้อมูล  ดูในช่วงนี้ 2014/06/25 - 2014/07/02

ตัวผม  มักเลือก ข้อ 2)
เพราะเคยอ่านคำแนะนำพบว่า  การสร้าง Field ใหม่ DB Engine จะทำงาน "หนัก"

เพื่อลดข้อสงสัย ก็ต้องใช้  Visual Explain ตรวจดู
>> ข้อ 3  ทำงานเร็วกว่า ข้อ 2  ... ดูจาก Total Estimate Run Time

Visual Explain ของ SQL ข้อ 2


Visual Explain ของ SQL ข้อ 3

คำอธิบาย (แก้ตัว) ที่ดีคือ
DB Engine จะทำการแปล SQL แล้วเลือก  วิธีที่เร็วที่สุด   โดยการเปรียบเทียบกับกรณีต่างๆ
นับเป็นรายละเอียดที่  เข้าใจยาก ....
แต่ทดสอบ  การเดาผ่าน Visual Explain ได้

ถ้าไปสัมนากับ IBM เขาจะแนะนำว่า  Table (File) ที่จำนวน rows มาก
, มีความหลากหลายมาก ควรสร้าง Index (L-File)    ควรสร้าง Index File

จากภาพ Visual Explain   มุมขวาล่าง Table Scan (= การอ่านตามลำดับ ก่อน/หลัง)
เมื่อกดเลือก  ด้านขวาจะให้ข้อมูล  และ แนะนำ
- File ตัวนี้ใหญ่  มี 3 ล้าน Rows ,  เพื่อความเร็ว  ควรสร้าง Index File
>> ถ้าผมต้องการให้เร็วขึ้น  ก็ต้องสร้าง L-File แล้วครับ