คำถามเดียว คำตอบพลิกสามชั้น และทั้งสามชั้นวัดเป็นจำนวนนับ
คำถามคือ การวางค่าของ column เดียวกันไว้ติดกัน ทำให้อ่านน้อยลงจริงไหม
ชั้นที่หนึ่ง การวางแนวอย่างเดียวแพ้ คลัง column ที่ยังไม่เข้ารหัสและแตะครบ
6 จาก 6 column แตะ 3320 หน้า ส่วน heap ที่มันมาแทนสแกนทั้งตารางแตะ 3153 หน้า
เปิด bit packing บนข้อมูลชุดเดิม แล้วทรงเดียวกันเหลือ 989 หน้า สิ่งที่เปลี่ยน
ระหว่างสองตัวเลขนั้นไม่ใช่การวางแนว เพราะมันวางแนวเดียวกันทั้งคู่ ที่ชนะคือการเข้ารหัส
ชั้นที่สอง กลไกที่ตำรายกให้คลัง column อยู่ในคลังแนวแถวมาก่อนแล้ว heap ของคอร์สที่ 26
เก็บ status ทั้ง column ด้วย 200,000 ไบต์ เพราะมันแทนสตริงด้วยตัวรหัสหนึ่ง byte
มาตั้งแต่ต้น ส่วนคลัง column ที่เก็บสตริงดิบใช้ 1,985,792 ไบต์
การเทียบ heap กับคลัง column ที่พบทั่วไปจึงเทียบของที่เข้ารหัสแล้ว กับของที่ยังไม่เข้ารหัส
ชั้นที่สาม เมื่อแยกสองเรื่องออกจากกัน ตัวเลขที่ได้ใหญ่กว่าที่ตำราสัญญา เลือก
การเข้ารหัสที่เล็กที่สุดต่อ column แล้วทั้งคลังเหลือ 1,238,089 ไบต์ คิดเป็น
305 หน้า เทียบ heap ที่ 12,914,688 ไบต์ และ 3153 หน้า
และไม่มีการเข้ารหัสตัวไหนชนะทุก column การเลือกจึงเป็นงานต่อ column ไม่ใช่การตั้งค่าครั้งเดียว
ประกาศไว้ตรงนี้ เพราะหน่วยเป็นสิ่งที่ตัดสินว่าข้ออ้างไหนเข้าคอร์สนี้ได้
ทั้งคอร์สไม่มีหน่วยเวลาสักตัว คอร์สนี้รับกฎข้อนี้มาทั้งดุ้นจากคอร์สที่ 26 ของเสาเดียวกัน
หน่วยที่คอร์สนี้ยอมรับมีเจ็ดอย่าง
- จำนวนหน้าที่แตะ ซึ่งนับด้วย
Pager.reads ตัวเดียวกับคอร์สที่ 26 ไม่ใช่ตัวนับของตัวเอง
- จำนวนไบต์ที่การเข้ารหัสหนึ่งแบบใช้เก็บ column หนึ่งตัว
- จำนวน row group ที่ข้ามได้ ซึ่งนับจากการรันจริง ไม่ใช่ค่าประมาณ
- จำนวนค่าที่ถอดรหัส ซึ่งเป็นหน่วยที่เคลื่อนไปคนละทางกับหน้าที่แตะได้
- จำนวนบิตต่อค่า ซึ่งเป็นค่าต่อ row group ไม่ใช่ค่าต่อทั้ง column
- จำนวน run คือช่วงของค่าที่เหมือนกันติดกัน
- จำนวนค่าที่ไม่ซ้ำ ทั้งของทั้ง column และของภายใน row group เดียว
ความเร็วมีนาฬิกาอยู่ข้างใน คอร์สนี้จึงไม่วัดมันและไม่พูดถึงมัน
สนามแข่งเป็นตารางใบเดิมของเสานี้ และ probe รันได้บนเครื่องเปล่า
- สนามแข่ง คือตารางออเดอร์ 200,000 แถว จาก seed 20260802 ซึ่งให้
md5(repr(rows)) เป็น 6796858c189960daa42506f5ed86d573 ทุกครั้ง · หน้าขนาด
4096 ไบต์ · row group ปริยาย 10,000 แถว จึงได้ 20 กลุ่ม
- probe คือ
scripts/column-store/probe.py ซึ่งยืนยัน 65 ข้ออ้าง และรัน
3 รอบ ต่อการเรียกหนึ่งครั้ง แล้วแดงถ้ามีค่าไหนขยับระหว่างรอบ
- ของที่ต้องมีมีอย่างเดียวคือ Python 3 ไม่ต้องมี Docker ไม่ต้องต่อเน็ต
และไม่ต้องติดตั้งอะไรนอก standard library
- ตารางของคอร์สที่ 26 และ 28 ถูกใช้ซ้ำ ไม่ได้ถูกแก้ probe นำเข้า
fixture.py
กับ heapfile.Pager จาก scripts/query-engine/qe/ และไม่แก้อะไรที่นั่นแม้แต่ byte เดียว
ตัวเลขทุกตัวที่บทเรียนพิมพ์มีคีย์ของตัวเองอยู่ใน
scripts/column-store/expected/column-store.txt ซึ่งเป็นของที่ --emit สร้างขึ้น
zone map เป็นการตัดทิ้ง ส่วนการประมาณจำนวนแถวเป็นของคอร์สก่อนหน้า
การประมาณจำนวนแถว histogram uniformity และ independence เป็นเรื่องของ
คอร์สที่ 26 บทที่ 4
ซึ่งมีหัวข้อของตัวเองครบอยู่แล้ว คอร์สนี้ไม่คำนวณและไม่รายงานค่าประมาณความเลือกสรรสักตัว
เส้นแบ่งคือ zone map ตัดทั้ง row group ทิ้ง มันไม่ได้เดาว่าจะเจอกี่แถว คอร์สนี้จึงรายงาน
จำนวนกลุ่มที่ข้ามได้จริงจากการรัน เช่นเงื่อนไขบน placed_at ข้ามได้ 19 จาก 20 กลุ่ม
ส่วนเงื่อนไขบน customer ข้ามได้ 0 กลุ่ม
ตัวเลข 1,017 แถว กับ 995 แถว ในบทที่ 6 เป็นจำนวนแถวที่ตรงจริงจากการนับ มันมีไว้
พิสูจน์ว่าสองคำถามนั้นอยู่ในระดับเดียวกัน ไม่ได้มีไว้ประมาณอะไร
ประกาศไว้ตรงนี้ เพื่อไม่ให้ใครอ่านจบแล้วเชื่อว่าได้ของที่คอร์สนี้ไม่ได้ให้
- ไม่วัดความเร็ว ทั้งคอร์สไม่มีหน่วยเวลาสักตัว เหมือนคอร์สที่ 26 และ 28 ในเสาเดียวกัน
- ไม่แตะ vectorized execution และ SIMD เป็นเหตุผลใหญ่ข้อหนึ่งของเอนจินแนว column จริง
แต่ probe ของคอร์สนี้ไม่ได้วัดมันสักทรง และการวัดมันต้องใช้หน่วยเวลา
- ไม่แตะการบีบอัดทั่วไป อย่าง Snappy gzip หรือ zstd ไม่มีตัวไหนถูกวัด จึงไม่มีข้ออ้าง
- ไม่ใช่ Parquet ORC หรือ Arrow ของจริง ทุกข้ออ้างผูกกับคลังที่
colstore.py สร้างขึ้น
· Parquet ถูกอ้างในฐานะรูปแบบเท่านั้น ไม่ใช่ในฐานะของที่วัด
- ไม่แตะการเขียนและการอัปเดตแถว probe เขียนคลังครั้งเดียวแล้ววัดการอ่าน
- ไม่แตะ transaction และ isolation เป็นคำถามของคอร์สที่ 28 คนละคำถามกัน
ต้องอ่าน Python ออก ส่วนความรู้เรื่องคลังแนว column ไม่ต้องมีมาก่อนสักนิด
- Python ระดับอ่านออกและรันเองได้ ทุกบทเขียนด้วย Python 3 และ standard library ล้วน
- SQL ระดับเขียน
SELECT … WHERE เป็น พอ ไม่ต้องรู้เรื่อง tuning มาก่อน
- ไม่ต้องรู้จักคลังแนว column มาก่อน ทุกโครงสร้างถูกสร้างขึ้นใหม่ตั้งแต่ byte แรก
- ไม่บังคับว่าต้องอ่านคอร์สที่ 26 มาก่อน แต่ตัวเลขของสองคอร์สวางทาบกันได้ เพราะใช้ตาราง
ใบเดียวกันและตัวนับหน้าตัวเดียวกัน
- ตัวเลขทุกตัวรันเองได้ ด้วย
python3 scripts/column-store/probe.py โดยไม่ต้องเตรียม
อะไรก่อน และไม่มี container ให้เก็บกวาดทีหลัง
แผนผังนี้เติมขึ้นเองเมื่อบทเรียนถูกเพิ่มเข้ามา