ปัญหาของ Group by
ดูโครงสร้างตารางกันก่อนมีตาราง CONSISTS (เก็บข้อมูลการสั่งไอศครีม แต่ละถ้วย) กับ STOCKS (เก็บข้อมูลของสินค้า) ลองสร้างโจทย์เล่นๆ กัน คือ หายอดขายของไอศครีม แต่ละชิ้นว่ามีการสั่งไปจำนวนกี่ครั้ง โดยจะต้องแสดงไอศครีมที่ยังไม่ได้ถูกสั่งด้วย มาดูโจทย์ทีละส่วน หายอดขายของไอศครีม แต่ละชิ้นว่ามีการสั่งไปจำนวนกี่ครั้ง แสดงว่าต้องมีการ join ตาราง CONSISTS กับ STOCKS เพื่อให้ได้ข้อมูลของไอศครีมแต่ละชนิดออกมา โดยจะใช้ RIGHT OUTER JOIN เพื่อให้ได้ข้อมูลไอศครีมที่ไม่ถูกสั่งออกมา ซึ่งจะเป็นค่า NULL จะต้องแสดงไอศครีมที่ยังไม่ได้ถูกสั่งด้วย มันจะได้เป็นค่า null โดยเราจะใช้ฟังค์ชั่น NVL ของ Oracle ในการเปลี่ยน NULL เป็น 0 วิธีการใช้ NVL(ชื่อคอลัมน์ , ตัวเลขที่จะให้เปลี่ยน) SQL แบบแรกที่ลองเขียนขึ้น แต่ข้อมูลไอศครีม (STOCK_TYPE = 1) มีทั้งหมด 19 ชนิด แสดงว่ามันตกหล่นไป 5 อย่าง เมื่อเราลองเปลี่ยน Alias ใน SQL มัน GROUP BY จาก C.STOCK_ID เป็น S.STOCK_ID แล้วผลที่ได้ คือ มีทั้งหมด 19 แถวออกมา (เลือกตัวที่จะ GROUP BY ผิดทีนี่ยาวเลย)
แนวข้อสอบเกี่ยวกับการ Recovery
จากภาพกำหนดใน T1, T2, T3, T4 และ T5 หมายถึง Transaction ต่างๆ ในระบบ Tc และ Tf ซึ่งหมายถึงเวลาที่ระบบ DBMS ทำการตรวจสอบสถานภาพการทำงานของ Transaction ต่างๆ สมมติว่าระบบเกิดความขัดข้อง(System failure) ณ เวลาที่ Tfและมีจุดตรวจสอบ(Check Point)ครั้งสุดท้าย กระทำขึ้น ณ เวลา Tc จงตอบคำถามต่อไปนี้ โดยอาศัยข้อมูลต่างๆของแต่ละ Transaction ประกอบดังนี้ T1 คือ นาย ก ดูยอดเงินของตัวเอง พบว่ามีเงินอยู่ 1200 บาท T2 คือ นาย ก ถอนเงินออกจากบัญชี 1000 T3 คือ นาย ก ฝากเงินเข้าบัญชี 500 บาท T4 คือ นาย ข ฝากเงินเข้าบัญชี อีก 200 จากยอดเดิมที่มี 700 บาท T5 คือ นาย ข ฝากเงินเข้าไปอีก 300 บาท เมื่อระบบเกิดความขัดข้อง(System failure) แต่ละ Transaction จะมีการจัดการอย่างไร T1 ไม่ต้องทำอะไร เพราะ ข้อมูลถูกบังคับเก็บลงใน DB Space ตอน Check Point ที่เวลา TC T2 ทำ undo เพราะ System failure ก่อน commit ที่ให้ระบบไม่มี log-file T3 ทำ redo เพราะ มี log-file ของ Transaction จากการ commit T4 ทำ redo เพราะ มี log-file ของ…
แนวข้อสอบเกี่ยวกับ Isolation level
อันนี้เป็น Blog ที่เขียนไว้นานมากแล้วที่ blogspot โดยผมได้ย้ายมาลง WordPress ตอนช่วงปี 2013 นะครับ ^__^ ลองอ่านดูกันได้เลย โดยเป็นโจทย์ที่ช่วงให้เข้าใจเกี่ยวกับ Isolation level มากขึ้นครับ หาก DBA ตั้งค่า ISOLATION LEVEL ที่ตัวระบบจัดการฐานข้อมูล ในระดับต่างๆแล้ว ณ เวลาที่ k ผลรวมของทุก Account ของ Ti จะมีค่าที่ได้เท่าไหร่ โดยแต่ละ Account มีค่าต่างๆ ดังนี้ READ-UNCOMMITTED READ-COMMITED REPETABLE-READ SERIALIZABLE
Circular Queue
วันนี้ผมนำเสนอแปลกๆ นะ บทความวันนี้เสนอเรื่อง Circular Queue โดยนำเสนอในรูปแบบ Q&A นะครับ ลองติดดามได้นะครับ ^__^ Q: ทำไมถึงต้องมี Circular QueueA: เพราะ ว่างการใช้ queue แบบเดิม จะทำให้เสียเนื้อที่ใส่ส่วนด้านหน้าไป โดยเปล่าประโยชน์ หลังจากที่ enqueue ออกแล้ว ถึงแล้วว่าจะมีการสร้าง queue ใหม่ชึ้นมา ระบบก็จะจองเนื้อที่ในหน่วงความจำใหม่แทน ลองดูแผนภาพประกอบ Q: แล้วใช้ Circular Queue จะแก้ปัญหาในข้อที่แล้วได้อย่างไรA: ลองเปลี่ยนวิธีการเขียนจากการเขียนที่เรามองว่าคิว คือ แถวยาวๆ มามองให้เป็นวงกลม โดยมีการปรับเปลี่ยนในส่วนของโปรแกรม เพื่อสามารถที่จะทำ Circular Queue ลองดูแผนภาพประกอบ Q: แล้วเราจะรู้ได้อย่างไร ว่า Queue มันเต็ม หรือยัง หรือตอนนี้ยังใส่ได้อีกเท่าไหร่A: ขอตอบแยกเป็นข้อๆ ดังนี้ครับ ถ้าเป็น array ลองใช้ค่า index ให้เป็นประโยชน์ หรือจะสร้างตัวแปรอีกอันนึงขึ้นมานับก็ได้ ถ้าเป็น linked list ก็ต้องสร้างตัวแปรขึ้นมานับ ถึงแม้ว่าlinked list จะมีโอกาสที่จะเต็มยาก แต่ถ้าเป็นงานใหญ่ๆ ก็มีโอกาสเต็มได้เหมือนกัน ลอง Implement Code ผมมีการใช้ interface queueADT เพื่อกำหนดกรอบการทำงานว่า Circular Queue มีการทำงานอะไรบ้าง โดยตัว Interface queueADT สามารถนำไปใช้ต่อได้ ถ้านำไป implement queue แบบอื่นๆครับ ต่อมาเป็นการ Implement ArrayCirQueue โดยมีการอธิบายรายละเอียดใน Session ถัดไปครับ อธิบาย Code ทีละส่วน Data Member เพิ่มเติม: ใช้ head, tail และ qsize เป็นมือที่คอยจัดการภายใน…