ข้าม​ไป​ยัง​เนื้อหา

ชื่อ​เดียวกัน แต่​เป็นการ​เข้า​รหัส​คนละ​ตัว · บน id แบบ​หนึ่ง​ใช้ 14 บิต​ต่อ​ค่า อีก​แบบ​ใช้ 2 บิต​ต่อ​ค่า

id ของ​ตา​รา​งอ​อเด​อร์​เป็น​เลข​วิ่ง​ที​ละ​หนึ่ง คำ​ทำนาย​ที่​สม​เหตุ​สม​ผล​จึง​เขียน​ตัว​เอง​ออก​มา เก็บ​ส่วน​ต่าง​แทน​ตัว​ค่า แล้ว​หนึ่ง​บิต​ต่อ​ค่า​ก็​พอ

ผู้​เขียน probe เขียน​คำ​ทำนาย​นั้น​ไว้​ก่อน​วัด และ​การ​วัด​หัก​ล้าง​มัน

delta(frame of reference) บน id ใช้ 14 บิต​ต่อ​ค่า และ​ได้ 350,360 ไบต์ ส่วน delta(ส่วนต่างของตัวติดกัน) บน id ตัว​เดียวกัน​ใช้ 2 บิต​ต่อ​ค่า และ​ได้ 50,360 ไบต์

ทั้ง​สอง​ทรง​นี้​ถูก​เรียก​ว่า delta encoding เหมือน​กัน และ​นั่น​คือ​ทั้ง​บท

📦 ตัวเลข​ทุก​ตัว​ใน​บท​นี้​รัน​เอง​ได้ ไม่​ต้อง​มี Docker และ​ไม่​ต้อง​ต่อ​เน็ต

สั่ง python3 scripts/column-store/probe.py ได้​เลย มัน​ใช้ Python 3 กับ standard library ล้วน ไม่​ต้อง​ติด​ตั้ง​อะไร​ก่อน

ค่าที่​วัด​ได้​ทุก​ตัว​ที่​บท​นี้​พิมพ์​มี​คีย์​ของ​ตัว​เอง​อยู่​ใน scripts/column-store/expected/column-store.txt และ​ตาราง​ทุก​ใบ​ใน​บท​นี้​เขียน​ชื่อ​หัวข้อ กับ​ชื่อ​คีย์​กำกับ​ไว้

หัวข้อ​ที่​บท​นี้​อ่าน​เกือบ​ทั้ง​บท​คือ ### 10_ข้อที่ขัดกับตำรา ส่วน​ตัวเลข​ของ​ก้อน​มา​จาก ### สนามแข่ง

ชื่อ​เดียว แต่​เป็น​สอง​ทรง​ที่​เขียน​คนละ​อย่าง​ลง​คลัง

หัวข้อ​ที่​มีชื่อ​ว่า “ชื่อ​เดียว แต่​เป็น​สอง​ทรง​ที่​เขียน​คนละ​อย่าง​ลง​คลัง”

สอง​ทรง​นี้​ต่าง​กัน​ที่​ค่าที่​ถูก​ลบ​ออก​จาก​ตัว​ค่า และ​ความ​ต่าง​นั้น​อยู่​ใน​สอง​บรรทัด

delta encodingdelta encodingชื่อ​ที่​ใช้​เรียก​การ​เข้า​รหัส​สอง​แบบ​ซึ่ง​ไม่ใช่​แบบ​เดียวกัน · บน id ที่​เป็น​เลข​วิ่ง​ที​ละ​หนึ่ง แบบ frame of reference ได้ 350,360 ไบต์​ที่ 14 บิต​ต่อ​ค่า ส่วน​แบบ​ส่วน​ต่าง​ของ​ตัว​ติด​กัน​ได้ 50,360 ไบต์​ที่ 2 บิต​ต่อ​ค่า · บน total ผลก​ลับ​ด้าน คือ 450,360 ไบต์ เทียบ 475,320 ไบต์ เป็น​ชื่อ​ร่ม ใต้​ร่ม​นั้น​มี​สอง​ทรง​ที่ colstore.py เขียน​แยก​กัน และ​คอร์ส​นี้​เรียก​มัน​ด้วย​ชื่อ​ของ probe เสมอ

