วันพฤหัสบดีที่ 17 มีนาคม พ.ศ. 2559

Download AS/400 file to Excel

Download AS/400,iSeries file to Excel

ทำผ่าน IFS (Integration File System)

มีหลายวิธีที่ทำได้  ครับ ที่ผมใช้บ่อยคือ  ข้อ 1,3
1. ใช้ Excel : MS Query  ดึงข้อมูลโดยตรง  ... วิธีนี้เหมาะกับ Developer มาก
         Excel  > Data > From Other Sources > From Microsoft Query
         (สร้าง ชื่อที่ชี้ไป AS/400   Data Source ใน ODBC)
         Tip : ผมจะ  ยกเลิก  ไม่ใช้ Query Wizard (Cancel)   แต่ใช้ MS Query (ํYes)
         Tip : ผมจะ  เขียน SQL ใน iSeries Navigator ก่อน - ตรวจ Syntax ได้ดีกว่า

2. ทำผ่าน IFS (Integration File System)  ... วันนี้จะอธิบายตัวนี้

3. start > IBM i Access for Windows > Data Transfer from IBM i
         วิธีนี้ ทำเสร็จจะ save โครงสร้างไว้  ... เหมาะกับ  "ทำซ้ำ"  (โดย User)


ออกตัวก่อน   หัวข้อ 2  นี้  ผมทำไม่ผ่าน  (เกิดจาก ระบบ Security  ในบริษัทฯ)
ถ้า  บริษัทฯไหน  ที่ไม่  ติดปัญหา Security   น่าจะทำได้ และเป็นอีกตัวเลือก ที่เลือกใช้ได้ครับ

IFS คืออะไร

ในภาพของผม  มันคือ  การทำให้ AS/400,iSeries เป็น Drive ที่ PC มองเห็น
      = ใช้ Disk บน AS/400 ... ผมไม่ค่อยเห็นด้วย เพราะ Disk บน AS/400 ราคาแพงไป
แต่ถ้ามอง  เป็นเส้นทาง  ส่งต่อ File  ก็นับว่า  เป็นอีกตัวเลือกที่ดี
สำคัญมาก    file ในนี้ AS/400,iSeries   ไม่สามารถเรียกใช้ได้โดยตรง จาก PC
      (การจัดเก็บต่างกัน)  ต้องมี  "ขั้นตอน" โอนแปลงชนิด file

ขั้นตอน (แบบย่อ)

1. สร้าง Folder IFS  ใน AS/400,iSeries + กำหนดให้ Share
    หัวข้อนี้ ผมไม่เชี่ยวชาญ น๊ะครับ  แต่ในนี้อธิบายไว้ครบ

      คลิกขวา > เลือก New Folder
       
    สังเกต เปลี่ยนค่า *default เพื่อลดปัญหา Security

    อ้างอิง  http://www.rpgpgm.com/2014/09/how-to-map-ifs-folder-as-windows-share.html

2. cmd  CPYTOIMPF   ไปที่  Folder IFS ที่สร้างไว้
    อ้างอิง   http://www.itjungle.com/fhg/fhg010913-story01.html

    CPYTOIMPF FROMFILE(MYLIB/ITEMS)  
              TOSTMF('/Sarayut/Items.csv')
              RCDDLM(*CRLF)  ADDCOLNAM(*SYS)

    ตย.ผลลัพธ์ ใน Items.csv
        ITEM_NO,ITEM_00001,ITEM_PRICE  
        1          ,"Whirlpool Washing Machine",750.0000
        2          ,"Whirlpool Dryer (Gas)",775.0000
        3          ,"Maytag Dishwasher",600.0000

    ปรับรูปแบบได้  เช่น เปลี่ยน/เพิ่ม อักษร ลงท้าย เป็นต้น

3. Windows Explorer : Map Network Drive ไปที่ Folder IFS

     ระบุไปที่    //AS400 server name/Folder ที่สร้าง)
          
    จุดนี้  copy File ไปใช้ หรือ เปิดโดยตรง ก็ได้ครับ

