[DB2] ลองใช้ Execution Plan เพื่อดูว่า Query ที่เขียนนั้นแย่ หรือไม่

IBM DB2

บทความแรกของปี 2016 เลย (จริงๆ Plan ว่าจะเขียนนานแล้ว แต่ติดงานประจำที่ Change บ่อยมากๆ) วันนี้เลยไปเจอ Shell Script ของ AIX ตั้งนึง ที่ทำหน้าดึงข้อมูลมาใส่ใน Temp Table และส่งออกเป็น Text File ไประบบอื่นผ่าน FTP แต่ปัญหา คือ ว่ามันช้ามากกกกกกกกกกกกก รันเกือบ 20 นาทียังไม่ออกเลย จาก Query ตัวอย่าง เราจะพบว่า มัน Self Join เยอะมากก ซึ่งใน DBMS ถ้าตัวเจ๋งๆ มันจะแลาดพอที่จะแปลง Query ให้ดีขึ้น หรืออย่างน้อยมี Execution Plan ช่วยตรวจสอบครับ (ราคา License ของ DB แต่ละเจ้าที่มันแพงๆ ก็เพราะ Feature เหล่านี้แหละ) งานที่ทำอยู่ DB2 เลยลองใช้ Execution Plan บน Toad และกัน ตัว IBM Data Studio มันโคตรกินแรม 5555 Execution Plan ที่ได้ครับ พบว่ามันมีส่วนของ Table Scan เยอะมากกกกครับ จำเป็นที่จะต้องลง Table Scan ให้น้อยที่สุด โดยการเพิ่ม Index ครับ การเพิ่ม Index ที่ดี เราต้องมาดู Query ที่เราใช้กันบ่อยๆก่อนนะครับ เพราะ ถ้าเพิ่ม Index ไม่เหมาะสมมันส่งผลกับการ Insert/Update นะ และตอนนี้จากการ Scan Query คร่าวๆ ดูแล้วพวกว่ามีการ Self join…

[.NET] ปัญหาราวๆ กับตัวเลขจอมแสบ

หากได้ทำงานเกี่ยวกับระบบด้วยการเงินแล้วเนี่ย ตัวเลขสำคัญมากนะครับ ปัญหาของผมเกิดจากการพัฒนาระบบงานบน .NET ด้วย C# แล้วต้องไปเทียบตัวเลขกับ ระบบงานที่เป็น VB6 แล้วปรากฏว่า มันหายไป 0.01 เลขปริศนาที่หายไป แต่ฝ่ายบัญชีไม่ยอมมมมมม ถ้าหายไปสัก 50 ล้าน มันยังหาได้ง่ายกว่าเลย แล้วใครหละที่เป็นโจร ? จริงแล้วมันเป็นปัญหาที่สะสมมานานตั้งแต่ของ VB6 ที่มีการปัดทศนิยมเศษ 5 แปลกๆ ทำให้ทีมที่ทำระบบเดิมในยุคนั้นมีการ Custom Function ขึ้นมาแก้ปัญหาจุจิกนี้ โดยเฉพาะครับ ซึ่งมีแนวคิดว่าเจอ 5 ปัดขึ้น สำหรับแนวคิดนี้นิยมใช้ในการบัญชี การเงินครับ หลังจากดู Legacy Code เรามาดูอัลกอริทึมที่ VB6 ใช้ดีกว่าครับ เจ้า VB6 ใช้อัลกอริทึมในการ Rounding คือ Banker’s Rounding สาระสำคัญ คือ ต่ำกว่า 4 ปัดลง มากกว่า 6 ปัดขึ้น ปัญหา คือ เลข 5 เนี่ยแหละ ต้องดูตัวเลขข้างหน้า 5 หากเป็นเลขคี่ ก็ให้ปัดขึ้น หากไม่ใช่ก็ให้ปัดเศษทิ้ง (นายแบงค์นี่น่าเลือดจริงๆครับ) ระบบเดิมที่ผมไป Cross Check ใช้ Function Round5up ที่แก้ปัญหานี้เรียบร้อยแล้ว ขอเสริม อีกนิดนึง คือ ในคอม ถ้าเราป้อน 1.50 มันไม่ได้เก็บ 1.50 ลงไปนะครับ มันแปลงเป็นเลขฐาน 2 เนี่ยแหละ โดยอาจจะเป็น 1.4999999999999 แล้วมาใช้อัลกอริทึมในการ Rounding อีกทีนะครับ (เดี๋ยวไปเขียน Blog แยกไปอธิบายอีกทีครับ) จริงๆ .NET กับ VBA ก็ใช้วิธี Banker’s…