ทรง​แรก​คือ frame of referenceframe of reference (FOR)การ​เก็บ​ส่วน​ต่าง​จาก​ค่าที่​น้อย​ที่สุด​ใน row group นั้น · บน customer ได้ 275,360 ไบต์​ที่ 11 บิต​ต่อ​ค่า · บน placed_at ความ​กว้าง​ไม่​เท่า​กัน​ใน​แต่ละ​ก้อน probe คืน​ค่า​ออก​มา​เป็น​เซต คือ 17 · 18 · 19 · 20 · 21 · 22 บิต​ต่อ​ค่า ไม่ใช่​เป็น​ช่วง มัน​หา​ค่าที่​น้อย​ที่สุด​ใน column chunk ก้อน​นั้น แล้ว​เก็บ​ส่วน​ต่าง​จาก​ค่า​นั้น

scripts/column-store/colstore.py:204 — frame of reference
elif enc == DELTA:
# frame of reference: เก็บ min ไว้ในหัว แล้ว bit-pack ส่วนต่างจาก min
if kind != "u32":
raise ValueError("delta ใช้กับ column ตัวเลขเท่านั้น")
base = min(vals)
span = max(vals) - base
bits = max(1, span.bit_length())
body = pack_bits([v - base for v in vals], bits)

ทรง​ที่​สอง​เก็บ​ส่วน​ต่าง​จากค่าที่​อยู่​ก่อน​หน้า ไม่ใช่​จาก​ค่าที่​น้อย​ที่สุด

scripts/column-store/colstore.py:219 — ส่วน​ต่าง​ของ​ตัว​ที่​ติด​กัน
elif enc == DELTA2:
# ส่วนต่างของตัวที่ติดกัน · ห่อด้วย zigzag เพราะส่วนต่างติดลบได้
if kind != "u32":
raise ValueError("delta2 ใช้กับ column ตัวเลขเท่านั้น")
base = vals[0]
zz = [zigzag(vals[i] - vals[i - 1]) for i in range(1, n)]
bits = max(1, max(zz).bit_length()) if zz else 1
body = pack_bits(zz, bits)

zigzag ห่อ​จำนวนเต็ม​มี​เครื่องหมาย​ให้​เป็น​จำนวนเต็ม​ไม่มี​เครื่องหมาย เพราะ​ส่วน​ต่าง​ของ ตัว​ที่​ติด​กัน​ติดลบ​ได้ ส่วน pack_bits เป็น​ตัว​เดียว​กับ​ที่​บท​ที่ 4 ใช้

ค่าที่​วัด​ได้​บน column ตัว​เดียว สอง​ทรง สอง​ความ​กว้าง และ​สอง​ขนาด

id มี​ค่าที่​ไม่​ซ้ำ​เท่ากับ​จำนวน​แถว dictionary encoding จึง​แพ้​บน column ตัว​นี้​ตั้งแต่ บท​ที่ 3 คำถาม​ของ​บท​นี้​คือ แล้ว delta encoding ทำ​อะไร​กับ​มัน​ได้​บ้าง

หัวข้อ ### 10_ข้อที่ขัดกับตำรา → delta เทียบ dictionary บน column ที่ dictionary แพ้ → กลุ่ม id

ทรง​ที่​วัดคีย์​ใน​กลุ่ม idค่า
plain encodingraw800,360 ไบต์
dictionary encodingdict1,200,440 ไบต์
frame of referencedelta(frame of reference)350,360 ไบต์
ความ​กว้าง​ของ frame of referenceบิตต่อค่าของ delta(frame of reference)14 บิต​ต่อ​ค่า
ส่วน​ต่าง​ของ​ตัว​ติด​กันdelta(ส่วนต่างของตัวติดกัน)50,360 ไบต์
ความ​กว้าง​ของ​ส่วน​ต่าง​ของ​ตัว​ติด​กันบิตต่อค่าของ delta(ส่วนต่างของตัวติดกัน)2 บิต​ต่อ​ค่า

probe เก็บ​อัตราส่วน​ของ​สอง​ทรง​นี้​ไว้​ด้วย แต่​เก็บ​เทียบ​กับ raw ไม่​ได้​เก็บ​เทียบ​กันเอง

คีย์​ใน​กลุ่ม idค่า
delta หารด้วย raw0.4378
delta2 หารด้วย raw0.0629
ประโยค​ที่​บท​นี้​หัก​ล้าง

ประโยค​ที่​พบ​ทั่วไป​คือ delta encoding ทำให้ column ที่​เป็น​เลข​เรียง​เล็ก​ลง​มาก

