วันศุกร์ที่ 16 กุมภาพันธ์ พ.ศ. 2561

Intro to AS/400

Intro to AS/400


1 : แนะนำตัว AS/400

      ทำไม คนส่วนใหญ่ เรียก AS/400
      เพราะ มันเป็นรุ่นที่ "ขายได้จำนวนมาก"  (ทุกอย่างลงตัวพอดี  จำไว้ตอบ คนช่างสงสัย)
             มันรวมทุกอย่างไว้ที่ตัวมันเอง  (ทั้ง Hardware และ Software)
             - จบทุกอย่างด้วย "เจ้าเดียว"
             # ยุคนั้นจะทำอะไร ต้องแยกซื้อ (อยากได้  Tape ความเร็วสูงยี่ห้ออื่นมาใช้)
                  มันมักจะเกิดปัญหา  ต่อกันกับ ยี่ห้อที่เรา มีอยู่  "ไม่ได้"/"ยุ่งยาก"
                  ยุคนี้  โชคดี เกิดมาตฐาน USB Port
                  (แต่ยังวุ่นวาย ส่วนที่เหลือ เช่น หา Driver ที่ตรงกับ  รุ่นอุปกรณ์ ,รุ่นของ Window + Patch)

             - IBM สร้างทีมสนับสนุน และ การันตี ที่ "ดีเลิศ"
             # เคยเจอะปัญหานี้มั๊ย  ลง Excel 2016  แทน Excel XP   แล้วเครื่องช้ามากๆๆๆ
               สาเหตุ จากอะไร ? - เครื่อง PC รุ่นเก่าไป, RAM ไม่พอ, Win (ลงผิด,Patch ไม่ทันสมัย), ตัว Excel ลงผิด version, ใช้ Excel ผิดวิธี)
               จะถามใครดีล่ะ ?  คนนั้น(มักจะ)รู้เฉพาะงานของเขา  มักจะบอกส่วนของฉัน ปรกติ  ให้ไปถามคนอื่นต่อ ?
               เราอยากจะทำงานต่อแล้วล่ะ ?  ไปต่อไม่ถูกเลย
               สุดยอด  AS/400 IBM ทำเอง "ทั้งหมด"  จึงตอบได้ ว่าปัญหา เกิดจากอะไร ? แก้ไขอย่างไร ? (รวมทั้งเตือนว่า ต้องปรับ อะไร?  เพื่อไม่ให้เกิดปัญหา)

               แต่ทั้งหมด  ต้องแลก กับ "ราคา" และ "ค่าบริการ" ที่แพงเอาการ (IBM เรียกว่า เหมาะสม เพราะถ้าคุณทำงานต่อ  ไม่ได้,ช้า  มันมีมูลค่าสูงกว่า
         
      ทำไม หลายบริษัทฯ ยังไม่เปลี่ยน ?
      อารมณ์เดียวกับมีคนมบอกให้เปลี่ยน Win XP  (เป็น 2000,Vista, 7,8,10)
           แล้วเกือบทั้งโลก  ก็ไม่ยอมเปลี่ยน
      เพราะ มันใช้งานหลักได้ดี (เสียเงินเปลี่ยนทำไม)  การเปลี่ยน "ต้องหยุด/ชะงัก"  (ขณะเปลี่ยนต้องหยุด, ไม่นับรวมว่า  ขณะเปลี่ยนเกิดปัญหา - อันนี้หยุดใช้ "ยาว",  หลังเปลี่ยน ก็ต้อง "หัดใช้"=เสียเวลา) (เราไม่เคยหยุด)
                 การเปลี่ยน  "ต้องจ่ายซะด้วย" (นับว่าแพงมาก)
          หลายบริษัทฯ เลือกที่จะใช้งานต่อ   จนกว่า จะไม่มี  ข้ออ้างเหลือแล้ว

 Hist รุ่นที่ IBM ผลิตบางส่วน  (อาจจะเห็นคำพวกนี้)
      - S/38(1978) -> ... -> AS/400(1988) -> (เปลี่ยนชื่อ) -> System i (สุดท้าย นำไปใส่ในตู้)

2 : Sign On & Sign Off

      คอมพ์ ทุกชนิดจะต้องมี  OS (Operating System) เป็นชุดโปรแกรมแรก  ที่ทำงาน และเราก็ต้องคุยผ่านโปรแกรมตัวนี้    (ของ PC ก็คือ Windows หรือ Linux นั่นเอง)
      AS/400 เรียกเป็น OS/400

     เมื่อจะเริ่มเข้าใช้  ระบบฯ   เราจะต้อง  "มีหน้าจอ" ที่ติดต่อกับ OS/400 ได้ (ภาพ S/38 จะเห็นว่า มีจอภาพ)   ปัจจุบัน  เข้าใช้ผ่าน CA/400  (ติดตั้งบน PC แล้วตั้งค่าให้มันติดต่อไป OS/400)
     (ทั่วไป) เฉพาะ คนที่มีสิทธิ จึงจะเข้าใช้งานได้   โดย "ระบุตัวตน" ( ได้ทะเบียน โดย Admin หรือ เจ้าของเครื่อง แจ้งไว้)


อย่างน้อย ต้องระบุ User Name + Password
     ถ้าหน้าจอมีช่องให้ระบุ  อาจระบุเพิ่มเติม  ได้
 เช่น หลังจากผ่านหน้าจอ   แล้ว  เรียกใช้ Menu หรือ โปรแกรม อะไร (อยู่ใน Library อะไร)

      ทำไม ต้องระบุชื่อ Menu,โปรแกรม ล่ะ ?
      (แนวคิด IBM) จัดกลุ่ม โปรแกรม แยกเมนูไว้  เมื่อใช้งานจริง เกิดเมนู มากมาย จนเข้าใช้ตามลำดับ มัน "ช้า" มาก   (ใน SAP ก็เหมือนกัน)
        มันจะดีกับ User กลุ่มหนึ่ง ถ้า  เข้าใช้ตรงๆ ตั้งแต่ตอนเข้าที่ SignOn ได้เลย
       - แนวคิดเน้นทำงาน  "ได้เร็ว"  สำคัญกว่าเน้น "สวยงาม"

     สังเกต  หน้าจอ(ขอเรียกว่า จอเขียว) จะทำงานลักษณะ Text Mode (แสดงเป็น อักษรเท่านั้น)
     Command Line - พื้นที่ที่ใช้ป้อน  "คำสั่ง" หรือ  "ตัวเลือกเมนู"
     การจบการใช้งาน  ต้องป้อน  คำสั่ง   SignOff    (ถ้าเป็นเมนูข้างต้น  ป้อน 90)

     User Profile and Assistance Levels
     Assistance Level  ผมจะเรียกว่า  ระดับ "ตัวช่วย" ตามสิทธิการใช้คำสั่ง OS/400
     (ผมว่า ง่ายดี)  ในยุคแรกๆ  แบ่งไว้แค่ 3 กลุ่ม คือ User, Programmer, Admin
     ปัจจุบัน  การจัดกลุ่ม เริ่ม "ซับซ้อน" เช่น User บางคน อยากเรียกใช้ คำสั่ง บางส่วนเหมือน Programmer  (บางคนจะเรียกว่า Power,Advance)  กลุ่มงานมีแยกเป็น เกี่ยวกับ  เรื่อง File, Device, Spool, ... ทำให้การจัดกลุ่ม  "ซับซ้อน" สุดๆ (ใครทำ เรื่องนี้ได้ดี  นับว่าสุดยอดครับ)

3 : การใช้ Keyboard

     AS/400 ถูกออกแบบให้  ป้อนได้ "เร็ว"โดยมือขยับน้อยที่สุด และไม่ต้องใช้ Mouse (ยุคนั้นไม่มี Mouse) ภายใต้  "ข้อจำกัด"  จึงมีการสร้างวิธีเพื่อช่วย   การรู้/เข้าใจ จะช่วยให้ จะทำให้เราทำงานเร็วขึ้น   (ผมว่า ยุคนั้น พยายามได้สุดยอด และ ก็ยังมีประโยชน์  ถ้านำมาใช้)

     การป้อนข้อมุลจำนวนมาก  จะต้องออกแบบ ให้ทำงานได้เร็ว
     - เอกสาร + ลำดับการป้อน "หน้าจอ" จะต้องเรียง เหมือนกัน!
     - ช่องที่จะป้อน จะเรียงลำดับ  (เหมาะสำหรับกดปุ่ม [Tab] ไว้) กับ   ตำแหน่งแหน่ง "มือ" ได้แบบเร็ว

     ปุ่ม  [Tab]   ใช้ "ข้าม" ช่องป้อนไปช่องถัดไป (ถอยกลับ กดปุ่ม [Shift] ค้างไว้แล้วกด [Tab]) 
        - เร็วกว่า  กด ปุ่ม ลูกศร (ซ้ำๆๆๆๆๆ)  หรือ  ย้ายไปจับ Mouse
     ปุ่ม [Field Exit]    ถือว่า ป้อนข้อมูลช่องนั้น "เสร็จ" และให้ขยับไป  ช่องถัดไป
            กรณีป้อนตัวเลข  จะสั่งขยับ ตัวเลขชิดขวาให้
            คนรุ่นเก่า  อาจจะตั้ง keyboard ให้เป็น  ปุ่ม [Enter]   เพราะใช้บ่อย
            ปุ่ม [Ctrl] ด้านขวา   จะตั้งค่าเป็น  [Enter] แทน

     ปุ่ม Function Key (แถวบน คีย์บอร์ด)  ใช้แทน  คำสั่งที่ใช้บ่อย  (สามารถตั้งค่าได้)
       F1,F3 = Exit        ยกเลิก (มักใช้)   สิ้นสุด คำสั่ง/โปรแกรม
       F4: = Prompt       คล้ายกับ Help ถ้าป้อนคำสั่งบางส่วน  กด Prompt จะแสดงรายละเอียดคำสั่ง
       F9: = Retrieve     ดึงคำสั่ง ก่อนหน้ามา (ช่วยป้อน)
       F12: = Cancel     ยกเลิก (มักใช้)   ยกเลิก การทำงาน step ล่าสุด (อาจจะมีหลาย step)

     ปุ่ม Attention  (CA/400 ส่วนใหญ่ จะตั้งไว้ที่   ปุ่ม [Esc])  สามารถตั้งค่าได้
           เช่น  เปิดใช้ Command Line ใหม่  (ซ้อนหน้าจอ  มุมขวาบนจะบอก ระดับการเรียก)
     ปุ่ม System  Request  (CA/400 ส่วนใหญ่ จะตั้งไว้ที่   ปุ่ม [Esc] + Shift)
           ใช้เพื่อติดต่อ กับ OS (คำสั่งพื้นฐานจำเป็น)  เช่น  เปิดจอที่ 2, ดู Message, SignOff
     ปุ่ม PageUp, PageDown   เลื่อนหน้าจอ กรณีข้อมูล มีมาก (หลายหน้า)

4 : Managing Your Work

      การจะจัดการงาน  (เรียกโปรแกรมป้อน, ขอดู Message , สั่งพิมพ์ ,สั่งย้าย Spool, ...) 
ก็ต้อง รู้/เข้าใจ  พื้นฐาน  การทำงาน  ก่อนน๊ะครับ 

ชื่องานที่ทำอยู่ - จะต้องบอกให้ครบ ตามนี้
- Job (ชื่อจอ ,ชื่อที่ตัวเอง ตั้งไว้)
- User Name (ที่ SignOn)
- Number (เลขที่ Run No)

ถ้าทำงาน ไม่พิสดาร มีเทคนิคที่  ทำให้  บอก "ชื่อสั้นๆ" ได้
  เช่น  User ชื่อนี้   (ณ.เวลานี้) ใช้คนเดียว  เปิดใช้หน้าจอเดียว ไม่สร้างอะไรใหม่ในช่วงนี้
          ใช้ชื่อ จอ  หรือ ชื่อ User Name (ตัวใดตัวหนึ่ง ก็พอ - แต่กลุ่มนี้  มีน้อยครับ)

          ถ้าการใช้งาน  ที่ซับซ้อนขึ้น   การชี้  "ชื่องาน" ต้องบอกให้ครบ เช่น 
          - PC นี้   เปิดใช้หน้าจอ  และ เป็น Secondary Screen (บริษัทผมเรียก กลับหน้าจอ)
          - PC นี้   User Name เปิดใช้ 3 หน้าจอ 3
          - User Name เปิด หน้าจอ ที่ 3 PC   

ภาพแสดง  "ชื่องาน"  (ดูได้ เมื่อเรียก  System Request + 3) 
ภาพแสดง  Message ที่เตือนว่า  "ชื่องาน" ทำอะไร ? เป็นอย่างไร ?

งานใน OS/400 แบ่งเป็น 4 ชนิด (เวลาถาม ให้บอกว่า คุยเรื่องอะไรก่อน)
- งานชนิด Interactive (งาน ที่ใช้ผ่านหน้าจอ)
- งานชนิด Batch (ทำงานเบื้องหลัง - ไม่มีหน้าจอ)
- งานชนิด Communication
- งานชนิด System (Message, Spool File  หรือ รายงาน, ...)

5 : Explore the System

Object = ชื่อ/คำ  (ยาว 10 อักษระ)  เช่น  ชื่อคำสั่ง, ชื่อโปรแกรม, ...
Library = ที่เก็บ (จัดกลุ่ม) Object
# โปรแกรม,File ชื่อเดียวกัน   อยู่ใน Library  2 ตัวได้ (ไม่ได้บอกว่า เป็น โปรแกรม,File  ตัวเดียวกัน ที่ Copy ซ้ำ)

Object เป็น ได้หลายชนิด  ดูชนิดได้จาก  Object Type
เช่น Program (*PGM) , File (*FILE), Job (*JOB), Device (*DEV)

ชื่อที่ไม่ควรไป  "แก้ไข"  คือ ชื่อที่ขึ้นต้นด้วย "Q","#" - เป็น Lib หรือ Obj ที่ IBM ใช้งาน
(คล้ายก้บ   การที่เราไม่ควรเข้าไปยุ่งกับ  C:\Windows)
เช่น  QSYS, QIBM เป็นต้น

การใช้ คำสั่ง

ต้องจำครับ       DspMsg  = Display Message
                         StrPrtWrt = Start Printer Writer
                         EndWrt    = End Writer
                         HldOutQ = Hold Output Queue

สังเกต ใช้อักษรย่อ 3 อักษรต่อ 1 คำ  เริ่มต้นด้วย "กิริยา"
ใช้ตัวช่วยได้ 
- Dsp*   (แสดงคำสั่งที่ขึ้นต้นด้วย Dsp)
- Go  Tape   (แสดงคำสั่งที่เกี่ยวกับ Tape)

Using Online Information

OS/400 มี Manual (คู่มือ) ที่ดีอยู่ในตัวมัน โดยเริ่มต้น กดปุ่ม [F1]
เช่น    กด [F1] เพื่อสอบถาม  หน้าจอนั้น,  กด [F1]  หรือ ป้อน ?  ที่จุดที่  สงสัย
          จะแสดง แบบย่อ และ สามารถดูเพิ่มได้

6 : Message

OS/400 (จนถึงวันนี้ยังพูดไม่ได้) จะคุยกับเราผ่าน Message เช่น  "เฮ้ย! ป้อนคำสั่งผิด" (จริงๆ ไม่มี เฮ้ยน๊ะครับ), "คำสั่งนี้ทำงานเสร็จแล้ว" , "Printer มีปัญหา-กระดาษติด" เป็นต้น

หลายกรณี OS/400 รอ การทำงานของเรา และให้เราตอบด้วย  เช่น  ใส่กระดาษเสร็จแล้ว ทำงานต่อได้  เป็นต้น

Message ที่ OS/400 ส่งไป ต้องมี  "ตู้เก็บ" Queue (เหมือนตู้จดหมาย)
มักจะสร้าง  แยกตามหน้าที่ เช่น  
    QSYSOPR          สำหรับส่งข้อความ  เกี่ยวกับ  OS เช่น Disk เต็ม, Tape ไม่ทำงาน, ...
    ชื่อ User Profile   สำหรับส่งข้อความ  ไปยังบุคคล  (ซึ่งอาจจะ ใช้พร้อมกันหลาย จอภาพได้) 
    ชื่อ จอ,WorkStation    สำหรับส่งข้อความ  ไปยังจอภาพ  (ไม่สนว่า  ใครใช้อยู่) เช่น  โปรแกรมที่เรียกใช้ที่หน้าจอ นี้  ไม่สามารถทำงานได้
    สังเกต การใช้หน้าจอ  เมื่อขอดู Msg (DspMsg) ก็จะได้เห็น Message Queue 2 ตัว (User Profile, ชื่อจอ)

ตย. Msg ที่ QSYSOPR   OS/400 มีอะไรจะบอก "มาก" (งานที่สำเร็จ และ มีปัญหา)
      ผู้ดูแล จะได้เห็นทีละ  "มากๆ"  แล้ว  ตอบ Msg (ตัวที่ OS ต้องการให้เราตอบ)


ตย. Msg ของแต่ละจอ  เมื่อสั่งดู  ก็จะเห็น "คล้ายกับ" QSysOpr แต่จะมีน้อยกว่ามาก


ตย. เมื่อ กด F1 เข้าไปใน Msg  "แต่ละรายการ"  ก็จะเห็น  คำอธิบาย และ คำแนะนำการตอบ




7. Log

ส่วนตัวถือว่า  Log ใน AS/400 น่าสนใจมาก (เยอะมาก) และ จัดได้ดีระดับหนึ่ง
Log  = รายการที่ OS/400 บอกเรา (คล้าย Message) ทั้งสิ่งที่มันทำ (Operate), งาน Security

เช่น   (เมื่อเปิดเครื่อง) เกิดขั้นตอนอะไรบ้าง  (สำเร็จ หรือ Fail - แค่แจ้งให้ทราบ / หยุดรอ)
         (ตอนนี้) มีคน SignOn เข้าระบบ
         Job  123456/User/DSP111  ถูกสั่งปิด โดย QPGMR
         พบ Error(s) ขณะทำ ...   (แจ้งให้ทราบ)
         จอ DSP222 ไม่สามารถใช้งานได้  (C R) ...  รอให้ตอบ (ยกเลิก / พยายามต่ออีกรอบ)
         - ถ้าลืม เปิดครื่อง   เปิดแล้ว  กด "R"
         File  xxx/yyy  เต็ม (C I  R 99999) ... รอให้ตอบ 
         - ยกเลิก / ข้ามขั้นตอนไป=ไม่ write,  พยายามใหม่ (ลดขนาดก่อน) , ขยายเพิ่มชั่วคราว)