ผมพบปัญหาคือ Access Deny  (ในการใช้ในส่วน AS/400 IFS)
น่าจะเกิดจาก สิทธิ ของการเข้าใช้ IFS

วันอังคารที่ 15 มีนาคม พ.ศ. 2559

Rename Field while Running RPG/400

การเปลี่ยนชื่อ Field ใน RPG ILE
    มีแนะนำใน Internet มาก- หาได้ง่าย ... ไม่ขออธิบายน๊ะครับ
แต่การเปลี่ยนชื่อ Field ใน RPG/400 หาได้ "ยากกว่า"

การใช้งาน + ปัญหาที่พบ

- มีการใช้หลาย File ที่มี Write,Delete,Update  ชื่อ Field  "ซ้ำกัน" 
  ตย.1  File = Order     มี   field ORDER
            File = Invoice   ก็มี field ORDER

  ตย.2  จะลบข้อมูลที่ซ้ำ (ด้วย RPG/400)  โดยเลือก เปิด L-File 2 ตัว
           L-File ตัวแรก  ชี้จุดเริ่มต้น   
           L-File อีกตัวใช้   ตรวจและ "ลบ"

- ปัญหาที่พบ คือ  หลัง compile ตัวแปรทั้ง 2 จะใช้  พื้นที่  "ร่วมกัน"  
          ตัวแปรจะ  จะเก็บค่า  "ล่าสุด"  ไว้เท่านั้น 
          ถ้าเผลอนำค่านี้  ไปชี้เพื่อ  Write, Update, Delete จะ "ผิด"
                จะพบปัญหา  เมื่อ  ใช้เทคนิคเขียน code แบบสั้น (จัดการ file แบบง่าย)
                             มาเขียนงานที่เริ่มซับซ้อน  (ใช้ย่อ แบบผิดประเภท)

ทางแก้ไข

- ย้ายค่า ตัวแปร ไปเก็บที่อื่น แล้ว ย้ายกลับมา
          ไม่เหมาะ ถ้ามีจำนวน Field มาก  (เริ่มยาว)
- สร้าง Logical File ใหม่   โดย rename ใน Logical File 
          ไม่เหมาะ ถ้า file ขนาดใหญ่ (Index นาน) แต่ใช้งานชั่วคราว
- เปลี่ยนชื่อ Field ใน File ขณะ Run

วิธีการประกาศ

+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 .
 Ircd-fmt                                                 
 I              old-field                       new-field 

ตัวอย่าง

ข้อมูล Logical File (ข้อมูลเรียงตามนี้)

RPG เปิดใช้ ทั้ง 2 Logical File  โดยชี้ไป   ต่าง Row

FSQL010L1IF  E           K        DISK                    
FSQL010L2IF  E           K        DISK                    
 *------------------------------------------------------* 
ISQL010R1                                                 
I              L1EPNO                          AAEPNO     
I              L1EDUC                          AAEDUC     
 *------------------------------------------------------* 
C           KL114     KLIST                               
C                     KFLD           PLAC    2            
C                     KFLD           DIVI    2            
C                     KFLD           OPEC    2            
C                     KFLD           EPNO    6            
C           KL214     KLIST                               
C                     KFLD           PLAC                 
C                     KFLD           DIVI         
C                     KFLD           OPEC         
C                     KFLD           EDUC    1    
C                     MOVEL'T2'      PLAC         
C                     MOVEL'72'      DIVI         
C                     MOVEL'11'      OPEC         
C                     MOVEL'D'       EPNO         
C           KL114     CHAINSQL010L1             80
C                     MOVEL'1'       EDUC         
C           KL214     CHAINSQL010L2             80
C           *IN80     IFEQ '0'                    
C                     END                         

ดูค่าจากการ Debug (StrISDB)
     ตัวแปร  AAEPNO, AAEDUC แสดงค่า แตกต่างกันกับ  L1EPNO,L1EDUC

วันอาทิตย์ที่ 28 กุมภาพันธ์ พ.ศ. 2559