ประโยค​นั้น​จริง​กับ​ทรง​เดียว​จาก​สอง​ทรง delta(ส่วนต่างของตัวติดกัน) บน id ได้ 50,360 ไบต์ ส่วน delta(frame of reference) บน id เดียวกัน​ได้ 350,360 ไบต์

ชื่อ​ของ​การ​เข้า​รหัส​ไม่​ได้​บอก​ว่า​มัน​ทำ​อะไร และ​เครื่อง​มือ​จริง​สอง​ตัว​ที่​เขียน​คำ​ว่า delta บน​หน้า​เอกสาร​ของ​มัน อาจ​หมาย​ถึง​คนละ​ทรง​กัน

ทำไม frame of reference ยัง​กิน 14 บิต บน column ที่​วิ่ง​ที​ละ​หนึ่ง

หัวข้อ​ที่​มีชื่อ​ว่า “ทำไม frame of reference ยัง​กิน 14 บิต บน column ที่​วิ่ง​ที​ละ​หนึ่ง”

ค่าที่​ถูก​ลบ​ออก​คือ​ค่าที่​น้อย​ที่สุด​ของ​ทั้ง​ก้อน ไม่ใช่​ค่าที่​อยู่​ก่อน​หน้า

base = min(vals) กับ span = max(vals) - base อ่าน​ค่า​ทั้ง​ก้อน​พร้อม​กัน ความ​กว้าง​ของ ตัว​รหัส​จึง​มา​จาก​ระยะ​ระหว่าง​ค่าที่​น้อย​ที่สุด​กับ​ค่าที่​มาก​ที่สุด​ของ​ก้อน

ของ​ที่​ตรึง​ไว้หัวข้อ · คีย์ค่า
จำนวน​แถว​ต่อ​หนึ่ง​ก้อน### สนามแข่ง · row group ปริยาย10,000
จำนวน​ก้อน​ทั้ง​คลัง### สนามแข่ง · row group ทั้งหมด20

id วิ่ง​ที​ละ​หนึ่ง ระยะ​จาก​ค่า​แรก​ถึง​ค่า​สุดท้าย​ของ​ก้อน​จึง​เกือบ​เท่า​จำนวน​แถว​ใน​ก้อน ไม่ใช่​เท่ากับ​หนึ่ง ผล​ที่​ได้​คือ 14 บิต​ต่อ​ค่า

ความ​กว้าง​ของ​ตัว​รหัส (bit widthbit widthจำนวน​บิต​ที่​ใช้​ต่อ​หนึ่ง​ค่า และ​ที่มา​ของ​มัน​ต่าง​กัน​ตาม​การ​เข้า​รหัส · bit packing เอา​มา​จาก​จำนวน​ค่าที่​ไม่​ซ้ำ​ใน column chunk นั้น ส่วน frame of reference เอา​มา​จาก​ระยะ​ระหว่าง​ค่าที่​มาก​ที่สุด​กับ​ค่าที่​น้อย​ที่สุด​ใน​ก้อน​เดียวกัน · ทั้ง​สอง​แบบ​เป็น​ค่า​ต่อ row group ไม่ใช่​ค่า​ต่อ​ทั้ง column ดัง​นั้น column ตัว​เดียวกัน​มี​ความ​กว้าง​ไม่​เท่า​กัน​ใน​แต่ละ​ก้อน​ได้) เป็น​สิ่ง​ที่​ทรง​ของ​การ​เข้า​รหัส​กำหนด ไม่ใช่​สิ่ง​ที่​รูป​ของ ข้อมูล​กำหนด​เพียง​ลำพัง ข้อมูล​ชุด​เดียวกัน​ให้ 14 กับ​ทรง​หนึ่ง และ​ให้ 2 กับ​อีก​ทรง​หนึ่ง

ทรง​ที่​สอง​ลบ​ค่าที่​อยู่​ก่อน​หน้า​ออก ส่วน​ต่าง​ของ id สอง​ตัว​ที่​ติด​กัน​จึง​เป็น​หนึ่ง​เกือบ​ทุก​คู่ และ​หลัง​ห่อ​ด้วย zigzag แล้ว ความ​กว้าง​ที่ probe วัด​ได้​คือ 2 บิต​ต่อ​ค่า

customer กับ total กลับ​ด้าน และ​นั่น​คือ​ราคา​ของ​การ​เลือก

