[DB2] Query แบบ Check & Next

จริงๆ Blog นี้เกิดจากการได้เป็นผู้โชคดีไปช่วยน้องในทีม Run Script สำหรับ UAT ครับ โดยที่น้องคนนั้นก็ไม่ค่อยมั่นใจกับ Script ครับ เมื่อทดสอบที่ Site ลูกค้าจริงแล้วพบว่า

อ้าวเฮ้ยยยย ไม่เหมือนที่คุยกันไว้นี่นา
ที่บอกว่า Migrate ครบ แต่อ้าวข้อมูลหายไป
อ้าวเฮ้ย อย่ากลืนน้ำลายตัวเองดีกว่า
เสียเวลาร้องขออะไร
สุดท้ายข้อมูลก็ต้องกลับคืน (มันของลูกค้า ไม่ได้ข้อมูลครบคงหัวขาด)

ทำไมถึงเป็นเช่นนั้นหละ ทำไม Script ที่มีการซักซ้อมมาอย่างดีถึงเกิดปัญหาตอนใช้จริง มาดูโครงสร้าง Script กันดีกว่าครับ โดยได้ทำเป็น Batch File ชุดนึงครับ (ไฟล์ migrate.bat )

ข้างในมีเนื้อหาประมาณนี้ครับ

  • ชองดั่งเดิมมี TABLE SYSTEMINFO ซึ่งมีโครงสร้างตาม Script (ของจริงมี 100 Column แต่อันนี้ของตัดมา เพื่อไม่ให้ Blog ยาวเกินไปครับ
  • ตัวอย่างข้อมูล
  • สร้าง Table TMP_SYSTEMINFO ด้วยคำสั่ง เพื่อ Backup ข้อมูลไว้ก่อน (ไฟล์ 21TMP_SYSTEMINFO.txt )
  • ย้ายข้อมูลจาก Table SYSTEMINFO ไปที่ Table TMP_SYSTEMINFO ด้วยคำสั่ง (ไฟล์ 22MOV_FROM_SYSTEMINFO_TO_TMP_SYSTEMINFO.txt )
  • DROP Table SYSTEMINFO ทิ้ง
  • Create Table SYSTEMINFO ใหม่ขึ้นมา ที่ต้องทำแบบนี้ เพราะ Table ขนาดมันเกินจาก PageSize ต้อง DROP และ Create แยก ครับ(ไฟล์ 31NEW_SYSTEMINFO.txt )
  • นำข้อมูลจาก Table TMP_A ย้ายกลับมาคืน Table A (ไฟล์ 32MOV_FROM_TMP_SYSTEMINFO_TO_SYSTEMINFO.txt )
  • DROP Table TMP_A ทิ้ง ด้วยคำสั่ง

แต่พอลองทดสอบทำงานจริง อ้าวววววววว Schema ไม่ตรงกัน พบ Script แรกมัน Error แต่ที่มันจะต้องหยุดกลับต้องทำงานต่อไป DROP ข้อมูลทิ้งเลย

ซุนวูกล่าวไว้ว่า รู้เขารู้เรา รบร้อยครั้งชนะร้อยครัั้ง

แต่นี่รู้ไม่ครบ แล้วต้องทำอย่างไร กลศึกมีไว้พลิกแพลงครับ เราก็เล่นแบบ Safe สิ Execute Script ดู Error ถ้าไม่มีแล้วทำงานต่อ ดู Return Code ครับ

  • Windows ดูค่าจากตัวแปร %errorlevel%
  • Linux / AIX ดูค่าจากตัวแปร "$?"

ค่าที่ db2 return กลับมา

  • มีค่าที่เป็นไปได้ครับ มีดังนี้
     CODE  DESCRIPTION
    0  DB2® command or SQL statement executed successfully
    1  SELECT or FETCH statement returned no rows
    2  DB2 command or SQL statement warning
    4  DB2 command or SQL statement error
    8  Command line processor system error

ลองมาปรับใช้กันครับ Blog นี้เอาเฉพาะของ Windows ก่อนครับ โดยถ้า Error  Script หยุดทำงานครับ โดยเพิ่ม Section มา 2 ส่วน

  • ดักเงื่อนไข
  • ดักเมื่อเกิดเหตุการณ์
    • ERROR – จะถูกทำงานเมื่อมี Error
    • END – Clear ข้อมูลทิ้งครับ
  • ภาพรวมของ Script ครับ  ไฟล์  migrate_withcheck.bat  ครับ
  • ตัวอย่าง การ Run ครับ จะเห็นว่า ถ้า Error มันไม่ทำงานต่อแล้วครับ ปลอดภัยระดับนึงครับ โดยผมอาไปแก้ Script ในไฟล์ 22MOV_FROM_SYSTEMINFO_TO_TMP_SYSTEMINFO.txt  โดยเอา , ออกไปครับ เอา DataType ติดกับชื่อ Column ครับ แก้แบบนี้แล้วต้องได้ ERRORCODE = 4 Return กลับมาครับ
    • คำสั่งถัดไป คือ DROP ครับ ถ้า Execute ต่อก็งานเข้าครับ
    • ผลการทดสอบครับ มันไม่ทำคำสั่ง DROP ครับ ^___^
  • มีข้อสังเกตุด้วยนะครับ
    • สังเกตุว่าใน ฺBAT ของเรามีคำสั่งเพิ่มขึ้น 2 คำสั่งครับ ต่อการ Execute Statement ด้วย db2 มันเยอะมาก ถ้าต่อยอดทำ Tools ก็สามารถทำได้ครับ
    • อันนี้เอาไปประยุกต์กับพวก Transaction ได้ด้วยครับ

อ๋อสุดท้ายเห็นมีหลายคน ถามว่าผมทำงานอะไรนะครับ เป็น Developer ถ้าภาษาทั่วไป Programmer กรรมการ IT แหละครับ ไม่ได้เป็น DBA นะครับ ^__^

Reference

[DB2] เมื่อ Path ก็มี แต่ทำไมยัง สร้าง Database ไม่ได้ มีแต่ SQL1052N The database path path does not exist.

วันนี้ผมได้ไปช่วยน้องในทีมสำหรับอีก Project แต่ก็เจอปัญหามากมายเลยครับ ทั้งเรื่องขึ้น Database ที่ติดปัญหาขนาดของ Table ที่ Field เยอะมากจน Pagesize 4K ไม่พอ ทำให้ต้อง DROP DB แล้ว Import Data เข้าไปใหม่ ซึ่งปรากฏว่า Drive C ที่มันเหลือน้อยมากครับ 25 GB แต่ Database ที่ต้องการเอาเข้าไป มันตั้ง 80 GB ทางเลือกเดียวตอนนี้ คือ ต้องไปสร้าง Database ที่ Drive อื่นครับ ซึ่ง Drive ที่ว่าง คือ Drive E: มีที่ 150 GB เริ่มต้นลุยคำสั่งเลยครับ

อ้าวววววววว

SQL1052N: The database path path does not exist.

เกิดอะไรขึ้น !!!!!

ทางแก้ไขนะครับ

  • ตรวจสอบ Path ที่ต้องการก่อน อันนี้ Path จริงครับ สำหรับเคสนี้  E:\DBUAT  มีจริงนะครับ
  • สำหรับ Windows นะครับ ให้ตรวจสอบ Registry DB2_CREATE_DB_ON_PATH ว่ามีอยู่ หรือป่าวครับ ด้วยคำสั่ง  db2set -all  ผ่านทาง Command line ครับ
    • ถ้าไม่มี Set เพิ่มเลยครับ ด้วยคำสั่ง  db2set DB2_CREATE_DB_ON_PATH = yes  แต่ต้องเป็น User ของเครื่องต้องอยู่ในกลุ่ม db2Admin นะครับ
    • จากนั้น Restart เครื่องครับ

Reference

[DB2] มาดูขนาดของ Table และ Database กันครับ

สุขสันต์วันสงกรานต์นะครับ วันที่ชาวไอทีหลายคนอาจจะยังต้องทำงานอยู่รวมทั้งผมด้วย 5555 หลังจากแก้เคสด่วนของรายงานแบงค์ชาติ LQ1 ไป คราวนี้ลองมาแอบส่อง Database บ้าง จากกันไปปีกว่าๆ แต่ทำไมชนาดที่ Backup มันดูใหญ่โตจัง 5555 โดยผมได้เขียน Query ดังนี้ครับ

Query ที่เขียนขึ้นครับ

สำหรับ Query นี้หลังๆ ดึงจาก Table  SYSIBMADM.ADMINTABINFO ครับ โดยเอาค่าของเนื่อข้อมูล(  DATA_OBJECT_P_SIZE ) + ขนาด Index(  INDEX_OBJECT_P_SIZE ) + ขนาดของ Long Object ( LONG_OBJECT_P_SIZE) + ขนาดของ Stream (LOB) ( LOB_OBJECT_P_SIZE ) และ ขนาดของ XML( XML_OBJECT_P_SIZE) โดยที่ _P (Physical) ถ้าไปดู Schema ดีๆมี _L ที่หมายถึง Logical ด้วยครับ

ผลลัพธ์ที่ได้

ที่นี้เอาเราข้อมูลมาวิเคราห์ และสร้างกราฟนำเสนอให้ผู้บริหารต่อไปได้ครับ หรือจะเอาไปวิเคราะห์ทำเป็น MA ต่อไปครับ หากใช้ Database Microsoft SQL Server สามารถดูได้จาก Blog ตอนต่อไปครับ

Reference

[DB2] SQL2314W Some statistics are in an inconsistent state. (SQLSTATE=01650)

ระหว่างน้องทดสอบ Script ปรากฏว่าเจอ Error Message ว่า

แล้วทำไม statistics มันไม่สอดคล้องหละ (inconsistent)

  • มีการทำ Operation ประเภทยัด(BULK) ไม่ว่าเป็นการ INSERT หรือ DELETE หลายรายการ แต่ตัว  statistics มันปรับตัวไม่ทัน เอาง่ายๆ คืือ ว่าไม่ได้ Update นั่นเอง เลยทำใน Statistics ของ Table กับ ของ Index มันไม่สัมพันธ์กันครับ ระบบเลยขึ้นแจ้งเตือนครับ

แก้ไขอย่างไร จริงๆ คำสั่งที่เอามาใช้แก้ มีหลายแบบ ดังนี้ีครับ

  • แบบที่ 1:
  • แบบที่ 2:

หมายเหตุ: INVEST = DB SCHEMA และ COUNTERPARTY = ชื่อ TABLE

 

[DB2] Install DB2 11.1 on Ubuntu 16.04

พอดีอยากลองศึกษา DB2 กับตัว Docker แต่ความรู้พื้นฐานของ Linux ไม่ค่อยมีเลย ใช้แต่ GUI มาตลอด (Ubuntu GUI สวยนะ) ผมเลยลองมาศึกษา Linux ปกติก่อนและ เอาให้เชี่ยวระดับแล้วค่อยข้ามไป Docker มาเข้าเรื่องดีกว่า สำหรับการลง DB2 11.1 Ubuntu โดยใช้ตัว Command Line

สิ่งที่ต้องเตรียม

  • Ubuntu ลงให้เรียบร้อยเลย ใช้ VM หรือ เครื่องจริงก็ได้ (ของผมใช้ VM นะ)
  • ตัวติดตั้ง DB2 ของ Linux สามารถ Download ได้จาก ที่นี่ (ผมลอง Version Express C นะครับ Feature ต่างๆ เพียงพอแล้วสำหรับผม)
  • เนื้อที่ว่างประมาณ 3.5 GB

ลงมือเข้า Terminal เตรียมลง

  • ไปที่ Path ที่เก็บตัว Setup DB2 11.1 ไว้ครับ
  • มันถูกบีบเป็น .tar.gz เราใช้คำสั่ง เพื่อแตกตัวติดตั้งออกมาครับ ดังนี้
  • เมื่อแตกไฟล์ออกมาเสร็จ ได้ folder expc ดังรูป
  • ลองเข้าไปดูข้างในด้วยคำสั่ง ls พบไฟล์ที่สำคัญ ดังนี้
    2db2install

    • โพลเดอร์ db2 – เก็บทุกอย่างที่จำเป็นสำหรับการติดตั้ง
    • db2ckupgrade  – เปลี่ยน Version
    • db2_deinstall  – เอาออก
    • db2_install  – ติดตั้งแบบ Command line
    • db2ls
    • db2prereqcheck – เช็คความพร้อมของเครื่องก่อนติดตั้ง
    • db2setup – ต้วติดตั้งแบบ GUI
  • ลองรัน bash db2prereqcheck ก่อนเพื่อตรวจสอบ คำสั่ง
  • มันมีหลาย Version สนใจที่ 11.1 ตามรูป
    3db2install
  • มาดูเฉพาะอันดีกว่า
    Validating "32 bit version of "libstdc++.so.6" " ...
    Found the 64 bit "/usr/lib/x86_64-linux-gnu/libstdc++.so.6" in the following directory "/usr/lib/x86_64-linux-gnu".
    DBT3514W The db2prereqcheck utility failed to find the following 32-bit library file: "libstdc++.so.6".
    
    Validating "/lib/i386-linux-gnu/libpam.so*" ...
    DBT3514W The db2prereqcheck utility failed to find the following 32-bit library file: "/lib/i386-linux-gnu/libpam.so*".
    WARNING : Requirement not matched.
    Requirement not matched for DB2 database "Server" . Version: "11.1.0.0".
    Summary of prerequisites that are not met on the current system:
    DBT3514W The db2prereqcheck utility failed to find the following 32-bit library file: "/lib/i386-linux-gnu/libpam.so*".
    
    DBT3514W The db2prereqcheck utility failed to find the following 32-bit library file: "libstdc++.so.6".
    
  • ผมลองเพิ่มไป 3 ตัว เพื่อแก้ปัญหา ดังนี้
  • https://www.ibm.com/support/knowledgecenter/SS4KMC_2.4.0/com.ibm.sco.doc_2.4/ts/ts_errors_of_32_bit_library_files.html
  • ลอง Run Bash db2setup มีตัวติดตั้งแบบ GUI สวยแฮะ
    4db2install
    ด้วยคำสั่ง
  • กลับมาที่เราสนใจดีกว่า
  • มันถาม Path ว่าติดตั้งตาม Default ไหม ที่ /opt/ibm/db2/V11.1 ตอบ yes ไปครับ
  • รอให้มันลงทีละ step เรื่อยๆ
    5db2install
  • จากนั้นสร้าง user และ password ที่จำเป็น ดังนี้
  • DB2DIR คือ Path ที่ลง DB2 ตอนนี้ คือ /opt/ibm/db2/V11.1
  • ต่อไปสร้าง db2 administration server ด้วยคำสั่ง
  • สร้าง db2 instance ด้วยคำสั่ง

    7db2install
  • สร้าง Symbolic link เชื่อม DB2 โดยใช้ db2ln ด้วยคำสั่ง
  • มาดู Port ของ DB2 ดีกว่า ที่ /etc/services ปกติ default 50000 ถ้าไม่ชอบก็เปลี่ยนได้ครับ
    8db2install

Verify DB2

10db2install

  • login เข้า user db2inst1
  • เปิด Terminal ทดสอบ DB2 ด้วย คำสั่ง db2stop และ db2start
  • ลองสร้าง Database ในที่นี้ ผมสร้างชื่อ Test ด้วยคำสั่ง
  • ทดสอบ Connect ด้วยคำสั่ง

[DB2] อย่าใช้ db2stop, db2start แบบผิดๆ

พอดีลองไปศึกษาข้อมูลดู ผมพบว่า ผมใช้ 2 คำสั่งนี้ผิดมาตลอด

  • db2start คือ เปิด instance
  • db2stop คือ ปิด instance

กลับมาดูกันก่อนหลาย database อยู่ใน instance เดียวกันได้ ถ้าใช้คำสั่ง db2start หรือ db2stop แสดงว่า Database ที่อยู่ใน instance นั้น โดนผลกระทบด้วยครับ

แล้วถ้าไม่ใช้ db2start หรือ db2stop แล้วจะใช้คำสั่งอะไรแทนหละ ?

  • db2start เปลี่ยนมาใช้คำสั่ง activate db แทน มีรูปแบบคำสั่ง ดังนี้

    ตัวอย่าง เปิดใช้งาน database BFMMOVED
  • db2stop เปลี่ยนมาใช้คำสั่ง deactivate db แทน มีรูปแบบคำสั่ง ดังนี้

    ตัวอย่าง เปิดใช้งาน database BFMMOVED

เวลาจะใช้คำสั่งอะไรควรระวังด้วยนะครับ แม้ว่ามีคำแนะนำใช้ทำ 1 instance ต่อ 1 database แต่บาง site อาจจะจัด 1 instance ให้มี database มากกว่า 1 ก้อนก็ได้ครับ

[DB2] มาดักดูว่าใครทำ DB ค้าง

ช่วงนี้ DB ที่บริษัทกับที่ Production ชอบค้างอยู่บ่อยๆครับ สำหรับในบริษัทได้ลองเขียน Query เพื่อที่ตรวจสอบว่าใคร Lock Database ซึ่งอาจะเป็นการเปิด Transaction แล้วลืม Commit ก็ได้ครับ สำหรับการทดสอบของผม ผมได้มี Query ชุดนึงที้ที่ควานหาว่ามีอะไรผิดแปลกกับ Database ครับ โดยผมมีรูปแบบการ Test ดังนี้

  • VM ที่ลง DB2 ไว้ (ถ้าว่างๆจะย้ายลง Docker และ)
  • Dump ข้อมูลใส่ใน Table Activeuser
  • เครื่อง VM นี่แหละ Connect ผ่าน Toad และลบข้อมูล Table Activeuser ผ่าน Toad และปิด Auto Commit ไว้
    2016-09-11_162754
  • เครื่อง Host ลองเปิด Client App Connect เข้าไป เจอ Error ครับ เท่าที่ User แจ้งมานี่มีหลายแบบ อันนี้เป็นแบบหนึ่ง
    2016-09-11_163048
  • กลับเข้าไปใน VM เปิด Toad และลอง Run Query ทดสอบอีกครั้ง
  • ลองมาจับโจรจาก Query นี้ดูครับ มีข้อมูลที่แกะได้จาก Query ดังนี้
    2016-09-11_164602

    • Client – win7sp164bit (VM ผมเองครับ)
    • Application – toad.exe
    • Table – SYSTEMCOUNTER, ACTIVEUSER
    • Lock Type – TABLE_LOCK
    • Lock Mode – IX

หากสังเกตุดีๆ Query ตัว SYSIBMADM.LOCKS_HELD หรือ LC ผมเอาหมดเลย เพราะบางตัวผมก็ไม่รู้ครับ และหากนำไปใช้งานจริง อย่างลืมเปิดสิทธิการ Execute ให้กับ “SYSPROC.MON_GET_CONNECTION” ไม่งั้นจะเอามันด่าแนวๆนี้ครับ

และการนำไปใช้งานจริง อาจจะทำเป็น App แบบตอนสมัยปี 1

  • กด 1 dump lock
  • กด 2 exit

เมื่อเวลา DB มันค้าง ให้ DBA ที่ของ Site ลูกค้า Dump ออกมาเป็น TextFile และให่ส่งกับมาที่บริษัทก็ได้ครับ ส่วนตอนนี้ขอไปจับโจรที Production ก่อนครับ

[DB2] db2support เครื่องมือสำหรับเก็บข้อมูล เพื่อวิเคราะห์ปัญหาครับ

จริง Blog นี้ดองมานานหลายเดือนเลย สำหรับวันนี้ได้เวลาเคลียร์ HDD เลยไปเจอรูปที่เตรียมไว้ทำ Blog เลยตัดสินใจมาเขียนให้จบดีกว่าครับ โดยวันนี้เรื่องของ db2support  แล้วตัว db2support  คือ อะไร หลายคนอ่านชื่อแล้วอาจจะคิดว่าพิมพ์คำสั่งไปปุบ มีทีมงานจาก DB2 วิ่งเข้ามาดูที่ DB Server ของเรา แต่จริงๆไม่ใช่นะครับ มันเป็นเครื่องมือที่เก็บข้อมูลต่างๆ เพื่อนำมาวิเคราะห์ปัญหาครับ

db2support  ใช้งานอย่างไร

แค่พิมพ์คำสั่งครับ สำหรับรายละเอียดดูได้จากที่นี้ครับ โดยใน Blog นี้ผมใช้คำสั่งดังนี้

เห็นมันน้อยๆ แต่ Option ของคำสั่งนั้นเพียบครับ โดยผมให้เห็นข้อมูลพื้นฐาน จาก Database (-d) BFMAPR และให้ทำการบีบอัด (-C) โดยได้เป็น .zip พอดีผมใช้ Windows เป็นหลัก ถ้าเป็นค่ายอื่นๆ ก็จะเป็น .tar โดยสิิ่งที่มันเก็บสามารถดูได้จากที่นี่ครับ

หลังจากกดคำสั่งไปแล้ว รอมันทำงานครับ

This slideshow requires JavaScript.

โดยสำหรับ Windows มันอยู่ใน โพลเดอร์ IBM\SQLLIB\BIN ครับ
32016-08-05_133633
เมื่อลองเปิดดูมันสร้างเว็บ เราสามารถไล่ดูในสิ่งที่ต้องการได้ครับ
42016-08-05_134135

Tools ตัวนี้เหมาะสำหรับอะไร ?

  • การเก็บข้อมูลระหว่างไป MA เพื่อดูว่าในแต่ะช่วงมีารเปลี่ยนแปลงอะไรบ้าง
  • การดับไฟที่เกิดขึ้นที่ Production ครับ

 

 

[Toad] You don’t have the privilege to perform the installation. Please login as administrator to install the product.

หลังจาก PC ที่ใช้ประจำทนความหนาวเหน็บของแอร์ที่ห้องใหม่ไม่ไหม ระเบิดตัวเองไป พอได้ HDD ใหม่ผมจัดลงโปรแแกรมใหม่ทั้งหมด แล้วที่นี้ติดปัญมาอยู่ที่ Toad (Tools ที่ผมใช้ในการจัดการกับ Database ของ DB2 ครับ จริง DB2 มีตัว IBM Data Studio มาให้ครับ แต่มันหน่วงครับ)

เกริ่นมานานแล้วไป Download มาใช้งานดีกว่า พอจะกดลงเท่านั้นแหละ

2016-09-10_075647

เฮ้ยยย User เราเป็น Admin นี่หว่า อ้าวเกิดอะไรขึ้นเนี่ย !!!!!!

เมื่อ UI มันสั่งไม่ได้ ดั่งใจ คราวนี้ใช้ตัว Command Line จัดการซะเลย (อย่าลืม Run as Administrator นะครับ)

2016-09-10_080427

CD ไปยัง Path ที่เก็บตัวติดตั้งครับ จากนั้นเรียก ls มาดู แต่เอ๊ะ ไม่ใช่นี่หว่า dir เพื่อมาดูไฟล์ติดตั้งของ Toad ครับ

2016-09-10_080518

Ah Gotcha!!! ลงได้แล้วครับ

This slideshow requires JavaScript.

หมายเหตุ: สำหรับ Product ตัวอื่นๆจาก Toad เช่น Toad for Microsoft SQL Server, Toad for Oracle ถ้าติดปัญหาก็สามารถใช้วิธีการเดียวกันนี้แก้ไขได้นะครับ ^___^

[DB] มาดูพวก Operator JOIN ทั้งหลายใน Execution Plan ดีกว่า

หลังจากมี Blog เกี่ยวกับ Execution Plan ไป 2 ตอนแล้ว

ถ้าลองสังเกตุดีๆ ตอนที่มันสร้าง Flow ขึ้นมา มันมีกล่องแทนการกระทำต่างๆ เช่น FETCH, TBSCAN เป็นต้น ซึ่งถ้าลองย้อนกลับไปในตอนเรียนวิชา Database มันมีหัวข้อนึง ชื่อ Query Optimization ทำอย่างไรให้ Relational Algebra (Low Level จาก SQL ครับ จริงๆตัว SQL ที่ใช้เบื้องหลังมันก็ไปแปลงกลับเป็น Relational Algebra)  หรือพูดง่ายๆ คือ Query ดึงข้อมูลได้มีประสิทธิภาพครับ โดยคราวนี้เราสนใจเฉพาะกลุ่ม Join ครับ

นอกจาก INNER JOIN, RIGHT JOIN และ LEFT JOIN มันมีอะไรที่ลึกล้ำกว่านี้อีกเหรอ คำตอบ คือ มีครับ มองว่าเป็น Algorithm ที่เอามาจัดการกับข้อมูลที่ต้องการครับ โดยผมขอ Focus ที่ตัว DB2 ก่อนนะว่า มีอะไรบ้าง เอาเฉพาะที่โผล่มาใน Execution Plan บ่อยๆนะครับ

  • NLJOIN
    • Nest Loop Join
    • เอาข้อมูล 2 แหล่งมาไล่จับคู่กันตรงๆ จับไปเรื่อยๆจนกว่าจะครบทั้ง 2 ฝั่ง นึกถึงภาพของ Buble Sort ยังไงไม่รู้
    • เหมาะกับการจัดการกับข้อมูลน้อยๆ
    • ต้องศึกษาลึกๆ ว่าในตัว DBMS ทำ Nest Loop Join โดยเริ่มจากอะไร เช่น
      • เอา Table ในฝั่งไหนเป็นหลัก ฝั้งซ้ายไปไล่จับคู่กับฝั่งขาว
      • เอา Table ที่ Row น้อยกว่าตั้ง แล้วไปไล่จับคู่กับอีก Table
    • จาก Blog ตอนที่แล้ว ที่ Query แรก มันนานก็เพราะแบบนี้แหละ ตัว DBMS มันเลือกใช้ NLJOIN กับข้อมูลเยอะๆ ทั้งสองฝั่งครับ

      2016-06-15_233433
  • MSJOIN
    • Merger Scan Join หรือ Sort Merge Join
    • เหมาะสำหรับข้อมูลที่มีขนาดไม่ใหญ่มาก และตัว Query มีการใช้ Operation ประเภท (Inequality Condition) เชน <, <=, >, >= เปนตน จากนั้นมาจับคู่ข้อมูล
  • HSJOIN
    • Hash Join
    • เหมาะกับข้อมูลที่มีขนาดใหญ่ และตัว Query มีการใช้ Operation ประเภท (Equijoin) คือ =
    • แบ่งข้อมูล เป็นชุดย่อยๆในหน่วยความจำ จากนั้นมาจับคู่ไปเรื่อยๆจนครบ
    • ปกติ ส่วนใหญ่จะเจออันนี้นะ ถ้าอยากให้ HSJOIN แล้วเร็ว ก็ต้องเพิ่ม Memory ครับ (Money Power 555)
    • ถ้ามีแบบนี้เยอะ – แสดงว่า Index กับ Statistics ไม่ดี ควรทำเพิ่มนะ

จบไปกับ Blog อีกตอนที่อาจจะเขียนแล้วดูงงๆนะครับ