Author: theerayuth.p

  • Query ที่ใช้งานบ่อยๆสำหรับทำ ETL , Data Warehouse และ Data Science ตอนที่ 1

    สายงานดึงข้อมูลเพื่อใช้สำหรับวิเคราะห์ข้อมูล แปลงข้อมูล จัดรูปแบบข้อมูลต่างๆไม่ว่าวัตถุประสงค์ที่จะทำ ETL, Data warehouse , Data Science, Data Lake สิ่งที่จะเกิดขึ้นบ่อยๆคือ

    • การจัดกลุ่มข้อมูล ROW_NUMBER(), RANK(), DENSE_RANK()
    • การแปลงข้อมูล CAST,CASE
    • การสร้าง View, Sub Table, temp table, Material View ,select ซ้อน select หลายชั้น (with)

    การทำงานด้านนี้จะแตกต่างจากการดึงข้อมูลในการทำงานแบบ CRUD (Create, Read, Update, Delete) เป็นงาน Transaction เน้นการทำงานที่เร็วอย่างมีประสิทธิภาพ ส่วนการวิเคราะห์ข้อมูลลืมเรื่อง Performance ไปได้เลยส่วนใหญ่คำสั่งที่ทาง Transaction Performance ต้องการให้เราหลีกเลี่ยงเราก็จะได้นำมาใช้งานอยากสนุกสนาน
    เนื่องจากตอนนี้ผมดึงข้อมูลจาก Oracle Database เป็นหลักก็เลยขอเขียนตัวอย่างของ Oracle ก่อนนะครับ ต่อไปค่อยเพิ่มเติม Database อื่นๆต่อไป

    การจัดกลุ่มข้อมูล

    พื้นฐานสุดๆที่รู้ๆกันคือการทำด้วยคำสั่ง Group By เช่น
    ถ้าเราต้องการค่าเดียวจากตารางเลย select sum(a) from table_a แบบนี้ก็จะเป็นการ Group ข้อมูลทั้งตาราง
    ถ้าต้องการมีตัวแยกข้อมูลก็จะเป็น select column_a,count(*) from table_a group by column_a แบบนี้ก็จะมีตัวช่วยแบ่งกลุ่มข้อมูลออกมาแล้ว
    แต่การทำงานจริงไม่ได้ง่ายดายขนาดนั้น เช่น โจทย์ต้องการเอาค่าที่มากสุด น้อยสุดหรือล่าสุดของข้อมูลในตารางโดยต้องแบ่งข้อมูลออกเป็นส่วนๆตามที่ต้องการก่อน อันนี้ก็จะพอไหว แต่ถ้าบอกว่าต้องการเอาข้อมูลลำดับที่ 1 และลำดับที่ 2 ของข้อมูลมาเปรียบเทียบกันซึ่งไม่สนใจลำดับอื่นๆแบบนี้การแบ่งกลุ่มก็ต้องมาการจัดลำดับ และสามารถดึงลำดับที่ต้องการออกมาได้ อันนี้ยากแล้วเราก็ต้องมาดูว่าฐานข้อมูลแต่ละแบบมีตัวช่วยอะไรให้เราใช้บ้างในส่วนของ oracle จะมีฟังก์ชันกลุ่มนึงที่เป็นการเรียงลำดับข้อมูลนั่นก็คือ ROW_NUMBER(),  RANK(), DENSE_RANK() 

    ROW_NUMBER() ใช้สำหรับแป๊ะเลขที่ ของชุดข้อมูลที่สนใจ ถ้าไม่ Partition ข้อมูลก็จะเป็นการ แป๊ะเลขที่ของข้อมูลทั้งหมด ซึ่งใน Oracle จะมี อีกตัวไว้ใช้งานอยู่แล้วคือ ROWNUM ซึ่งเป็น pseudocolumn ไม่ต้องใช้ ROW_NUMBER() แต่ถ้าต้องการแบ่งข้อมูลออกเป็นส่วนๆด้วย ก็ต้องใช้ ROW_NUMBER บวกกับ PARTITION BY ลองดูตัวอย่างการทำงานจริงๆครับกว่าจะได้คำตอบมาต้องทำกี่ขั้นดังนี้

    รูป Row_Number()

    จากรูปอธิบายได้ดังนี้

    ชั้นในสุดต้องการหาผลนับจำนวนข้อมูลที่สนใจ
    ชั้นที่ 2 เอาข้อมูลที่ได้มาแบ่ง Partition By ด้วย data_year และเอามาเรียงลำดับ Order By ด้วย Totals แบบเรียงจากมากไปน้อย DESC โดยจะใส่เลขกำกับไว้กับข้อมูลที่ data_year เดียวกันที่มีค่า totals มากที่สุดจะเป็นเลข 1 ไปเรื่อยๆ และเริ่ม 1 อีกครั้งเมื่อ data_year เปลี่ยนไป
    ชั้นนอกสุด คือ select * from (…) where row_no < 4 คือเอามาเฉพาะลำดับที่ 1-3 เท่านั้น
    สรุปคือต้องการเอาข้อมูลรายชื่อคณะที่มีค่า totals มากที่สุด 3 ลำดับแรกของแต่ละ data_year ออกมาแสดง

    RANK()

    ลักษณะการทำงานก็จะเหมือนตัวอย่าง ROW_NUMBER() จะเขียนอธิบายเฉพาะที่แตกต่างกันเท่านั้นดังนี้
    เป็นการแป๊ะตัวเลขลำดับให้กับชุดข้อมูลเดียวกัน แต่ค่าข้อมูลที่สนใจได้ลำดับเดียวกัน จะข้ามตัวเลขลำดับถันไปเท่ากับจำนวนลำดับที่เท่ากัน ดังรูปผลของ Query ด้านล่าง จากลำดับที่ 2 ไป 3 rows แล้วจะไปขึ้นลำดับที่ 5 เลย

    DENSE_RANK()

    จะเหมือนกัน RANK() แต่จะไม่มีการเว้นเลขลำดับ จะมีเลขที่ต่อเนื่องไปเลย ดังรูปผลของ Query ด้านล่าง จากลำดับที่ 2 ไป 3 rows แล้วจะต่อลำดับที่ 3 ต่อไป

    รูปตัวอย่าง Query
    รูปผลของ Query

    การแปลงข้อมูล

    CAST

    ใช้เพื่อแปลงชนิดของข้อมูลให้เป็นไปตามที่ต้องการ เช่น แปลงวันที่เป็นข้อความ กำหนดชนิดของข้อมูล Column ที่ยังไม่มีข้อมูลให้เป็นไปตามที่ต้องการ ดังตัวอย่าง

    รูปการแปลงวันที่ปัจจุบันเป็นข้อความ
    รูปผลการแปลงวันที่ปัจจุบันเป็นข้อความ
    รูปแสดงการสร้างตารางใหม่จากข้อมูลที่มีอยู่และต้องการเพิ่ม column ใหม่เข้าไปเพิ่มเติมแบบต้องการระบุ data type

    CASE

    ใช้เพื่อจัดการข้อมูลในหลายๆรูปแบบเป็นการกำหนดเงื่อนไขขึ้นมาเพื่อแปลงข้อมูล ดังตัวอย่าง ต้องการ Update Column ให้มีค่าแตกต่างกันให้เป็นไปตามเงื่อนไขที่กำหนด

    update student_regist
    set WITHDRAWAL_TYPE =  case
                                when lower(WITHDRAWAL_TYPE) = 'w' then  'ถอนติด W' 
                                when lower(WITHDRAWAL_TYPE) = 'c' then  'ถอนเพราะวิชาปิด'
                                when lower(WITHDRAWAL_TYPE) = 'r' then  'ถอน'
                                when lower(WITHDRAWAL_TYPE) = 'n' then  'ถอน'
                                when lower(WITHDRAWAL_TYPE) is null then  'ลงทะเบียนปกติ'
                                else 'xxx'
                                end;

    การสร้าง VIEW, Temporary Table, Materialized view

    การแยกข้อมูลออกเป็นกลุ่มๆอีกวิธีที่ใช้งานเยอะคือการสร้าง View, Temporary Table, Materialized view

    View

    มีการเปลี่ยนแปลงตาม Table ต้นทาง View ไม่น่าจะต้องพูดเยอะเพราะน่าจะใช้งานกันเป็นประจำอยู่แล้ว

    Materialized view

    เป็นตารางที่มีข้อมูลที่ได้มาจากผลของการ Run Query ที่เราต้องการและมีการ Refresh ข้อมูลตามเวลาที่กำหนดไว้ ที่แตกต่างจาก View คือต้องการที่จัดเก็บข้อมูลส่วนตัวนะครับ ตัวอย่างการสร้าง Materialized View

    DROP MATERIALIZED VIEW REGIST_ALL;
    
    CREATE MATERIALIZED VIEW REGIST59
    BUILD IMMEDIATE
    REFRESH COMPLETE
    START WITH sysdate
    NEXT sysdate+1
    WITH PRIMARY KEY
    AS
    SELECT *
    FROM REGIST where year >'2558';
    
    COMMENT ON MATERIALIZED VIEW REGIST59 IS 'snapshot table for snapshot REGIST';

    Temporary Table

    Temporary Table ใน Oracle ใช้แก้ไขปัญหาที่ซับซ้อนโดยการใช้  Stored Procedure หาข้อมูลแล้วนำไปเก็บไว้ใน Temporary table เพื่อประมวลผลในขั้นถัดๆไป

    CREATE GLOBAL TEMPORARY TABLE temp_table (
    
      student_id NUMBER(1),
    
      student_name            VARCHAR2(150),
    
      country_name    VARCHAR2(150)
    
    )
    ON COMMIT DELETE ROWS;

    ตัวอย่างการสร้าง temporary Table ไว้ใช้งาน ON COMMIT DELETE ROWS; เป็นการบอกว่า เมื่อใช้งานเสร็จให้ลบข้อมูล อย่างเช่นสั่ง insert ข้อมูลใน stored procedure เมื่อ stored procedure ทำงานเสร็จข้อมูลที่ insert ไว้ใน temporary table จะถูกลบทิ้งทั้งหมด เป็นต้น ยังมี option อีกมากมายสำหรับ temporary table ต้องศึกษาจาก Oracle Document

    Subquery

    subquery เป็นตัวช่วยทำงานในการแยกข้อมูลที่ต้องการออกมาเป็นส่วนๆแล้วนำไปประมวลผลต่อ ในกลุ่มนี้ with … as ถือว่ามีการใช้งานบ่อยครั้ง คำสั่ง With … as ข้อมูลที่ได้มาเปรียบได้กับ local temporary 1 table นำไป query ต่อได้

    WITH dept_count AS (
      SELECT deptno, COUNT(*) AS dept_count
      FROM   emp
      GROUP BY deptno)
    SELECT e.ename AS employee_name,
           dc.dept_count AS emp_dept_count
    FROM   emp e
           JOIN dept_count dc ON e.deptno = dc.deptno;

    จากตัวอย่างนี้เป็นการนับจำนวนหน่วยงานตาม deptno แล้วเอามา Join กับ table emp ที่มีค่า deptno ตรงกัน

    ตอนที่ 1 นี้ขอจบแต่เพียงเท่านี้ ตอนต่อๆไปจะเรียบเรียงข้อมูลตามที่ใช้ทำงานจริงๆในการทำงานด้าน ETL, Data Science และ Data Lake ต่อไปนะครับ ขอบคุณที่เข้ามาอ่านกันนะครับ

  • Data Visualization นำเสนอข้อมูลเป็นรูป/กราฟแบบไหนดี ? กับข้อมูลที่มีอยู่

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

    ต้องการเปรียบเทียบข้อมูล (Comparison)

    กลุ่มนี้ก็จะมี

    • Bar Chart
    • Line Chart
    • Bubble Chart
    • Grouped Bar
    • Table
    • Pivot Table

    Bar Chart และ Grouped Bar ใช้เปรียบเทียบข้อมูลตามเงื่อนไขที่สนใจ

    ใช้เปรียบเทียบมิติจำนวนข้อมูลที่สนใจกับช่วงที่สนใจ เช่น เปรียบเทียบเป้าหมายที่ตั้งไว้กับข้อมูลที่ทำได้จริงในแต่ละเดือน, จำนวนนักศึกษา ในแต่ละปีการศึกษา เป็นต้น

    Line Chart ใช้เปรียบเทียบเพื่อดูแนวโน้มของข้อมูล

    ใช้เปรียบเทียบมิติของข้อมูล ในเชิงต้องการดูเพื่อเปรียบเทียบการเปลี่ยนแปลง ดูแนวโน้ม (Trends) โดยอาจจะเทียบกับมิติของเวลา (Time Series) และยังนำไปใช้ร่วมกับ machine learning เพื่อพยากรณ์ข้อมูลในอนาคตได้ด้วย เช่น ข้อมูลการถอนรายวิชาในแต่ละเดือนเปรีบเทียบ 3 ปีที่ผ่านมา จำนวนนักเรียนที่สมัครเข้าเรียนใน มอ. แยกตามโครงการ 5 ปีที่ผ่านมา เป็นต้น ตัวอย่างเป็นเปอร์เซ็นต์นักศึกษาเพศชายกับเพศหญิง

    รูป Line Chart

    Bubble Chart ใช้แสดงข้อมูลที่มีความสัมพันธ์กันแบบ 3 มิติ

    ใช้เปรียบเทียบแบบ 3 มิติข้อมูล เช่น
    แกน X แสดง จำนวนอาจารย์
    แกน Y แสดง จำนวนเงินค่าลงทะเบียน
    ขนาดและจำนวนแต่ละฟอง แทน คณะและจำนวนนักศึกษา
    ถ้าเปรียบเทียบแบบนี้ก็จะเห็นความสัมพันธ์ของข้อมูลทั้ง 3 ข้อมูลและสามารถตั้งเป้าหมาย หาค่ามากที่สุด น้อยที่สุดที่สนใจได้

    รูป Bubble Chart ตัวอย่างเป็นข้อมูลสมมุติ

    Table ใช้เปรียบเทียบข้อมูลแบบแนวตั้ง

    เป็นการเปรียบเทียบพื้นฐานที่สุดเลย เป็นการเปรียบเทียบชุดข้อมูลที่ไม่ซับซ้อน เช่น

    รูป Table

    Pivot Table ใช้เปรียบเทียบข้อมูลแนวนอน

    เหมาะสำหรับการเปลี่ยนเทียบข้อมูลเพื่อหาความแตกต่างตามแนวนอน มักจะใช้กับเวลา เดือน ปี เป็นแนวนอนและรายการข้อมูลที่สนใจเป็นแนวตั้งที่สามารถ Filter ได้ เช่น จำนวนค่าลงทะเบียนในแต่ละปีแยกตามคณะ 5 ปีที่ผ่านมาเป็นแนวนอนและรายชื่อคณะเป็นแนวตั้งที่สามารถ Filter ได้ เป็นต้น

    รูป Pivot Table

    ต้องการดูการกระจาย (Distribution) สามารถใช้เมื่อต้องการดูความถี่ของข้อมูลว่ามีลักษณะการกระจายตัวอย่างไร

    Histogram
    Line Histrogram
    Scatter Plot
    Box Plot

    Histogram แสดงความสัมพันธ์ระหว่างข้อมูล ดูการการจายความถี่ของข้อมูล

    รูป Histogram

    Scatter Plot แสดงการกระจายของการจับคู่ข้อมูล

    ภาพจาก WHO

    เหมาะสำหรับแสดงการจับคู่ข้อมูลเพื่อดูการกระจายผล
    เช่น การวัดผลก่อนเรียนและหลังเรียน การวัดผลการทดลองสองกลุ่มทดลอง การวัดน้ำหนักสองครั้งจากคนเดียวกัน 100 คนในวิธีควบคุมอาหาร เป็นต้น

    จะเห็นอะไรจาก Scatter Plot
    -แนวโน้มของข้อมูลระหว่างตัวแปร
    -ความผิดปกติจากภาพรวม
    -กลุ่มก้อนภาพรวมของข้อมูล

    Box Plot เพื่อดูการกระจายของข้อมูลและมีค่าต่างๆประกอบอยู่ในกราฟคือ ค่ากลาง ค่าการการะจาย ค่ามากสุด น้อยที่สุดและข้อมูลห่างกลุ่มมาก (Outlier)

    รูป Box Chart

    Box Plot Chart จะมีข้อมูลแบ่งออกเป็น 3 ช่วงคือ
    25% (Q1) คือข้อมูล 25% แรกจากค่าต่ำขึ้นมา
    50% (Q2) คือข้อมูลตัวที่มากกว่า 25% จนถึงตัวที่ 75% โดยแสดงออกมาในรูป สี่เหลี่ยมผืนผ้า
    75% (Q3) คือข้อมูล 50% ของข้อมูลอยู่ เขียนแทนด้วยเส้นตรงอยู่ภายในรูปสี่เหลี่ยมผืนผ้า ค่านี้คือค่าค่ากลางของข้อมูลทั้งหมด (Median) และตรงค่า เฉลี่ย (Mean) จะแทนด้วย เครื่องหมายบวก
    สำหรับตัวอย่างที่น่าจะยกได้สำหรับการศึกษาอาจจะเป็นผลการเรียนของนุักศึกษา

    ดูการแบ่งสัดส่วน (Composition) ต้องการเห็นภาพรวมพร้อมกับส่วนต่างๆที่สนใจ

    Treemap
    Donut Chart
    Stacked Area Chart
    Stacked Bar
    Pie Chart
    Waterfall Chart

    Treemap

    รูป Treemap

    เป็น Chart ตารางสี่เหลี่ยม โดยใช้สีแยกกลุ่มของข้อมูล และขนาดของสีสี่เหลี่ยมบอกถึงปริมาณของข้อมูลแต่ละกลุ่ม เป็นกราฟที่ดูง่ายเข้าใจในทันทีที่เห็น

    Pie Chart

    รูป Pie Chart

    Pie Chart เป็น Chart ที่แสดงสัดส่วนของข้อมูลดังเดิมที่เข้าใจง่าย เห็นการแยกสัดส่วนตามสีของแต่ละส่วน (เหมือนพิสซ่ามากกว่าพาย)

    ดูความสัมพันธ์ (Relationship) ของข้อมูล

    Heatmap
    Worldmap
    Column/Line Chart
    Scatter Plot
    Bubble Chart

    World map

    รูป World Map

    world map ใช้รูปแผนที่โลกในการแสดงข้อมูลที่มีความสัมพันธ์กัน เป็น Chart สมัยใหม่เข้าใจง่ายและสวยงาม

    วิเคราะห์ข้อมูลการมาอย่างยากลำบาก แต่ถ้านำเสนอไม่น่าสนใจ คนดูไม่เข้าใจ เลือกการแสดงผลไม่ตรงกับสิ่งที่ต้องการนำเสนอ เหมือนทำอาหารอร่อยแต่ไม่น่ากิน เราเลยจำเป็นที่จะต้องศึกษาวิธีนำเสนอข้อมูลในแบบ Data Visualication อย่างเข้าใจและสวยงาม

    แหล่งข้อมูลที่ใช้ศึกษาและเขียนบทความ
    แหล่งที่ 1
    แหล่งที่ 2
    แหล่งที่ 3

  • SSIS (Integration service) ตอนที่ 1 พื้นฐาน SSIS และ ETL

    SSIS (Integration service) เป็น Business Intelligent Tools ของ Microsoft ที่ออกมาเพื่อใช้งานในการจัดการข้อมูลในรูปแบบ ETL

    ซึ่ง ETL คืออะไร
    E – Extract การนำข้อมูลออกมาจาก Source database ซึ่งมาจากแหล่งเดียวหรือหลายแหล่ง
    T – Transform การแก้ไขและเปลี่ยนแปลงข้อมูลให้เหมาะสมที่จะในไปใช้งานต่อไป
    L – Load การเอาข้อมูลไปเก็บที่ปลายทาง (destination) แหล่งเดียวหรือแยกเป็นหลายๆแหล่ง

    โดย Business Intelligent Tools ของ Microsoft นั้นประกอบด้วย 3 ตัวได้แก่

    SSIS2

    Integration service :: เป็น ETL Tool
    Analysis service :: เป็น Tool ที่ใช้วิเคราะห์ข้อมูล ใช้ทำ Data warehouse
    Reporting service :: เป็น Tool ที่ใช้ในการสร้างรายงาน

     

    ก่อนที่จะมี Tools ที่ใช้ทำ ETL (ซึ่งมีหลายตัว หลายค่าย ทั้งฟรีและไม่ฟรี)
    เราต้องลำบากในการจัดการข้อมูลดังรูป

    unSSIS

    ที่มาของภาพ
    คือต้องจัดการข้อมูลจาก Source ต่างๆลงใน Database แยกเป็นแต่ละ Source กันไปแล้วค่อยมาทำการ Cleaning data ที่หลังแล้วค่อยไปรวมฐานข้อมูลอีกครั้งจึงจะเอาข้อมูลไปใช้งานได้ ซึ่งจะทำให้การทำงานค่อนข้างยุ่งยากและซับซ้อนและต้องทำซ้ำๆหลายๆครั้ง

     

    SSIS ทำงานอย่างไร

    SSIS1

    ที่มาของภาพ

    เตรียมข้อมูลให้พร้อมที่จะ load เข้าไปเก็บในฐานข้อมูล มี audit data เพื่อทำให้ตรวจสอบได้ว่าข้อมูลที่ได้มาได้มากจากไหน เมื่อไร process ไหนเป็นผู้จัดการข้อมูล สามารถทำ data cleaning ได้ก่อนที่จะนำข้อมูลเข้าสู่ฐานข้อมูล สามารถใช้ได้กับข้อมูลที่ใหญ่และซับซ้อนได้เป็นอย่างดี

    SSIS ประกอบด้วย

    • Package ไฟล์ของ SSIS นามสกุล *.dtsx
    • Control flow คือ Workflow engine สำหรับจัดการ tasks และ Containers ที่สั่ง Execute

     

    Control Flow

    • เป็น Workflow engine โดยมี Objects ใน Control Flow ดังนี้
      -Control flow tasks คือ การเนินการของ Workflow Object
      -Control flow Containers เป็น Grouping tasks กับ Tasks หรือ Containers อื่นๆ
      -Precedence constraints ให้ติดต่อ Tasks และ Containers และ กำหนดลำดับการ execute และ Precedence

    สำหรับจัดการ tasks และ Containers ที่สั่ง Execute

     

    Data flow

    • ควบคุมการการประมวลผลข้อมูลต่างๆ
    • Transform data จากแหล่งข้อมูล (Sources) ไปยัง ปลายทางข้อมูล (Destinations)

    Data flow task ยอดนิยมมีดังนี้

    1. Aggregate
    2. Conditional Split
    3. Data Conversion
    4. Derived Column
    5. Lookup
    6. Merge
    7. Merge Join
    8. Multicast
    9. Sort
    10. Union All

    ไว้จะลงรายละเอียดในแต่ละ task กันในตอนต่อๆไปนะครับ สำหรับตอนที่ 1 นี้ก็ขอจบไว้เท่านี้ก่อนครับ

     

     

  • Information graphics การใช้ภาพหรือแผ่นภูมิแทนข้อมูลที่จะนำเสนอ

    Information graphics หรือ Infographics เป็นการนำเสนอข้อมูล หรือความรู้ต่างๆโดยการสื่อสารด้วยภาพกราฟิก ซึ่งจะทำให้ผู้รับสื่อเข้าใจและมีความชัดเจนมากขึ้น    ความสามารถในการรับรู้ข้อมูลของมนุษย์ ภาพกราฟิกต่างๆจะดึงดูดความสนใจและความจำได้ดีกว่าข้อความยาวๆหรือต้องอ่านข้อมูล ที่เห็นได้จัดเจนคือ การอ่านข้อความบอกเส้นทางกันการอ่านแผนที่จะให้ผลที่แตกต่างกันอย่างชัดเจน และแน่นอนยุคสมัยของโลก Social อย่าง Facebook Twitter และInstagram ถ้าใครโพสข้อความยาวๆเราก็จะไม่ค่อยสนใจเท่าไรแต่เมื่อโพสภาพสวยๆเมื่อไรจะดึงความสนใจเราได้เยอะมาก

    มาดูการใช้งาน Infographics เพื่อแสดงข้อมูลในรูปแบบต่างๆ

    • ข้อมูลสำคัญทีต้องการให้เป็นจุดสนใจเพียงข้อมูลเดียว
      ควรจะใช้ฟอนต์ที่ใหญ่หรือแปลกตากว่าฟอนต์ทั่วไปหรือมีการเน้นด้วยพื้นหลังที่แตกต่าง ร่วมถึงสามารถใช้ Pictographs หรือ Icon Charts แสดงร้อยละของสิ่งที่สนใจ
      ตัวอย่าง
    1 2
    • ข้อมูลในเชิงเปรียบเทียบ
                        เพื่อให้เห็นความแตกต่างที่เกิดขึ้นกับข้อมูลที่สนใจ โดยมากจะใช้ Bar Chart หรือ Column Chart
      ตัวอย่าง

      top10Social
      ที่มาของภาพ
    • ข้อมูลแบบต่อเนื่องและมีความสัมพันธ์กัน   โดยมากจะแสดงข้อมูลนี้ด้วย Line Chart
      lineCart
    • ข้อมูลแบบไม่ต่อเนื่อง ดูความเป็นไปของข้อมูลที่สนใจ เช่น ความถี่ของผลการประเมิน TOR โดยแยกตามช่วงอายุการทำงานของบุคลากร หรือความสูงของนักเรียนแยกตามช่วงอายุและแยกระหว่างผู้ชายกับผู้หญิงเป็นต้น
      hChart
    • ข้อมูลการเปลี่ยนแปลงตามตัวแปรหรือช่วงเวลา (Trends over Time) สามารถใช้ได้หลายรูปแบบ เช่น Column Chart และเน้นส่วนสนใจ เช่นแสดงร้อยละ หรือใช้รูปแทนข้อมูลช่วงเวลาต่างๆ
      macTimeLine
      ที่มาของภาพ
    • ข้อมูลการกระจายของสิ่งที่สนใจ จะแสดงด้วย bubble chart เช่นความสัมพันธ์ระหว่างความจุปอดกับความสามารถในการกลั่นหายใจของคนแล้วเอาข้อมูลความสัมพันธ์ของแต่ละคนไป วาดกราฟเพื่อดูความสัมพันธ์
      bubbleChart
      ที่มาของภาพ
  • รายการสิ่งที่ต้องตรวจสอบเมื่อต้องเป็นผู้ดูแล Windows Server

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

    พอจะแยกเป็นข้อๆดังนี้

    1. Updates
      -ตรวจสอบ New Package Update ที่ Windows Update โดยทำเดือนละครั้งเป็นอย่างน้อย แต่…ต้องแน่ใจว่ามี Backup หรือ Snapshot ล่าสุดที่พร้อมใช้งานสำหรับถ้า Update แล้วมีปัญหาต้อง Restored ระบบกลับมาให้ได้นะครับ (ส่วนนี้ถ้าเราดูแล Domain Server อยู่ด้วยก็น่าจะศึกษาเรื่อง Group Policy เพื่อสั่งตรวจสอบ server ทั้งหมดที่ดูแลอยู่ให้ Update ตาม Policy ที่ว่างไว้น่าจะดี ตอนนี้กำลังศึกษาเรื่อง Powershell scripts เพื่อให้ตรวจสอบข้อมูลและให้ส่ง mail ไปบอกอยู่ ถ้าทำสำเร็จจะมาเล่าให้ฟังในหัวข้อถัดๆไปนะครับ)
      -สำหรับ Server ได้ติดตั้ง Application อื่นๆนอกเหนือจากที่ Windows ให้มาก็ต้องตรวจสอบการ Update ด้วยนะครับถ้าให้ดีความทำ รายการ Application ที่ลงไว้ใน server ด้วยเพื่อสะดวกต้องการติดตาม Update และจะได้รู้ว่ามี Application แปลกปลอมอะไรเพิ่มเติมมาบ้างในเดือนที่กำลังตรวจสอบ
    2. Security
      -ตรวจสอบสิทธิการเข้าถึง Server พวก Administrator Group และ Remote access group น่าจะทำ 3-6 เดือนครั้ง
      -ตรวจสอบการเปิดปิด Firewall ports ต่างๆ น่าจะทำ 6-12 เดือนครั้ง
      -เรื่องการเปลี่ยน Passwords ของ User ที่มีสิทธิเข้าใช้งานระบบ น่าจะทำ 3 เดือนครั้งกำลังดี
    3. Backups
      -ฺBackups และ ต้องทดสอบ restores ระบบแบบสุ่ม 2-3 เดือนซักครั้ง
    4. Monitoring
      -ตรวจสอบการทำงานของ server โดยการตรวจสอบ logs ต่างๆที่ Server เก็บไว้ ตรงนี้ขอแนะนำ Log Parser Studio ลองไปโหลดมาเล่นดูครับ
      -ตรวจสอบการใช้งานทรัพยากรต่างๆของ Server Disk เหลือเท่าไร ใช้ RAM ไปเท่าไร ช่วงไหนทำงานหนักสุด
      -ตรวจสอบ Hardware Error ทำความเข้าใจกับ Windows logs > System, look for warnings and critical events.
      -Application ที่ลงไว้ตัวไหนไม่ใช้งานก็ความจะเอาออกจาก Server เพื่อลดความเสี่ยงที่ Application เหล่านั้นจะมีช่องโหวให้ถูกโจมตีได้
      -ควรมีการ Run คำสั่ง chkdsk เดือนละครั้งเพื่อตรวจสอบ Disk
      -ควรมีการตรวจสอบพวก Virus และ Mal ware เดือนละครั้งตามที่อ่านๆมาก็พอสรุปได้ดังนี้ครับ และตามหัวข้อเหล่านี้ก็สามารถขยาย ต่อยอดศึกษาต่อไปได้อีก ที่ผมสนใจอยู่ตอนนี้คือการทำ automatic Task ด้วย Powers hell  ถ้าท่านใดมีความรู้หรือมีแหล่งความรู้แนะนำกันได้นะครับ ที่ลองทำและใช้งานอยู่ก็จะเป็นการสั่ง Backup SQL Server Database ไปเก็บไว้ใน Network Drive ซึ่งตัว Backup ของ SQL Server ที่มีมาให้ไม่สามารถมองเห็น Network Drive ได้ก็เลยลองเขียนด้วย power shell ก็ทำงานได้ดีและดูแล้วว่าถ้าใช้งาน Windows Server อยู่ความรู้เรื่อง Power Shell น่าจะช่วยให้ชีวิตการดูแล Server มีความสุขขึ้นมากแน่นอนครับ
  • Powershell : นับหน้าเอกสาร PDF

    1. Download โปรแกรม PDFtk [ https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/ ]
    2. Install PDFtk
    3. ใช้ editor ซักตัวเขียน Code Powershell ที่ผมใช้คือใช้ Visual Studio 2013 และ Download PowerShell Tools for Visual Studio 2013 [ https://visualstudiogallery.msdn.microsoft.com/f65f845b-9430-4f72-a182-ae2a7b8999d7 ] ที่ใช้งานตัวนี้เพราะ Tools จะมี InteliSense ให้ไม่ต้องจำคำสั่ง PowerShell ทั้งหมด ก็ทำให้สะดวกดี
    4.  Code ก็ไม่มาก
      #กำหนดที่เก็บผลการ$File
      Path = ‘E:\tmp\result.txt’ -f $env:Path; 
      #เป้าหมาย diretory ที่เก็บ file PDF วนคำนาณแต่ละ file
      dir e:\ *.pdf | foreach-object{

      $pdf = pdftk.exe $_.FullName dump_data
      $NumberOfPages = 0
      $NumberOfPages = [regex]::match($pdf,’NumberOfPages: (\d+)’).Groups[1].Value

      $infoObj = New-Object PSObject -Property @{
      Name = $_.Name
      FullName = $_.FullName
      NumberOfPages = $NumberOfPages
      }
      #บันทึกข้อมูลลง file
      $infoObj.”FullName”,$infoObj.”NumberOfPages” -join ‘,’ | Out-File -FilePath $FilePath -Append -Width 200;

      }

      5. Save แล้วก็ Execute เพื่อทดสอบได้เลยครับ

  • เกร็ดความรู้ประกอบการกู้หรือย้ายฐานข้อมูล SQL Server

    Count record แต่ละ tables ใน database

    SELECT T.name AS [TABLE NAME], I.row_count AS [ROWCOUNT]
    FROM sys.tables AS T
    INNER JOIN
    sys.dm_db_partition_stats AS I
    ON T.object_id = I.object_id AND I.index_id < 2
    ORDER BY I.row_count DESC

    หา Trigger ทั้งหมดในทุกๆ tables ใน Database

    SELECT [so].[name] AS [trigger_name], USER_NAME([so].[uid]) AS [trigger_owner],
    USER_NAME([so2].[uid]) AS [table_schema], OBJECT_NAME([so].[parent_obj]) AS [table_name],
    OBJECTPROPERTY( [so].[id], ‘ExecIsUpdateTrigger’) AS [isupdate],
    OBJECTPROPERTY( [so].[id], ‘ExecIsDeleteTrigger’) AS [isdelete],
    OBJECTPROPERTY( [so].[id], ‘ExecIsInsertTrigger’) AS [isinsert],
    OBJECTPROPERTY( [so].[id], ‘ExecIsAfterTrigger’) AS [isafter],
    OBJECTPROPERTY( [so].[id], ‘ExecIsInsteadOfTrigger’) AS [isinsteadof],
    OBJECTPROPERTY([so].[id], ‘ExecIsTriggerDisabled’) AS [disabled]
    FROM sysobjects AS [so]
    INNER JOIN sysobjects AS so2 ON so.parent_obj = so2.Id WHERE [so].[type] = ‘TR’

    ค้นหาข้อความในทุกๆ Stored Procedure ใน Database

    SELECT DISTINCT obj.name AS Object_Name,obj.type_desc
    FROM sys.sql_modules sm INNER JOIN sys.objects obj ON
    sm.object_id=obj.object_id
    WHERE sm.definition Like ‘%xxx%’

    วิธีการ Rebuild Full-text Catalogs of Database

    Use Management Studio
    1. In Object Explorer, expand the server, expand Databases, and then expand the
    database that contains the full-text catalogs that you want to rebuild.
    2. Expand Storage, and then right-click Full Text Catalogs.
    3. Select Rebuild All.
    4. To the question, Do you want to delete all full-text catalogs and rebuild them?,
    click OK.
    5. In the Rebuild All Full-Text Catalogs dialog box, click Close.

    rebuild all index in Database

    use DatabaseName;
    DECLARE @TableName varchar(255)
    DECLARE TableCursor CURSOR FOR
    SELECT table_name FROM information_schema.tables
    WHERE table_type = ‘base table’
    OPEN TableCursor
    FETCH NEXT FROM TableCursor INTO @TableName
    WHILE @@FETCH_STATUS = 0
    BEGIN
    DBCC DBREINDEX(@TableName,’ ‘,90)
    FETCH NEXT FROM TableCursor INTO @TableName
    END
    CLOSE TableCursor
    DEALLOCATE TableCursor

    ค้นหา tables ทั้งหมดใน Database ที่มี Identity Column

    select o.name,’set identity_insert [‘+s.name+’].[‘+o.name+’] ON;’ as ION,’set identity_insert
    [‘+s.name+’].[‘+o.name+’] OFF;’ as IOff
    from sys.objects o
    inner join sys.schemas s on s.schema_id=o.schema_id
    where o.[type]=’U‘ and
    exists(select 1 from sys.columns where object_id=o.object_id and is_identity=1)
    order by o.name

    ตัอย่างการ insert table ที่มี Identity Column

    set identity_insert [dbo].[AGroup] ON;
    insert into [xDB].[dbo].[AGroup] ([AGroupID],[AGroupName])
    select [AGroupID],[AGroupName]
    from [aDB].[dbo].[AGroup]
    order by AGroupID;
    set identity_insert [dbo].[AGroup] OFF;

    Compare two table data

    แบบที่ 1
    select * from zlog1
    except
    select * from zlog
    แบบที่ 2
    select * from
    ( select checksum(*) as chk, id as k from zlog1) as t1
    left join
    ( select checksum(*) as chk, id as k from zlog) as t2 on t1.k = t2.k
    where t1.chk <> t2.chk

    ## เสนอแนะ ถ้ามีการกู้หรือย้ายฐานข้อมูลโดยที่ตัวเดิมยังเปิดใช้งานอยู่ สิ่งที่ควรทำคือให้สร้าง User ขึ้นมาใหม่ที่มีสิทธิใช้งานเฉพาะ Database ตัวใหม่เท่านั้น เพื่อป้องกันการเรียกใช้งานฐานข้อมูลทั้งสองที่โดยที่เราอาจจะไม่รู้ซึ่งจะทำให้ข้อมูลในฐานข้อมูลมั่วมากจนอาจจะเกินเยียวยา โดยมากจะเกิดกับ การเขียน code Stored Procedure ที่มีการระบุชื่อ Database ไว้ใน Stored Procedure

  • การกู้ Suspect Database ของ SQL Server

    Recovery SQL Server Suspect Database

    สาเหตุของ Suspect Mode

    การที่ฐานข้อมูล SQL Server เข้าสู่ Mode Suspect นั้นมีได้จากหลายสาเหตุ ดังนี้

    • Hardware เกิดความเสียหาย
    • มีการปิด (Shutdown) ฐานข้อมูลที่ไม่เหมาะสม คือปิดโดยที่ยังมีกระบวนการทำงานยังไม่เสร็จสมบูรณ์ หรือมีบาง Transaction ค้างอยู่
    • เกิดความเสียหายกับ Database Files (*.mdf,*.log)
    • SQL Server ไม่พบ Device ที่เก็บ Files
    • SQL Server ไม่พบ Database Files
    • Database Resource ถูกใช้งานอยู่โดย Operation System
    • ไม่มีพื้นที่มากพอใน Page space ที่มีการเพิ่ม (Insert) ข้อมูลเข้าไป

    วิธีแก้ปัญหา

    แต่ต้องอยู่บนพื้นฐานที่ไม่มีอะไรผิดปกติที่เกิดจาก Devices หรือ ตัว Database Files จึงจะ สามารถ Recovery โดยวิธีดังนี้

    EXEC sp_resetstatus [YourDatabase];
    ALTER DATABASE [YourDatabase] SET EMERGENCY
    DBCC checkdb([YourDatabase])
    ALTER DATABASE [YourDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
    DBCC CheckDB ([YourDatabase], REPAIR_ALLOW_DATA_LOSS)
    ALTER DATABASE [YourDatabase] SET MULTI_USER

    อธิบาย

    • EXEC sp_resetstatus [YourDatabase];

    เป็นคำสั่งทำการปิด suspect mode เมื่อทำแล้วก็ต้อง Stop และ Restart SQL Server ด้วย

    • ALTER DATABASE [YourDatabase] SET EMERGENCY

    เป็นคำสั่งให้ Database เข้าสู่ READ_ONLY MODE และจำกัดการเข้าถึงให้เข้าได้เฉพาะ SysAdmin Account เท่านั้น

    • DBCC checkdb([YourDatabase])

    CheckDB จะตรวจสอบการจัดสรรทรัพยากรสำหรับทุกๆ Object และตรวจสอบความสมบูรณ์ของโครงสร้างฐานข้อมูลทั้งหมด

    • ALTER DATABASE [YourDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE

    กำหนดให้สามารถเข้าใช้งานฐานข้อมูลได้เพียง User เดียวเท่านั้น

    • DBCC CheckDB ([YourDatabase], REPAIR_ALLOW_DATA_LOSS)

    จะมีการทำงานหลายขั้นตอนซึ่งแรกสุดจะเป็นการตรวจสอบทรัพยากรต่างๆและมีการตรวจสอบโครงสร้างของฐานข้อมูลจะมีการ Run คำสั่ง DBCC CheckAlloc, DBCC CheckTable, DBCC CheckCatalog ทั้งฐานข้อมูล มีการตรวจสอบข้อมูลของแต่ละ Indexed View ตรวจสอบ Link-Level Consistency ระหว่าง table metadata และ file system directories ตรวจสอบ Service Broker Data ในฐานข้อมูลทั้งหมด

    ส่วน Option REPAIR_ALLOW_DATA_LOSS นั้นจะมีการพยายามซ้อมแซ่มฐานข้อมูลในส่วนที่เสียไปตามรายการที่ได้จากการ CheckDB และเป็นการอนุญาตให้ข้อมูลสามารถศูนย์หายได้บาง

    • ALTERDATABASE [YourDatabase] SET MULTI_USER

    เป็นการ set database ให้กลับมาใช้งานตามปกติ

    หลังจากขั้นตอนเหล่านี้แล้ว ผมจะทำการ Shutdown Server แล้วเปิดขึ้นมาใหม่แล้วลองใช้คำสั่ง DBCC CheckDB() ตรวจสอบอีกครั้งเพื่อความแน่ใจ

  • T-SQL นับจำนวน record ที่เกิดจากการสั่ง execute Dynamic Query

    ตัวอย่างไม่ต้องอธิบายมาก

    DECLARE @str_SQL NVARCHAR(100), @rowcount INT –กำหนดตัวแปร
    SET @str_SQL = ‘select * from sysobjects’ — set ค่าให้ตัวแปร
    EXEC sp_executesql @str_SQL — สั่ง execute dynamic query
    SELECT @rowcount = @@ROWCOUNT — get ค่าที่จำนวน record ที่เกิดผลกระทบจากการ execute dynamic query
    PRINT ‘@rowcount = ‘ + CAST(@rowcount AS VARCHAR(4)) — แสดงผลออกหน้าจอ