หัวข้อ​ที่​มีชื่อ​ว่า “customer กับ total กลับ​ด้าน และ​นั่น​คือ​ราคา​ของ​การ​เลือก”

สอง​ทรง​เดียวกัน​บน​อีก​สอง column และ​คราว​นี้ frame of reference เป็น​ฝ่าย​ชนะ

หัวข้อ ### 10_ข้อที่ขัดกับตำรา → delta เทียบ dictionary บน column ที่ dictionary แพ้ → กลุ่ม customer และ​กลุ่ม total

คีย์กลุ่ม customerกลุ่ม total
raw800,360 ไบต์800,360 ไบต์
dict559,336 ไบต์1,180,592 ไบต์
delta(frame of reference)275,360 ไบต์450,360 ไบต์
บิตต่อค่าของ delta(frame of reference)11 บิต​ต่อ​ค่า18 บิต​ต่อ​ค่า
delta(ส่วนต่างของตัวติดกัน)300,340 ไบต์475,320 ไบต์
บิตต่อค่าของ delta(ส่วนต่างของตัวติดกัน)12 บิต​ต่อ​ค่า19 บิต​ต่อ​ค่า
delta หารด้วย raw0.3440.5627
delta2 หารด้วย raw0.37530.5939

total เป็น​ค่า​เงิน​ที่​สุ่ม​ล้วน ค่า​สอง​ตัว​ที่​ติด​กัน​จึง​ไม่​ได้​ใกล้​กัน​เลย ส่วน​ต่าง​ของ​มัน​กิน​ช่วง ที่​กว้าง​กว่า​ช่วง​ของ​ตัว​ค่า​เอง ความ​กว้าง​จึง​ขึ้น​จาก 18 เป็น 19 บิต​ต่อ​ค่า

customer เดิน​ตาม​รูป​เดียวกัน คือ 11 บิต​ต่อ​ค่า​กับ frame of reference และ 12 บิต​ต่อ​ค่า​กับ​ส่วน​ต่าง​ของ​ตัว​ติด​กัน

ไม่มี​ทรง​ไหน​ชนะ​ทุก column ทรง​ที่​ชนะ​ขาด​บน id เป็น​ทรง​ที่​แพ้​บน total และ​การ​เลือก จึง​ต้อง​เลือก​ที​ละ column ไม่ใช่​เลือก​ครั้ง​เดียว​ให้​ทั้ง​คลัง

ความ​กว้าง​เป็น​ค่า​ต่อ​ก้อน ไม่ใช่​ค่า​ต่อ​ทั้ง column และ column ตัว​นี้​แสดง​ข้อ​นั้น​ออก​มา

บิตต่อค่า ที่ probe เก็บ​ไว้​เป็น​เซต​ของ​ค่าที่​พบ​ใน​ทุก​ก้อน สาม column ก่อน​หน้า​คืน​เซต​ที่​มี สมาชิก​ตัว​เดียว ส่วน placed_at ไม่ใช่

หัวข้อ ### 10_ข้อที่ขัดกับตำรา → delta เทียบ dictionary บน column ที่ dictionary แพ้ → กลุ่ม placed_at

คีย์​ใน​กลุ่ม placed_atค่า
raw800,360 ไบต์
dict1,188,004 ไบต์
delta(frame of reference)491,610 ไบต์
บิตต่อค่าของ delta(frame of reference)17 · 18 · 19 · 20 · 21 · 22 บิต​ต่อ​ค่า
delta(ส่วนต่างของตัวติดกัน)276,589 ไบต์
บิตต่อค่าของ delta(ส่วนต่างของตัวติดกัน)10 · 11 · 12 · 16 บิต​ต่อ​ค่า
delta หารด้วย raw0.6142
delta2 หารด้วย raw0.3456

ค่า​ใน​สอง​แถว​ของ​ความ​กว้าง​เป็น​เซต​ที่​เรียง​แล้ว แถว​ล่าง​ไม่มี 13 · 14 · 15 เซต​นั้น​บอก​ว่า ก้อน​ไหน​ก้อน​หนึ่ง​มี​คู่​ที่​ห่าง​กัน​มากกว่า​ก้อน​อื่น ไม่​ได้​บอก​ว่า​ทุก​ก้อน​ไล่​ความ​กว้าง​ขึ้น​ที​ละ​หนึ่ง