มาแล้ว SQL Editor แบบ GUI

หลังจากต้องใช้ iSeries Navigator เขียน SQL สำหรับ DB2/400 มานาน
ต้องบ่น เกือบทุกครั้งว่า ทำไม ไม่มี GUI ดีๆ มาช่วยเลยน๊ะ


เคยลอง  ค้นหา ทางเลือกอื่น มาระยะหนึ่ง  ก็จะพบแต่  ต้องซื้อเพิ่ม : P

ในที่สุด  ก็พบ   IBM Data Studio   มาช่วยเขียน SQL  ... ค้นพบโดยบังเอิญ

ข้อดี
- ฟรี
- S/W ใหม่ๆ ติดตั้ง "ง่าย" (ไม่งอแง)
- การเรียนรู้  ใช้เวลาสั้น  แต่ถ้าได้อ่านสักนิด ก็จะดีครับ
- เพิ่ม สีสัน (ทำให้อ่าน/แยก SQL ได้ง่ายขึ้น)
- เห็น File/Field ในหน้าต่าง  ดูเป็นสิ่งเล็กๆ ที่ช่วยได้มาก
- มีตัวช่วย แสดงตัวเลือก  ชื่อ Field หรือ คำสั่งใน SQL .., Microsoft เรียก intellisence
- เก็บประวัติ + เรียกใช้ซ้ำ (เดิม ต้อง save เก็บไว้เอง)


ข้อเสีย
- เปิดใช้ 5 ครั้งจะเปิดไม่ได้ 1 ครั้ง (มี Error ให้อ่านใน Log...บลาๆๆ  สักพักเปิดใหม่ก็ได้)
       อาการเดียวกับ  หัดใช้ IBM Rational Rose แรกๆ
       มีคนอธิบายว่า ตัวนี้เขียนด้วย Java ทำให้ ต้องการ RAM มากๆ
- (ยังไม่คุ้น)
    # เดิมแสดง  ข้อมูลผลลัพธ์ เลย
       ตัวนี้จะแสดง สถานะ  ใช้เวลาเท่าไหร่ ก่อน  (ต้อง เพิ่ม กด Tab: Result เพื่อดู)
    # เดิมมีมี Error cursor จะชี้จุดที่ผิด  (หลายครั้งแนะนำ ตำแหน่งที่ถูกที่ให้)
        ตัวนี้  ต้องหาเอง
    # ลากชื่อ field  มาใส่ใน SQL (ทำไม่ได้)

ยังมีข้อดี  อีกหลายตัว  แล้วแต่ผู้ใช้งานน๊ะครับ
เช่น  ตัวช่วยทำ Migration = การย้าย file หรือ เปลี่ยน ระบบ DB เป็นต้น

ส่วนตัว ก็สรุปว่า น่าใช้งานครับ
ลองไปใช้ดูครับ

เอาไว้วันหลังจะไกด์ step by step ในงานแต่ละเรื่องให้ดูครับ

ปล. ผมใช้งาน MS SQL Server บางเรื่องอยู่ ทำให้เปรียบเทียบได้ระดับหนึ่งน๊ะครับ

วันพุธที่ 22 กรกฎาคม พ.ศ. 2558

Tip:SQL Read File (many Member)

Tip:SQL Read File (many Member)

CREATE ALIAS    QTEMP.myALIAS    FOR     LIB.QRPGSRC (PGM1)
SELECT   QTEMP.myALIAS
DROP ALIAS      QTEMP.myALIAS

File ใน DB2/400  (มีโครงสร้าง พิเศษ) สามารถจัดเก็บ 1 File ได้หลาย Member

ตย. Source Code (เช่น QRPGSRC, QDDSSRC)  ที่เก็บ RPG, Physical,Logical,Display File
ตย. File ที่ IBM มักจะแนะนำให้ใช้  คือ  File Monthly แยก Member ตาม ปี/เดือน เป็นต้น
       (ไม่เหมาะกับ SQL)