[DB2] Set DB2CODEPAGE

CODEPAGE คือ อะไร ? ทำไมภาษาไทย อันเดียวถึงมีหลากหลาย CODEPAGE ? CODEPAGE มีในระดับไหนบ้าง ? มีหลายระดับเลย ได้แก่ DB2 ดู CODEPAGE ได้อย่างไร คำสั่งที่ใช้ในการ SET CODEPAGE เช่น Windows- 874 สำหรับ ERROR CODE ที่ดูแล้วเป็นเรื่อง CODEPAGE มี ดังนี้ SQL0332N  Character conversion from the source code page “874” to the target code page “UNKNOWN” is not supported.  SQLSTATE=57017

[DB2] เปิดใช้งาน Hierarchical Queries

IBM DB2

Hierarchical queries อันนี้จริงๆเป็น Feature ลับของทาง Oracle ครับ โดยนำมาช่วยให้สามารถ Query ข้อมูลยาก และซับซ้อนได้ง่ายขึ้นครับ เช่น มีข้อมูล Company อยากรู้ว่า Company รายการนี้ มีบริษัทลูกกี่ตัว เป็นต้นครับ (อันนี้เดี๋ยวของไปเขียน Blog ยกอีกตอนครับ หุหุ) สำหรับการเปิดใช้ Feature Hierarchical queries สามารถใช้คำสั่งง่ายๆ ดังนี้ ข้อควรระวัง: การเปิดใช้ Hierarchical queries นั้นช่วยให้สามารถ Query ข้อมูลแบบลำดับขั้นได้แล้ว แต่ Performance ของ DB จะช้าลงด้วยนะครับ และ SQL จะมีรูปแบบพิเศษ ทำให้ยากต่อการ Port ไป DBMS ตัวอื่นๆ Reference: Hierarchical Queries

[CR] รีวิวร้านรถ Mother Trucker Burger

รีบกลิ้งจากออมสิน มาเพื่อกินร้านนี้ แต่..จะเรียกว่าเป็นร้าน หรือเป็นรถ โดยร้านนี้ตระเวณขาย Burger รอบกรุงเทพใน Concept “สะใจ ใหญ่ โหด” พอตอนไปถึงร้านที่ Lavilla อารีย์ มีเมนู 2 แบบนะครับ คือ หมู 150 บาท และก็เนื้อ 180 บาทครับ (ถ้าอยากได้แบบ Double ก็ 220 กับ 280 ครับ) จัดไปอย่ารอช้าเลยสั่งเนื้อมา 1 ชุดครับ (อีกสองอันของคนอื่น 5555) Burger ไม่ใหญ่ แต่หนาครับ ต้องค่อยๆกิน ปรับองศาให้พอดีกับปาก หรือจะใช้ช้อนส้อมมาตัดแบ่งก็ได้ครับ แป้งขนมปัง Burger ร้อน + ชีสเต็ม + หัวหอมทอด + เนื้อเข้มๆ ละมุนลิ้น + เบคอน และส่วนผสมอื่นๆ เข้ากันได้อย่างลงตัวครับ ติดอย่างเดียว คือ เรื่องราคาที่แพงไปนิดนึง ไม่งั้นคงได้กิน 3 ชิ้น 55555 ————————————————————————————————————– สำหรับใครอยากรู้ว่าร้านจะไปประจำที่ไหนบ้างคิดตาม FฺB Page ของทางรถ หรือทางร้านได้เลยครับ ————————————————————————————————————–

[AIX] Change Server Date

สำหรับคนที่ใช้ AIX อาจจะต้องมีการย้อนเวลาที่เครื่อง Server บ้าง เราสามารถใช้คำสั่ง date ได้ครับ โดยถ้าพิมพ์ [shell]date[/shell] เพื่อแสดงวันที่ปัจจุบัน แต่ถ้าต้องการแก้วันที่ เราต้องใช้คำสั่ง ดังนี้ครับ [shell] ::date MMDDHHMMYYYY << รูปแบบ Parameter ที่ต้องส่งเข้าไปเป็น เดือน วัน ชั่วโมง นาที และปี date 093015302015 [/shell] จากคำสั่งข้างต้นเป็นการ Set วันที่ให้ AIX เป็นวันที่ 9 กันยายน ปี 2015 (AIX ไม่รู้จัก พ.ศ. นะ) เวลา 15:30 ครับ  

[CR] รีวิวร้าน Marugame Seimen สาขาเซ็นทรัลปิ่นเกล้า