ผล​ที่​ตาม​มา​มี​สอง​ข้อ

  • ก้อน​หนึ่ง​เลือก​การ​เข้า​รหัส​ของ​ตัว​เอง​ได้ ความ​กว้าง​จึง​ตอบ​สนอง​ต่อ​ข้อมูล​ใน​ก้อน​นั้น ไม่ใช่​ต่อ​ค่าที่​แย่​ที่สุด​ของ​ทั้ง column
  • ค่าที่​รายงาน​ต่อ​ทั้ง column เป็น​เซต ไม่ใช่​ค่า​เดียว การ​พิมพ์​ค่า​เดียว​จึง​เป็นการ​พิมพ์ ค่า​ของ​ก้อน​หนึ่ง แล้ว​เรียก​มัน​ว่า​ค่า​ของ​ทั้ง column

ค่าที่​ถูก​ลบ​ออก​ต่าง​กัน ความ​กว้าง​จึง​ต่าง​กัน และ​ขนาด​ที่​ได้​ก็​ต่าง​กัน

flowchart TB
  ID["column id · เลขวิ่งทีละหนึ่ง · 20 row group ก้อนละ 10,000 แถว"]
  ID --> F["frame of reference · ลบค่าที่น้อยที่สุดของก้อนออก"]
  ID --> S["ส่วนต่างของตัวติดกัน · ลบค่าที่อยู่ก่อนหน้าออก"]
  F --> FB["ความกว้าง 14 บิตต่อค่า"]
  S --> SB["ความกว้าง 2 บิตต่อค่า"]
  FB --> FZ["350,360 ไบต์"]
  SB --> SZ["50,360 ไบต์"]

คำ​บรรยาย​ภาพ: สอง​กิ่ง​อ่าน column ตัว​เดียวกัน วาง​แนว​เหมือน​กัน และ​ตัด​ก้อน​เท่า​กัน ต่าง​กัน​ที่​ค่าที่​ถูก​ลบ​ออก​จาก​ตัว​ค่า​เท่านั้น กิ่ง​ซ้าย​คือ​ทรง​ที่​ตำรา​เรียก​ว่า delta encoding และ​กิ่ง​ขวา​ก็​ถูก​เรียก​ด้วย​ชื่อ​เดียวกัน

เลือก​ให้​ถูก​ต่อ column แล้ว​ทั้ง​คลัง​เหลือ​เท่าไร

หัวข้อ​ที่​มีชื่อ​ว่า “เลือก​ให้​ถูก​ต่อ column แล้ว​ทั้ง​คลัง​เหลือ​เท่าไร”

การ​เข้า​รหัส​สาม​แบบ​ชนะ​แบบ​ละ​สอง column พอดี และ​ไม่มี​แบบ​ไหน​ชนะ​เกิน​สอง

หัวข้อ ### 10_ข้อที่ขัดกับตำรา → คลังทั้งใบเมื่อเลือกการเข้ารหัสที่ดีที่สุดต่อ column

columnคีย์ การเข้ารหัสที่เล็กที่สุดคีย์ ไบต์
iddelta(ส่วนต่างของตัวติดกัน)50,360
customerdelta(frame of reference)275,360
statusbitpack76,740
restaurantbitpack108,680
placed_atdelta(ส่วนต่างของตัวติดกัน)276,589
totaldelta(frame of reference)450,360

นับ​ชื่อ​ใน​ช่อง​กลาง bitpack ได้​สอง delta(frame of reference) ได้​สอง และ delta(ส่วนต่างของตัวติดกัน) ได้​สอง

ทรง​ที่​วัดคีย์​ใน​กลุ่ม​เดียวกันค่า
คลัง column เมื่อ​เลือก​ที​ละ columnไบต์รวม1,238,089 ไบต์
คลัง column เมื่อ​เลือก​ที​ละ columnหน้ารวม305 หน้า
heap ที่ heapfile.build_heap เขียนheap ไบต์12,914,688 ไบต์
heap ที่ heapfile.build_heap เขียนheap หน้า3153 หน้า

สอง​แถว​ล่าง​เป็น​ของ heap ที่ scripts/query-engine/qe/heapfile.py เขียน ไม่ใช่​ของ​อะไร​ที่ colstore.py เขียน คอร์ส​นี้​ไม่​แก้​อะไร​ใน scripts/query-engine/qe/ แม้แต่ byte เดียว

ตาราง​นี้​ไม่ใช่​สูตร​สำเร็จ