มันจะทำงานแบบ "ทันที" (Real Time) - OS/400 ทำงานตลอดเวลา
ดังนั้น Log จะมีขนาดใหญ่  "มาก"  - Admin ต้องคอย "จัดการ" ไม่ให้เต็ม

การจัดการเรื่องนี้  ใช้ทรัพยากรสูงมาก - หลายบริษัทฯที่  กำลังคนน้อย,ไม่มีเวลา จะไม่สนใจทำ
(log มาก ใช้เวลา "นาน" ,อ่านไม่ทัน ,ส่วนใหญ่แค่รับทราบ, บางเรื่องก็ไม่รู้ว่า "สำคัญ" หรือไม่ ? (ต้องไปอ่านเพิ่มเติม, ...)

ตั้งแต่ ค.ศ.2017  มีกฏหมายเกี่ยวกับ Security : ใจความสั้นๆ ตามนี้
- ต้องสามารถบอกได้ว่า  มีใครเข้ามาใช้ระบบ (เมื่อไหร่)  
  ดูบันทึกย้อนหลังดูได้อย่างน้อย ... วัน 
- (เกี่ยวกับ การเงิน)  คนดังกล่าว เข้ามาใช้ ระบบ / Data อะไร ? 

A: System i Navigator

เป็น Application พื้นฐาน  แสดงเป็นรูปภาพ GUI  (Graphic User Interface เหมือน Window)
ข้อดี     สวยงาม, ไม่ต้องจำคำสั่ง ,จัดแบ่งเป็น Column , ค้นหาได้ง่าย
ข้อเสีย  (เล็กน้อย) คือ ต้องตั้งค่าเริ่มต้น (ถ้าไม่ทำ จะมองไม่เห็น) ,ทำงานช้ากว่า ,คนที่จำคำสั่งได้ จะพิมพ์คำสั่งโดยตรง (เร็วกว่า)

สำหรับทุกคน (User, System Operator, Developer, Admin)
การติดตั้ง จะสามารถ "จำกัด" สิทธิการใช้ Menu ได้  (เช่น ไม่ให้ใช้  SQL เป็นต้น)

B: ศัพท์เทคนิค  อีกสักนิด

     - Job ที่เกิดขึ้นใน OS/400    จะต้องทำงานภายใต้  SubSystem 
       ถ้าไม่ได้ตั้งค่า จะมี SubSystem ชื่อ QBase  เป็นตัวจัดการ ตัวเดียว หรือ ไม่อนุญาต
     - เครื่องสำหรับ มีผู้ใช้งาน มากขึ้น  IBM จะแนะนำให้  "แยก" ตามกลุ่มงาน และ Memory
      เช่น QBath, Qinter, QSpool, ...  เป็นต้น  เพื่อให้  "งานในแต่ละกลุ่ม" ไม่ไปแย่ง  Memory
     - เมื่อ SignOn ผ่าน  UserProfile ที่สร้างไว้ ได้กำหนด "ค่าเริ่มต้น" ของ "เส้นทาง" ไว้
       ซึ่งจะวิ่งผ่าน  Routing   เพื่อแยกไปทำงานใน SubSystem แต่ละตัว
     - รายละเอียด ที่กำหนดใน User Profile สามารถจัดกลุ่ม (อีกแล้ว) รวมเรียกเป็น Job Description (JobD)  ทำให้เราสามารถ  "set ค่าซ้ำ ให้กับ User Profile คนใหม่ได้"
     - ใน SubSystem แต่ละตัว  ก็สามารถ  กำหนดว่าจะให้ทำอะไร  ก่อน "เริ่มงาน" หรือไม่ ได้
     #พอก่อน  รายละเอียดเต็มๆ  ต้องไปดู Flow Chart - กว่าจะเกิด Job ใน OS/400

อ้างอิง
http://www.metrosystems.co.th/th/Products/Documents/Training/iSeries%20Introduction.pdf
https://www.slideshare.net/tvlooy/introduction-to-the-ibm-as400
https://www.scss.tcd.ie/SCSSTreasuresCatalog/hardware/TCD-SCSS-T.20121208.068/IBM-AS400-technical-introduction.pdf


วันพฤหัสบดีที่ 15 กุมภาพันธ์ พ.ศ. 2561

DB2/400 Advance

DB2/400 Advance

ทุก DB การจัดการจะ "เหมือนกัน" - มีแตกต่างกันใน รายละเอียด
หัวข้อนี้ จะพูดพยายาม อธิบายทางเทคนิค DB2/400 ในมุมมองทั่วไป น๊ะครับ

มาดูกันว่า  DB Engine คืออะไร ? ทำงานอย่างไร ?
งานพื้นฐาน
- DB ถ้าแค่มีหน้าที่  "จัดเก็บ"  เท่านั้น 
- เขียน SQL แค่นี้   Select *  from  lib.File   (ไม่มีอะไรต่อท้าย)
DB จะทำงานไม่ต่างจาก Text File  (ไม่ต้องซื้อ DB มาใช้)

DB Engine

ในการใช้งานจริง  เราทำมากกว่านั้น  และ  ต้องการ "ความรวดเร็ว"
DB Engine จึงถูกนำมาช่วยทำงาน

DB Engine คือ ชุดโปรแกรมที่ทำงานเบื้องหลัง "ตลอดเวลา"
สำคัญหรือไม่ ?   คงได้ยินว่าเราต้องซื้อ Server เฉพาะสำหรับ DB เลย
แสดงว่า  มันทำงานหนักมาก  ใช้ทั้ง CPU,RAM


ภาพแสดง  จัดการ DB Engine ที่แยก กลุ่ม RAM (Pool)  
ทำงานหนัก หรือ เบา  ดูจาก (Page ถูกเรียกใช้บ่อยแค่ไหน) 


งาน-1 : เมื่อบันทึก ข้อมูล  ลง File,Table 
- มันจะวิ่งไปหา   พื้นที่ว่าง (Disk) และ  สร้างตัวเชื่อมต่อกับ  ข้อมูล row สุดท้าย (link)
  (ไม่ขออธิบาย ระดับลึกกว่านี้น๊ะครับ  มันเยอะไป)
- มันจะสร้าง Run No ให้ประจำ Row  เรียก RRN หรือ  Relative Record Number
  Tip ใน SQL บางครั้ง  ใช้ เพื่อดูว่า  Row ไหน เกิดขึ้น ก่อน/หลัง

เพิ่มสักนิด  ข้อมูล 50,000 rows   การ "ค้นหา" ไปที่ rows สุดท้าย - ค้นหา 50,000 ครั้ง ?
      เพื่อความรวดเร็ว   ข้อมูลจะถูกจัดเป็นกลุ่ม เรียกว่า "Page" (เช่น 1 Page เก็บข้อมูลได้ 4K เป็นต้น) 
      ถ้า 1 row มีขนาด 4 byte  (คิดง่ายๆ) 1 Page จะเก็บข้อมูลได้  1,000 Rows  = จะเกิด 50 Page
      การ "ค้นหา" ข้างต้นจะทำแค่ 50 ครั้ง (ตามจำนวน Page) เท่านั้น  = "เร็วขึ้นมาก" (ว๊าว คิดได้ไงเนี่ยะ)

      แต่ ... ต้องแลกมาด้วย   ทำงานเพิ่มเล็กน้อย
       - จัดการ Page ตรวจถ้า Page  เต็มต้อง  "สร้าง Page ใหม่" ตัวชี้

      เมื่อมีอะไร  "ดี"  ย่อมมีอะไร  "ยุ่ง"  ตามมา  ต้องจัดการ
       - เมื่อลบข้อมูล 1 row  Page ก็จะเกิด "ที่ว่าง"
             ถ้าแต่ละ Page มี "ที่ว่าง" มากไป  จะเสียพื้นที่มาก
             ถ้าให้มัน  "ค้นหา" ในทุก Page ก็ "ช้า"
             >> ถ้าต้องการให้ มันจัดการพื้นที่  ก็ต้องสั่ง "ลดขนาด"   RgzPFM, Shrink, Compact ,...
             คุ้นๆมั๊ยครับ Admin ขอหยุดการใช้งาน 8 ชม. เพื่อ "ลดขนาด" 
             (ธนาคาร หยุดให้ใช้ internet Backing แค่ 8 ชม. ปีละ 3 ครั้งเท่านั้น - ลูกค้า  รับได้มั๊ย ?)

       - File ประเภท DataWareHouse (จำนวน row มหาศาล, ไม่มีค่อย  มีการลบข้อมูล)
         น่าจะปรับ ขนาด Page ให้  "ใหญ่"   (Admin อาจจะมองจัดการอีกระดับ เรียก ทำ Partition)

งาน-2 : เรียงข้อมูล ,"ค้นหาได้เร็ว"

- เขียน SQL ที่มี  Keyword = Order By 
        Select *  from  lib.File  Order By ...

  ทั่วไป  (ไม่จัดการอะไร)   การเรียงลำดับ จะเกิดขึ้นใน  Memory
        ข้อมูล 50,000 rows  เรียก SQL หลายเครื่องพร้อมกัน  Memory  ที่มี ทำงานได้เร็วพอมั๊ย ? 
        >>  ช้าก็  ซื้อ RAM เพิ่มซะ ... (แพง + ใส่จนเต็มแล้ว)
        >>  จัดการ ที่ DB Admin 
               เช่น ให้สิทธ์/แบ่งเวลากันใช้, ข้อมูลใช้บ่อย ให้มันจำไว้ และ เรียกใช้ซ้ำผ่าน Cache

  จัดการ ด้วยการสร้าง "Index"  (โดย DB Admin)
       DB Engine จะสร้าง Table ใหม่  "ที่เรียงข้อมูล"  ตามที่กำหนดไว้  (เช่น เรียงตาม InvoiceNo,Seq)
       เมื่อข้อมูลถูกบันทึก/แก้ไข  ก็ต้องมาทำกับ Table ใหม่นี้ด้วย

  ตย.  ระบบงาน  มีเรียกใช้   SQL   Lib.FileP  Order by Invoice,Seq  บ่อยๆ
  ให้สร้าง   Index  Lib.FileL1  ที่เรียงตาม   Invoice,Seq 
      (หลักการ Index จะเก็บแค่ RRN จาก P-File เท่านั้น)
  ทุกครั้งที่  บันทึก/แก้ไข  - DB Engine จะเพิ่มงาน  ไป "เรียงลำดับ"  ใน Index File ใหม่

   Q: ถ้าอย่างนั้น  ก็สร้างไว้ "เยอะๆ" ซิ  เรียกใช้เร็วดี
   A: ถ้าเข้าใจการทำงาน ด้วย -  Index  มีข้อเสีย  ชัดๆหลายเรื่อง (DB Admin จะเห็น)
        เช่น  มันทำงานหนักกว่า  ปรกติ    (5 P-File อาจจะสร้าง Indexไว้ 
                Dev จะมองว่าถ้า SQL Order By แล้วช้า  "ให้สร้าง Index ก็จะเร็ว"
                - Dev เขียน SQL ไว้  15 ตัว = ก็จะสร้าง Index ไว้ 15 ตัว
                DB Engine   ต้อง เพิ่ม(เสีย)เวลาทำงานกับ Index 15 ตัว 

Table ในระบบมี  500 File  อาจจะมี Index มากกว่า 5,000 File (ไม่ใช่ เรืองเล็กแล้ว)
ในขณะที่  "ความจริง"  Index ที่  "ต้องสร้าง"  อาจจะแค่  2-3 ตัวเท่านั้น
>> ถ้าระบบงานขนาดใหญ่  จึงต้องมี DB Admin  ตรวจ และ สร้าง Index
>> โดยใช้เครื่องมือ เช่น  Query Profile  บันทึกว่า  ช่วงเวลานี้   มีใครเรียกใช้ SQL อะไรบ้าง ?,เรียกถึ่แค่ไหน ?  ใช้เวลา "รอ" นานมากแค่ไหน  -> จำเป็นต้องสร้าง Index หรือไม่ ?
       
ภาพแสดง 1 Physical File มี Index (L-File) 9 ตัว
Index File บางตัว  ขนาดใหญ่  พอๆ กับ Physical File เลย

- ใช้ประโยชน์ จาก Index ต่อยอด  ใน   SQL ที่มี  Keyword = Where 
        Select *  from  lib.File  Where ...
  ถ้าพบว่า  Field ที่อยู่ใน  Where   มันเรียงลำดับ  เป็นส่วนหนึ่งใน  Index
  SQL นี้จะเรียกใช้  Index File

มาดูลึกๆ กันสักนิด

- การค้นหา  จะมีหลายเทคนิค  แต่ละ DB Engine ก็จะเลือก/พัฒนา  เพื่อให้ทำงานให้เร็วที่สุุด
  รายละเอียดลึกๆ มักเป็น "ความลับ" หรือ อ่านแล้วไม่รู้เรื่อง
- ที่เรียนมา คุ้นๆกัน  ได้แก่  Binary Tree - การค้นหา จะทำทีละครึ่ง (ด้านซ้าย หรือ ขวา) 
  เช่น จะค้นหา รหัสพนักงาน=450 จาก 1000 คน มันก็จะค้น ในกลุ่ม 1-500 เท่านั้น 
              ไม่เสียเวลาค้นในกลุ่ม 501-1000
         ใน 1-500 ยังแยกเป็น  1-250 กับ 251-500  มันจะค้นในกลุ่ม 251-500 เท่านั้น
         ...
         ดังนั้น  Page จะถูกจัดกลุ่ม ด้วยว่า  อยู่กลุ่ม 1-500 หรือ 501-1000  เป็นต้น

ลองอธิบาย  แบบชาวบ้าน  ให้  "เข้าใจและจัดการ" กันเองได้
  การ "ค้นหา" มี 2 แบบ คือ
  - ข้อมูล "น้อย"  ไม่ต้องสร้าง Index  ก็ทำงานเร็ว  (DB2/400 เรียก Table Scan)
            กลายเป็นว่า  ถ้าไปสร้าง Index  เครื่อง ก็จะทำงานหนักเกินไป
  - ข้อมูล "มาก"  ต้องสร้าง Index
            ถ้าไม่สร้าง Index  เครื่อง ก็จะทำงานหนักเกินไป

คนที่ต้อง "สร้าง Index"  ต้องคำนึงถึงรายละเอียดข้างต้น  ด้วย  (เริ่มเยอะ)

ภาพแสดง ตัววิเคราะห์การทำงานของ DB Engine

System i Navigator : Visual Explain






เป็นเครื่องมือ  ที่แสดงให้เห็น  DB Engine ทำงานอย่างไร  (เมื่อป้อน SQL)
ตย.ข้างบน 
- ภาพส่วนบน คือ  DB Engine  เรียกใช้  Index (มีกุญแจ) - Where ผมใส่ Field ที่ระบุใน Index File
- ภาพส่วนล่าง คือ  DB Engine  ไม่เรียกใช้ Index - Where ผมใส่ Field ที่ไม่ระบุใน Index File

การเขียน SQL ที่ดี คือ พยายามเขียนให้  "มันเรียกใช้ Index"
เขียน SQL เรื่องเดียวกัน  เขียนได้หลายแบบ  แบบไหน เร็วที่สุดล่ะ

ตย.  SQL 2 แบบนี้ ถ้าให้ผลลัพธ์เหมือนกัน   แบบไหน  "เหมาะที่สุด"
    Select  A.*  b    From  Lib.A  as A
    Left join  Lib.FileB on ...
กับ
    Select  A.*  ,(Select  b from Lib.FileB where ...)  From Lib.A

>> ความเร็ว ของการแสดง   จะดูจาก  "เวลารวมที่ใช้ไป"

ดูลำดับการทำงานของ DB Engine

a. File อะไร ?  กรอง Row หรือไม่   (ถ้ามี   Where เรียกใช้  index  จะเร็ว)
      >> จำนวน Row  หลัง  "กรอง"  ควรจะ "น้อย" 
              เช่น FileA  ได้  200 rows จาก 10,000 rows,  FileB  มีแค่ 50 rows
b. (ผลลัพธ์)  ไปทำอะไร ต่อ
    ทุกๆ FileA  1 rows ต้องไปหารายการที่ตรงกันใน FileB
     - ถ้าไม่มี Index ก็เท่ากับว่า  มันอาจจะ  "ทำงาน" มากสุด  200*50 = 10,000 ครั้ง
     - ถ้ามี Index   มันอาจจะ  "ทำงาน" มากสุด  200 + 200 (ค้นหา) = 400 ครั้ง
    เชื่อมต่อกับ FileA กับ FileB แบบ 1 ต่อ 1  จะได้ผล 200 rows
    เชื่อมต่อกับ FileA กับ FileB แบบ 1 : many  อาาจได้มากสุด=10,000 rows

c. (ผลลัพธ์)  ไปทำอะไร ต่อ
     Where กรองต่อ (ต้องอ่าน/ตรวจ เท่าจำนวน)
d. (ผลลัพธ์)  ไปทำอะไร ต่อ
     Order by (จุดนี้  จะเรียงใน Memory)

จากข้างต้น การลดจำนวน Row (ก่อน), การใช้ Where ที่อ้างอิง Index จะทำให้ "เร็ว"
บางกรณี ทดลองแล้วพบว่า  DB Engine มีสภาพดีมาก ไม่จำเป็น (เสียเวลา) ทำข้างต้น
ส่วนตัว  ทำ/คิด ตามลำดับ