หลังจากไม่ได้มาเขียน Blog เลย 1 เดือนเต็มๆ เพื่อมาจบงาน ฺBOT DataSet Season 1 ก่อน วันนี้หลังจากดูงานที่ค้าง และดูงานใน Season 2 จบแล้ว ผมรีบกระโจนขึ้นรถเมล์มาห้างเซ็นทรัลปิ่นเกล้าเลย ที่เพิ่งเปิดชั้น G ไป จุดประสงค์หลักเลยสำหรับเย็นนี้นะครับ คือ การกิน โดยวันนี้ไปก็ไปแอบส่องร้านดังที่มาเปิดใหม่ครับ แต่ส่วนใหญ่ไม่มีที่นั่งเลย หลังจากสำรวจอยู่นาน และได้กลิ่นหอมๆลอยมา ผมเลยเลือกเข้าร้าน Marugame Seimen (ช่วงนั้นมีที่นั่งว่างพอดีอีก 555) สำหรับการสั่งอาหารให้ร้านนี้ จะแตกต่างจากร้านอื่นๆครับ โดยร้านนี้จะเป็นแบบ Self Service ครับ โดยขั้นตอนสามารถดูได้ตามรูปเลยครับ (น้องคนเก็บตังค์น่ารักด้วย) โดยผมได้ลองเชิงสั่งอุด้งซุปกระดูกหมูสไปซี่ รสชาติเข้มข้นครับ เข้ากับเครื่องเคียงได้ดีครับ กับข้าวปั่นไก่เทริยากินะครับ โดยอันหลังนี่น้ำเทริยากิแห้งไป ส่วนตัวชอบกินแบบน้ำชุ่มๆ ดูรูปยั่วน้ำลายตาม Gallery ได้เลยครับ อันนี้เป็นเมนูอื่นๆของทางร้านครับ และก็ลด 20% ทุกเมนูจนถึงวันที่ 4 ตุลาคม 2558 นะครับ (พรุ่งนี้เย็นแวะไปกินแกงกะหรี่ดีกว่า)

XAMPP Port 80 in use by “Unable to open process” with PID 4

หลังจากไว้ใช้ App Server ที่คอมตัวเองเสียนาน พอดีมีต้องสอน PHP ให้น้องที่รู้จักพอ Run Apache บน XAMPP เท่านั้นแหละ ปรากฏว่า Start ไม่ขึ้น 55555 ตามรูป Feature ต้องขอชมทาง Dev ที่พัฒนา XAMPP นะครับที่ช่วยแสดง Error ให้ง่าย ถ้าเป็นเมื่อสัก 3 ปีก่อนนี้ต้องใช้ประสบการณ์ล้วนๆ (ที่ใช้ Version เก่านี่ ดูจากวัน Build เพราะ อยากจะบอกว่ามันมี Message แจ้ง Error สวยๆมานานแล้ววววว) มาที่ Error ที่แจ้งเตือนบ้างครับ XAMPP Port 80 in use by “Unable to open process” with PID 4 เอาง่ายๆเลยครับ Port ถูกยึดจาก Process ID = 4 จากนั้นเราจะไปหากันครับ ว่าจะไปจับโจรปล้น Port ได้ที่ไหน Tools ง่ายที่เราจะใช้นะครับ หรือ Resource Monitor จะรู้ว่า Port 80 ถูกยึดไป จาก Process ของ System ดังรูปครับ หรือใช้ ได้ครับ พอเรารู้ว่ามันเป็น Process ของ System อันนี้แนะนำให้หาข้อมูล เพิ่มเติมจาก Google ก่อน เพราะว่า Process นี้เป็นของ System เดี๋ยวปิดไปแล้วคอมค้าง 55555 โดยผมได้หามาให้เรียร้อยแล้วครับ มันคือ “World Wide…

[C#] พัฒนาระบบได้ โดยไม่จำเป็นต้องลง DevExpress

DevExpress เป็น Tools ที่ช่วยให้การพัฒนาฝั่ง UI ง่ายๆครับ แต่มันแพง ถ้าทีมเรามี Dev กันหลายๆคน จำเป็นไหมที่ต้องลง DevExpress หมดทุกเครื่อง คำตอบ คือ ไม่จำเป็นครับ (ไม่ใช่ให้ไปลงเถื่อนนะครับ) แต่เราสามารถแก้ไขปรับเปลี่ยนนิดหน่อย เพื่อให้ Dev คนอื่นๆที่ไม่ได้ต้องมาแก้ UI เช่น จัดการกับ Business Logic หรือ จัดการกับ Database สามารถทำงานได้ครับ โดยการแก้ไฟล์ licenses.licx ให้เป็นไฟล์เปล่าๆ ใน Project Main ของเราครับ