ช่อง​กลาง​ของ​ตาราง​แรก​เป็น​ผล​ของ ตาราง​ใบ​นี้ ที่ seed นี้ ที่ row group ขนาด 10,000 ไม่ใช่​กฎ​ที่​ยก​ไป​ใช้​กับ​ตาราง​ใบ​อื่น​ได้

สิ่ง​ที่​ยก​ไป​ใช้ได้​คือ​วิธี คือ​วัด​ทุก​ทรง​บน​ข้อมูล​จริง​ของ​ตัว​เอง แล้ว​เลือก​ที​ละ column · id กับ placed_at เลือก​คนละ​ทรง​กับ customer กับ total ทั้ง​ที่​ทั้ง​สี่​ตัว​เป็น​เลข

🔁 บท​ที่​บท​นี้​ต่อ​ออก​มา และ​บท​ที่มา​เก็บ​ผล

รู้​แล้ว​ว่า​เลือก​การ​เข้า​รหัส​อย่างไร ยัง​ไม่รู้​ว่า​จะ​ไม่​อ่าน​ทั้ง​ก้อน​ได้​เมื่อไร

ทั้ง​บท​นี้​วัด​ขนาด คือ​ไบต์​ที่​ค่า​หนึ่ง​ค่า​กิน​หลัง​เข้า​รหัส หน่วย​นั้น​ตอบ​ว่า​คลัง​ใหญ่​แค่​ไหน แต่​ไม่​ได้​ตอบ​ว่า​คำถาม​หนึ่ง​คำถาม​ต้อง​แตะ​กี่​หน้า

การ​เข้า​รหัส​ที่​เล็ก​ที่สุด​ยัง​ต้อง​ถูก​อ่าน​ทั้ง​ก้อน ถ้า​ไม่มี​อะไร​บอก​ล่วง​หน้า​ว่า​ก้อน​นั้น​ไม่มี แถว​ที่​ตรง​เลย

บท​ที่ 6 วัด​กลไก​ที่​ตัด​ทั้ง​ก้อน​ทิ้ง​โดย​ไม่​อ่าน​ข้าง​ใน แล้ว​พบ​ว่า column ที่​มี​ค่า​ไม่​ซ้ำ​เป็น​แสน ตัว​หนึ่ง​ข้าม​ได้​เกือบ​ทุก​ก้อน ส่วน​อีก​ตัว​ข้าม​ไม่​ได้​สัก​ก้อน


🔗 อ้างอิง​ต้นทาง​ของ​บท​นี้
  • Apache Parquet — Encodings (เข้า​ถึง 2026-09-10) — ที่มา​ของ​ข้อ​ที่​ว่า​รูป​แบบ​หนึ่ง​รูป​แบบ​นิยาม​การ​เข้า​รหัส​ตระกูล delta ไว้​มากกว่า​หนึ่ง​ตัว และ​แต่ละ​ตัว​เก็บ​ค่าที่​ต่าง​กัน​เป็น​ฐาน · คอร์ส​นี้​อ้าง​ข้อ​นี้ ใน​ฐานะ​สิ่ง​ที่​รูป​แบบ​กำหนด ไม่ใช่​ใน​ฐานะ​สิ่ง​ที่ probe วัด

  • คลัง​ของ​คอร์ส​นี้​ไม่ใช่ Parquet ทรง​ทั้ง​สอง​ที่​บท​นี้​วัด​เขียน​ด้วย scripts/column-store/colstore.py บรรทัด​ที่ 204 และ​บรรทัด​ที่ 219 · zigzag อยู่​ที่ บรรทัด​ที่ 95 · ชื่อ​ของ​ทั้ง​สอง​ทรง​มา​จาก ENC_NAME ที่​บรรทัด​ที่ 41

  • ตัวเลข​ทุก​ตัว​ใน​บท​นี้​มา​จาก python3 scripts/column-store/probe.py ซึ่ง​สร้าง​คลัง​ขึ้น​ใหม่ ทุกร​อบ​จาก fixture.py ของ​คอร์ส​ที่ 26 · ค่าที่​ตรึง​ไว้​อยู่​ที่ scripts/column-store/expected/column-store.txt หัวข้อ ### 10_ข้อที่ขัดกับตำรา และ ### สนามแข่ง

เช็กความเข้าใจ — บทที่ 5

ข้อ 1 / 3

บน column `id` ที่เป็นเลขวิ่งทีละหนึ่ง frame of reference ใช้ความกว้างเท่าไรต่อค่า