คำสั่งมาตรฐาน SELECT  ไม่มี  Syntax ที่ใช้อ้างอิง โครงสร้างพิเศษ ข้างต้น
ต้องสร้าง  object  ที่ระบุ Member เจาะจง   รู้จักกันในชื่อ   ALIAS

ชุดคำสั่งข้างบน ทำให้อ่าน Member ที่เจาะจงได้
(เรียกใช้งานได้ใน iSeries Navigator)

ตย. ใน DotNet : ต้องการสร้าง Class เกี่ยวกับ Database โดยสร้างจาก DB2
       ณ.วันนี้ (2015/07/23)  ยังไม่มีเครื่องมือช่วยสร้าง

       บน DB2        LIB.QDDSSRC  (myFile)  จัดเก็บลักษณะนี้

              R  MYFILER1
                 FLDA        10    COLHDG('FIELD-A')
                 FLDB         8    COLHDG('FIELD-B')
                 ...  
                                  มีประมาณ 30-50 field

       บน  DotNet  ต้องสร้าง  code ลักษณะนี้ (ตย. แบบย่อ)

              Class myFILE
                  Property  FLDA  as  String
                  Property  FLDB  as  String
                  ...

                  Sub GetData  (byVal myID as String)
                      '...SQL to DataTable
                      Loop  Data Table
                           FLDA = dt.FLDA
                           FLDB = dt.FLDB
                           ...
                      End loop
                  End Sub
              End Class

               ถ้าต้องทำ  1-2  File - เปิด Editor แล้ว Copy / Paste  เร็วที่สุด
               แต่ถ้าต้องทำ มากกว่า  5 file แต่ละ File มี Field มาก     ลองสร้าง Tool
               สังเกต  Code สีชมพู  (ที่มีลักษณะแน่นอน)

Code สีชมพูดในส่วนที่ 2 ทำง่ายกว่า ครับ

Select srcdta
      ,substr(srcdta,19,6) || ' = dt.' || substr(srcdta,19,6)
From qtemp.myAlias 
Where substr(srcdta,7,1)<>'*' and substr(srcdta,17,1)=' ' 
  and substr(srcdta,19,6)<>'      '

SQL Result
     A            MXOPEC         2          COLHDG('OPEC CODE')                  MXOPEC = dt.MXOPEC
  ++ A            MXCOMC         1          COLHDG('COMC CODE')                  MXCOMC = dt.MXCOMC

