สิ่งที่ต้องมีคือ Python ระดับอ่านออกกับ SQL ระดับใช้งาน ส่วนความรู้เรื่องภายในฐานข้อมูลไม่ต้องมีมาก่อน
- Python ระดับอ่าน code ออกและรันเองได้ ทุกบทเขียนด้วย Python 3 และ stdlib ล้วน ไม่ต้องติดตั้ง
อะไรเพิ่มเลยสักตัว โมดูลที่ใช้มีแค่ของที่ติดมากับภาษาอยู่แล้ว
- SQL ระดับเขียน
SELECT … WHERE … ORDER BY เป็น พอ ไม่ต้องรู้เรื่อง transaction หรือ tuning
มาก่อน คอร์สนี้ไม่ใช่คอร์สสอน SQL และไม่ใช่คอร์ส Postgres
- ไม่ต้องรู้เรื่องภายในของฐานข้อมูลมาก่อน ทุกโครงสร้างในคอร์สนี้ถูกสร้างขึ้นใหม่ตั้งแต่ byte แรก
บนหน้าขนาดคงที่ ไม่มีบทไหนที่ขอให้เชื่อโดยไม่ให้ดู
- ถ้ามาด้วยอาการ “เพิ่ม index แล้วยังช้าเหมือนเดิม” บทความ
ทำไม index ที่คุณเพิ่งเพิ่มถึงไม่ถูกใช้ คือการวินิจฉัยอาการ
จากแผนที่ได้มา ส่วนคอร์สนี้สร้างสิ่งที่ผลิตแผนนั้นขึ้นมา อ่านคู่กันได้ แต่ไม่บังคับว่าต้องอ่านก่อน
หัวข้อนี้ประกาศหน่วยที่ใช้วัดทั้งคอร์ส และบอกว่าอะไรที่คอร์สนี้จงใจไม่ทำ
query เดิม เครื่องเดิม บางทีตอบในสามสิบมิลลิวินาที บางทีสามวินาที เพราะเวลาไม่ได้วัดแผน
มันวัดเครื่อง cache ของ OS และเพื่อนบ้านบนเครื่องเดียวกันไปด้วย คอร์สนี้จึงเลิกใช้วินาทีตั้งแต่บทแรก
แล้วใช้หน่วยที่นับได้ตรงๆ สามหน่วยแทน
- จำนวนหน้าที่แตะ — อ่านหนึ่งหน้าคือหนึ่งครั้ง ทุกบทที่รายงานตัวเลขนี้นับจาก code ที่รันจริง
- จำนวนครั้งที่เทียบคีย์ — เพิ่มเข้ามาตอนบท join เพราะสองแผนที่อ่านหน้าเท่ากันเป๊ะ
ยังทำงานต่างกันได้มาก
- จำนวนแถวที่ต้องถือไว้พร้อมกัน — ราคาที่ไม่ได้จ่ายเป็น I/O แต่จ่ายเป็นหน่วยความจำ
รูปธรรมของธีสิสคือคู่ตัวเลขที่วัดได้ตั้งแต่บทที่สองและวนกลับมาอีกหลายครั้งตลอดคอร์ส:
หยิบแถวแบบสุ่ม 0.50 % ของตาราง จ่ายไป 31.72 % ของราคาการอ่านทั้งตาราง
รายการนี้เป็นเส้นขอบเขต ไม่ใช่ข้อแก้ตัว — ทุกข้อคือสิ่งที่จงใจตัดออกเพื่อให้ส่วนที่เหลือรันได้จริง
- ไม่ได้สร้างฐานข้อมูลที่ใช้งานได้ ไม่มี SQL parser ไม่มี transaction ไม่มี WAL ไม่มี MVCC
ไม่มี concurrency และไม่มีการลบหรือแก้แถว heap ของคอร์สนี้เขียนต่อท้ายอย่างเดียว
- ไม่ได้แข่งกับ SQLite และไม่ได้ทำซ้ำ SQLite ประโยคที่คอร์สนี้ยืนอยู่มีประโยคเดียว:
เราสร้างสิ่งที่อธิบายได้ว่าทำไมแผนของ SQLite ถึงหน้าตาแบบนั้น ไม่ใช่สิ่งที่ดีกว่า SQLite
- ไม่รายงานเวลา ไม่มีวินาที ไม่มีมิลลิวินาที และไม่มีประโยคว่า “เร็วขึ้นกี่เท่า” ตลอดทั้งคอร์ส
- ไม่ใช่คอร์สสอน SQL และไม่ใช่คอร์ส Postgres เรื่องอย่าง MVCC, WAL หรือ partitioning
ปรากฏได้แค่ในฐานะไดอะแกรมกับการอ้างอิง ไม่มี code และไม่มีตัวเลขประมาณการ
หัวข้อนี้อธิบายว่าทำไมตัวเลขในคอร์สนี้ผู้อ่านตรวจสอบเองได้ทั้งหมด
ข้อมูลตั้งต้นของทั้งคอร์สคือตารางออเดอร์ 200,000 แถวที่สร้างจาก seed คงที่ จึงได้ค่า md5 เดิม
ทุกครั้งบนทุกเครื่อง ตัวเลขทุกตัวที่ปรากฏในบทเรียนถูกพิมพ์ออกมาจากโมดูล Python ที่ commit ไว้ในรีโป
พร้อม stdout ที่มีเทสต์เทียบทีละ byte — ถ้าคุณรันแล้วได้ไม่เท่ากัน แปลว่ามีอะไรผิด ไม่ใช่ “แล้วแต่เครื่อง”
หน้าขนาด 4096 byte ที่คอร์สนี้ใช้ไม่ได้เลือกมาลอยๆ มันตรงกับ page_size ของ file SQLite
ที่บท capstone เอามาเทียบพอดี หน่วย “หน้า” ของสองฝั่งจึงวางทาบกันได้ตรงๆ
แผนผังนี้จะเติมขึ้นเองเมื่อบทเรียนถูกเพิ่มเข้ามา