Code สีชมพูดในส่วนที่ 1 เพิ่มรายละเอียด ครับ
Select srcdta
      ,' Property ' || substr(srcdta,19,6)
       || Case Trim(substr(srcdta,36,2)) 
             When '  ' Then ' As String'
             Else ' As Float'  End 
       || ' '' ' 
       || Replace(Replace(Trim(substr(srcdta,44,30)),'COLHDG(''',''),''')','') 
From qtemp.myAlias 
Where substr(srcdta,7,1)<>'*' and substr(srcdta,17,1)=' ' 
  and substr(srcdta,19,6)<>'      '

SQL Result
     A            MXTYCD         5          COLHDG('TYPY CODE')                 Property MXTYCD As String ' TYPE CODE
  C  A            MXTYPE        25          COLHDG('TYPY')                       Property MXTYPE As String ' TYPE
     A            MXWEIT         7  3       COLHDG('WEIGHT')                     Property MXWEIT As Float ' WEIGHT
     A            MXODOW         7  4       COLHDG('O/W')                       Property MXODOW As Float ' O/W

Reference
http://search400.techtarget.com/tip/Using-SQL-on-System-i-to-color-source-code-and-inline-comments

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

Download Spool File to PC

Download iSeries : Spool File to PC

เป็นงานประเภทหนึ่ง ที่ต้องทำกัน  มีทางเลือกในการทำหลายแบบ  เลือกตามความถนัดครับ

1. ใช้ iSeries Navigator  ลาก  แล้ววางลง Folder เลย
2. ใช้ CPYTOIMPF
3. เขียนโปรแกรม

1. ใช้ iSeries Navigator  ลาก  แล้ววางลง Folder เลย

    a. เปิด iSeries Navigator 
    
 
    b. เลือก iSeries (AS/400, Server) กรณีที่คุณมีหลายเครื่อง
    

    c. เปิด OutQ ที่เก็บ Spool
        AS/400 (Server) > Basic Operation > Printer Output
        * OutQ ที่เห็น  จะ *Default  ตาม UserProfile ที่ Sign On
    
        เปิดดู Spool    โดย Double Click หรือ Right click > Open

         Drag (ลาก) Spool File ที่ต้องการ  Drop (วาง) ไปที่ PC:Desktop หรือ Folder ปลายทาง
         หรือ Spool File + Right Click > Copy   แล้วไปที่ Folder + Right Click > Paste

         ถ้าต้องการเปลี่ยน OutQ
              Printer Output + Right Click > Customize this View > Include > ป้อน OutQ ที่ต้องการ
         

        สังเกต  เลือก Spool File + Right Click > มีตัวเลือก Convert to PDF

2. ใช้ CPYTOIMPF

    ขออภัยครับ  ผมแสดงให้ดูไม่ได้   (เข้าใจว่า) ที่ AS/400 ต้องซื้อ (ติดตั้ง) Integrate File System  (โหมดที่เปลี่ยน AS/400 เป็น Folder ที่ PC ทั่วไปมองเห็น)  หลายคนจะคุ้นเคยกับชื่อ copy document

3. เขียนโปรแกรม  

    โดยใช้เทคนิค Copy Spool File เป็น Physical-File ก่อน แล้วจึง Download ลงมาผ่าน ตัวเลือก (บน Client Access) หรือ RTOPC cmd
ตย. 
    0. สร้าง WorkFile  
CRTPF FILE(SARAYUT/A)      RCDLEN(200)   
    1. CPYSPLF FILE(QSYSPRT) TOFILE(SARAYUT/A) JOB(241844/USNADS/QPRTJOB
        ระบุ  Spool File ต้องระุบ   เต็ม  Spool file name +  (Spool File No.) +  Job No/User/Job
    2. คำสั่ง download  to PC
        จาก Client Access  (ใช้เพื่อสร้าง โครงสร้าง .fdf ก่อนเขียนโปรแกรมเรียกใช้)
        จาก Start > program
        จาก Command  (เขียน Batch โปรแกรมได้)










วันอังคารที่ 16 ธันวาคม พ.ศ. 2557

รวม DB2 SQL Technique

รวม DB2 SQL Technique


  • ตรวจค่าเป็น Null
  • เลือกแสดงข้อมูลชุดแรก เช่น 10 แถวแรก
  • เพิ่ม col. RunNo หรือ Sequence
  • อ่าน BOM File
  • iSeries Navigator : เรียกใช้ CL command

ตรวจค่าเป็น Null

ปรกติใช้  ตรวจหลัง Join (ไม่พบ จะได้ค่า  Null)
ซึ่งมักจะพบกับการใช้  LEFT JOIN     (ไม่ใช่  LEFT INNER JOIN)

กรองค่าด้วย
WHERE   field1 IS NULL
WHERE   NOT   field1   IS NULL

ตรวจสอบค่า เขียนได้หลายแบบ

IFNULL(field1,0) as field1
ถ้าเปลี่ยนเป็น T-SQL ใช้  Coalesce(field1,0) as field1

หรือ เขียนแบบ"ยาว"
CASE WHEN    field1 IS NULL   THEN   0   ELSE   field1  END  AS field1

เลือกแสดงข้อมูลชุดแรก เช่น 10 แถวแรก

SELECT   field1,field2    FROM    lib.file   FETCH FIRST 10 ROWS ONLY

เพิ่ม col. RunNo หรือ Sequence

SELECT    field1,field2 ,ROW_NUMBER() OVER () as Seq    FROM  lib.file   ORDER BY field1

      field1    field2
      A         aaa
      B         bbb
      C         ccc
      D         ddd
      E         eee

เลือกแสดงข้อมูลชุดแรก เช่น 10 แถวแรก
SELECT   field1,field2    FROM    lib.file   FETCH FIRST 10 ROWS ONLY
หรือ
SELECT   * FROM
(SELECT    field1,field2 ,ROW_NUMBER() OVER () as Seq    FROM  lib.file   ORDER BY field1
) as F1
WHERE   Seq < 10

seq   field1    field2
1     A         aaa
2     B         bbb
3     C         ccc
4     D         ddd
5     E         eee

เลือกแสดง  10 ตัวถัดไป  (Top 10)
SELECT   * FROM
(SELECT    field1,field2 ,ROW_NUMBER() OVER () as Seq    FROM  lib.file   ORDER BY field1
) as F1
WHERE   Seq > 10

อ่าน BOM File

BOM ปรกติต้องสร้าง File/Field ในลักษณะนี้
Parent Child
A a1
A b1
A c1
A d1

a1 a21
a1 a22
c1 c21
c1 c22

c21 d1 (ใช้ d1 ซ้ำ)

BOM File จะต้องแสดงผลอย่างน้อย 2 แบบได้
#1 แสดงโครงสร้าง
lvl-0 lvl-1 lvl-2 lvl-3
A a1 a21
a22
b1
c1 c21 d1
c22
d1

SQL ธรรมดา  จะไม่สามารถ  แสดงแบบข้างต้นได้

#2 แสดง  การใช้วัตถุดิบ รวม (ข้อมูล Node สุดท้าย ของแต่ละโครงสร้าง)
lvl-0 รวมวัตถุดิบ
A a21
a22
b1
d1 (รวม 2 ตัว)
c22

SQL ธรรมดา  จะไม่สามารถ  แสดงผลได้

ตย. การสร้างให้ผลลัพธ์  ของสินค้า "A"  พร้อมที่จะนำไปใช้กับ  #1

WITH   RPL(level, fParent, fChild, Path) AS
  (      SELECT 1, fParent  ,fChild  ,TRIM(fParnet) || '\ ' || xChild as Path
          FROM   lib.file   AS  root
          WHERE   fParent='A'

         UNION ALL

         (   SELECT xParent.level+1, xChild.fParent, xChild.fChild
, Trim(xParent.Path) || '\ ' || xChild.fChild   as Path
              FROM  RPL  as  xParent

          INNER JOIN  
(SELECT fParent, fChild  FROM   lib.file 
                         WHERE  fParent  <>  'A'
                ) xChild
             ON xParent.fChild = xChild.fParent  
          )
  )
SELECT  fParent, level, fChild  ,Path   FROM RPL  ORDER By Path;

ผลลัพธ์
Parent Level Child Path
A 1       a1      A\a1
a1 2       a21     A\a1\a21
a21 3 a22     A\a1\a21\a22
A 1 b1      A\b1
A 1 c1      A\c1
c1      2 c21     A\c1\c21
        c21     3 d1      A\c1\c21\d1
c1      2 c22     A\c1\c22
A 1 d1      A\d1

คำอธิบาย
- ใช้  เทคนิค กำหนดตัวแปร  WITH
        RPL( .. , .. ,.. ) ตัวแปร ชนิด data set (ไม่ใช่ ค่า)
- ใช้  เทคนิค Recursive (เรียกตัวมันเอง)  RPL ถูกเรียกใช้ในตัวมันเอง
มี 2 ชุด
- ตัวแรก เฉพาะ Main Root ออกมา ต้องระบุ  ค่าที่จะค้น
- ตัวที่ 2  จะเรียกใช้  "ตัวมันเอง"
- Path ช่วยในการเรียง และเห็นภาพ

iSeries Navigator : เรียกใช้ CL command

เทคนิคนี้ Developer ที่ทำหน้าที่ Admin ด้วย  จะใช้งานบ่อยครับ
สั่ง CL Cmd แล้วให้แสดงผลลัพธ์เป็น file แล้วนำมา process ต่อ
ตย. ต้องการดู file  10 ตัวแรกใน Lib = Sarayut


วันอังคารที่ 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 แล้วครับ