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

ใส่ dictionary ให้​ครบ​ทุก column แล้ว​สาม column ใหญ่​ขึ้น · id จาก 800,360 เป็น 1,200,440 ไบต์

บท​ที่ 1 พิสูจน์​ว่า heap แทน status ด้วย​ตัว​รหัส​หนึ่ง byte มา​ตั้งแต่​ต้น คำถาม​ที่​ตาม​มา​เอง​คือ ถ้า​กลไก​นั้น​ดี​ขนาด​นั้น ใส่​ให้​ครบ​ทุก column เลย​จะ​เป็น​อย่างไร

บท​นี้​ทำ​แบบ​นั้น​ตรงๆ ตาราง​ใบ​เดิม คลัง​ใบ​เดิม การ​วาง​แนว​เหมือน​เดิม​ทุก​อย่าง เปลี่ยน​อย่าง​เดียว​คือ​ให้​ทั้ง​หก column เก็บ​ตัว​รหัส​แทน​การ​เก็บ​ค่า​ตาม​ที่​มัน​เป็น

คำ​ทำนาย​ที่​สม​เหตุ​สม​ผล​คือ​ทุก column เล็ก​ลง ค่าที่​วัด​ได้​ตอบ​ว่า สาม column ใหญ่​ขึ้น

id ใช้ 800,360 ไบต์ ใน​ทรง​ที่​ยัง​ไม่​เข้า​รหัส แล้ว​ขึ้น​เป็น 1,200,440 ไบต์ ใน​ทรง​ที่​ใส่ dictionary

บท​นี้​ตอบ​ว่า​เส้น​ที่​แยก​ฝั่ง​ที่​เล็ก​ลง​ออก​จาก​ฝั่ง​ที่​ใหญ่​ขึ้น อยู่​ตรง​ไหน

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

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

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

ตัวเลข​ที่​ไม่มี​คีย์​ของ​ตัว​เอง​ใน​ผล​ของ probe ไม่มี​อยู่​ใน​บท​นี้ อัตราส่วน​ที่​บท​นี้​พิมพ์ มี​คีย์​ชื่อ dict หารด้วย raw และ​ไม่​ได้​คำนวณ​ขึ้น​ใหม่​ที่​นี่

คำ​ทำนาย​ที่​สม​เหตุ​สม​ผล และ​สาม column ที่​หัก​ล้าง​มัน

หัวข้อ​ที่​มีชื่อ​ว่า “คำ​ทำนาย​ที่​สม​เหตุ​สม​ผล และ​สาม column ที่​หัก​ล้าง​มัน”

ตำรา​จับ​คู่ dictionary encoding กับ​คำ​ว่า​เล็ก​ลง ค่าที่​วัด​ได้​แยก​หก column ออก​เป็น​สอง​ฝั่ง​ฝั่ง​ละ​สาม

ทรง​ตั้ง​ต้น​ของ​การ​เทียบ​คือ plain encodingplain encodingการ​เก็บ​ค่า​ตาม​ที่​มัน​เป็น โดย​ไม่มี​ตัว​รหัส​มา​แทน · เป็น​เส้น​ฐาน​ที่​คอร์ส​นี้​เทียบ​การ​เข้า​รหัส​ทุก​แบบ​กลับ​มา​หา และ​เป็น​ทรง​เดียว​ที่ column สตริง​จ่าย​เต็ม​ความ​ยาว​ของ​สตริง​ทุก​แถว คือ​เก็บ​ค่า​ตาม​ที่​มัน​เป็น​โดย​ไม่มี​ตัว​รหัส​มา​แทน ทรง​ที่​สอง​คือ dictionary encodingdictionary encodingการ​เก็บ​ค่าที่​ไม่​ซ้ำ​ไว้​ใน​ตาราง​ใบ​หนึ่ง แล้ว​เก็บ​เฉพาะ​ตัว​รหัส​ที่​ชี้​เข้าไป · heap ของ​คอร์ส​ที่ 26 ทำ​สิ่ง​นี้​อยู่​ก่อน​แล้ว​ที่ heapfile.py:18 ด้วย STATUS.index(st) · และ​มัน​ไม่​ได้​ทำให้​เล็ก​ลง​เสมอ เงื่อนไข​ที่​ตัดสิน​คือ​จำนวน​ค่าที่​ไม่​ซ้ำ​ใน row group เดียว ไม่ใช่​ทั้ง column คือ​เก็บ​รายการ​ค่าที่​ไม่​ซ้ำ​ไว้ แล้ว​เขียน​ตำแหน่ง​ใน​รายการ​นั้น​ลง​แทน​ค่า​จริง

สอง​ทรง​นี้​อ่าน​ตาราง​ใบ​เดียวกัน ตัด​ก้อน​เท่า​กัน และ​วาง​แนว​เหมือน​กัน​ทุก​อย่าง ตัวแปร​ที่​เหลือ​อยู่​ตัว​เดียว​คือ​การ​เข้า​รหัส

columnraw ไบต์dict ไบต์ส่วนต่าง (บวก = dict ใหญ่กว่า)dict ใหญ่กว่า raw
id800,3601,200,440+400,080true
placed_at800,3601,188,004+387,644true
total800,3601,180,592+380,232true
customer800,360559,336-241,024false
status1,985,792201,740-1,784,052false
restaurant8,398,262208,680-8,189,582false

สาม​แถว​บน​คือ​ฝั่ง​ที่​หัก​ล้าง​คำ​ทำนาย การ​ใส่ dictionary ให้ column พวก​นั้น​ไม่​ได้​ทำให้​เล็ก​ลง มัน​ทำให้​ใหญ่​ขึ้น และ probe เก็บ​ข้อ​นี้​ไว้​เป็น​บู​ลี​นข​อง​ตัว​เอง​ที่​คีย์ dict ใหญ่กว่า raw

ประโยค​ที่​บท​นี้​หัก​ล้าง

ประโยค​ที่​พบ​ทั่วไป​คือ dictionary encoding ทำให้ column เล็ก​ลง เพราะ​มัน​แทน​ค่าที่​ซ้ำ​กัน​ด้วย​ตัว​รหัส​สั้นๆ

ครึ่ง​หลัง​ของ​ประโยค​นั้น​ถูก และ​สาม​แถว​ล่าง​ของ​ตาราง​ข้าง​บน​คือ​หลัก​ฐาน​ว่า​มัน​จ่าย​คืน​จริง

ครึ่ง​แรก​ไม่​ถูก มัน​เติม​คำ​ว่า เสมอ เข้าไป​เอง id placed_at และ total มี​ค่า ส่วนต่าง (บวก = dict ใหญ่กว่า) เป็น​บวก​ทั้ง​สาม​ตัว

จำนวน​ค่าที่​ไม่​ซ้ำ​ทั้ง column ทำนาย​ผล​ไม่​ได้ ตัว​ที่​ทำนาย​ได้​คือ​จำนวน​ค่าที่​ไม่​ซ้ำ​ใน​หนึ่ง​ก้อน

คลัง column ตัด​แถว​ออก​เป็น​ก้อน ก้อน​ละ​เท่า​กัน และ​ค่าที่​ตรึง​ไว้​อยู่​ใน​หมวด ### สนามแข่ง ของ​ผล​ของ probe

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

การ​เข้า​รหัส​เป็น​ค่า​ต่อ​ก้อน ไม่ใช่​ค่า​ต่อ​ทั้ง column ก้อน​หนึ่ง​จึง​สร้าง​รายการ​ค่าที่​ไม่​ซ้ำ ของ​ตัว​เอง​ขึ้น​มา​ใบ​หนึ่ง โดย​ไม่รู้​ว่า​ก้อน​อื่น​เก็บ​อะไร​ไว้

probe เก็บ​ทั้ง​สอง​ตัวเลข​ไว้​คนละ​คีย์​ให้​เทียบ​กัน​ได้​ตรงๆ

columnค่าที่ไม่ซ้ำทั้ง columnค่าที่ไม่ซ้ำมากสุดใน row group เดียวdict ใหญ่กว่า raw
id200,00010,000true
placed_at196,8919,991true
total125,3279,771true
customer2,0001,994false
restaurant1010false
status77false

total มี​ค่าที่​ไม่​ซ้ำ​ทั้ง column 125,327 ค่า ส่วน placed_at มี 196,891 ค่า ตัวเลข​สอง​ตัว​นี้​ต่าง​กัน​มาก แต่​ทั้ง​คู่​ตก​ฝั่ง​เดียวกัน​ใน​ตาราง​แรก

ค่าที่​ทำนาย​ฝั่ง​ได้​คือ column ขวา id มี 10,000 ค่าที่​ไม่​ซ้ำ​ใน​กลุ่ม​เดียว เท่ากับ row group ปริยาย พอดี ส่วน restaurant มี 10

กลไก​อยู่​ใน​สอง​ส่วน​ของ colstore.py และ​มัน​เขียน dictionary ลง​คลัง​ใหม่​ทุก​ก้อน

chunk หนึ่ง​อัน​คือ​หัว​ขนาด​คงที่ ตาม​ด้วย dictionary ของ​ก้อน​นั้น แล้ว​ตาม​ด้วย​ตัว​รหัส fence ข้าง​ล่าง​สร้าง​สอง​ส่วน​หลัง คือ db กับ body ส่วน​บรรทัด​ที่ 174 ของ colstore.py เป็น​บรรทัด​ที่​ต่อ​ทั้ง​สาม​ส่วน​เข้า​ด้วย​กัน

scripts/column-store/colstore.py:155 — หัว​ที่ dictionary encoding กับ bit packing ใช้​ร่วม​กัน
elif enc in (DICT, BITPACK):
vs = sorted(set(vals))
ix = {v: i for i, v in enumerate(vs)}
codes = [ix[v] for v in vals]
db = dict_blob(vs, kind)
if enc == DICT:
w = 1 if len(vs) <= 256 else (2 if len(vs) <= 65536 else 4)
fmt = {1: "<B", 2: "<H", 4: "<I"}[w]
body = b"".join(struct.pack(fmt, c) for c in codes)
bits = w * 8
m["fixed_width"] = w

vs คือ​รายการ​ค่าที่​ไม่​ซ้ำ ของ​ก้อน​นั้น​ก้อน​เดียว เพราะ vals ที่​ส่ง​เข้า​มา​คือ​ค่า​ของ​ก้อน​นั้น ส่วน codes คือ​ตำแหน่ง​ใน​รายการ​นั้น

dict_blob เขียน​รายการ vs ลง​คลัง​ทั้ง​ใบ คือ​เขียน​จำนวน​สมาชิก​ไว้​ข้าง​หน้า แล้ว​ตาม​ด้วย ค่า​ทุก​ตัว​เต็มๆ ไม่​ได้​ย่อ​อะไร​เลย

scripts/column-store/colstore.py:104 — ตัว​ที่​เขียน dictionary ลง​คลัง
def dict_blob(vals, kind):
if kind == "u32":
return struct.pack("<I", len(vals)) + b"".join(struct.pack("<I", v) for v in vals)
parts = [struct.pack("<I", len(vals))]
for v in vals:
b = v.encode()
parts.append(bytes([len(b)]) + b)
return b"".join(parts)

บัญชี​ของ chunk จึง​มี​สอง​ก้อน​ที่​ต้อง​จ่าย คือ​ตัว​รหัส​หนึ่ง​ชุด​ต่อ​แถว บวก dictionary หนึ่ง​ใบ​ต่อ​ก้อน ตัว​รหัส​แคบ​กว่า​ค่า​เดิม ส่วน dictionary เป็น​ของ​ที่​เพิ่ม​เข้า​มา​ใหม่​ทั้ง​ดุ้น

ค่าที่​ไม่​ซ้ำ​ใน​กลุ่ม​เท่ากับ​จำนวน​แถว​ของ​กลุ่ม​พอดี dictionary จึง​เก็บ​ทุก​ค่า​ซ้ำ​อีก​รอบ​หนึ่ง

id เป็น​เลข​วิ่ง​ขอ​งอ​อเด​อร์ ไม่มี​ค่า​ไหน​ซ้ำ​กับ​ค่า​ไหน คีย์ ค่าที่ไม่ซ้ำมากสุดใน row group เดียว ของ​มัน​จึง​เป็น 10,000 ซึ่ง​เท่ากับ row group ปริยาย พอดี

รายการ vs ของ​ก้อน​นั้น​จึง​ยาว​เท่ากับ​จำนวน​แถว​ของ​ก้อน dictionary หนึ่ง​ใบ​เก็บ​ค่า​เดิม​ครบ​ทุก​ค่า โดย​ไม่มี​ค่า​ไหน​ถูก​ใช้​ซ้ำ​เลย​แม้แต่​ครั้ง​เดียว

ทรง​ที่​วัดคีย์​ใน​ผล​ของ probeไบต์
id · plain encodingraw ไบต์800,360
id · dictionary encodingdict ไบต์1,200,440
ส่วน​ต่าง​ของ​สอง​แถว​บนส่วนต่าง (บวก = dict ใหญ่กว่า)+400,080
คีย์​ใน​ผล​ของ probeค่า
id → dict หารด้วย raw1.5

placed_at กับ total อยู่​ฝั่ง​เดียวกัน​ด้วย​เหตุผล​เดียวกัน คีย์ ค่าที่ไม่ซ้ำมากสุดใน row group เดียว ของ​สอง​ตัว​นี้​คือ 9,991 และ 9,771

ทั้ง​คู่​ยัง​ไม่​ถึง 10,000 แต่​ใกล้​พอที่ dictionary จะ​เก็บ​เกือบ​ทุก​แถว​ซ้ำ​อีก​รอบ ค่า dict หารด้วย raw ของ​มัน​คือ 1.484 และ 1.475

restaurant คือ​ขั้ว​ตรง​ข้าม และ​มัน​ไป​ไกล​กว่า​ที่​ตาราง​อื่น​ชวน​ให้​คิด

หัวข้อ​ที่​มีชื่อ​ว่า “restaurant คือ​ขั้ว​ตรง​ข้าม และ​มัน​ไป​ไกล​กว่า​ที่​ตาราง​อื่น​ชวน​ให้​คิด”

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

restaurant เป็น​ชื่อ​ร้าน มี​ค่าที่​ไม่​ซ้ำ​ทั้ง column 10 ค่า และ​ใน​ก้อน​เดียว​ก็​ยัง​เป็น 10 เท่า​เดิม dictionary ของ​ทุก​ก้อน​จึง​มี​สมาชิก​สิบ​ตัว

ทรง plain encoding ของ column ตัว​นี้​เขียน​ชื่อ​ร้าน​เต็มๆ ใหม่​ทุก​แถว ซึ่ง​เป็น​กลไก​เดียว​กับ ที่​บท​ที่ 1 วัด​ไว้​กับ status

ทรง​ที่​วัดคีย์​ใน​ผล​ของ probeไบต์
restaurant · plain encodingraw ไบต์8,398,262
restaurant · dictionary encodingdict ไบต์208,680
ส่วน​ต่าง​ของ​สอง​แถว​บนส่วนต่าง (บวก = dict ใหญ่กว่า)-8,189,582
คีย์​ใน​ผล​ของ probeค่า
restaurant → dict หารด้วย raw0.025
status → dict หารด้วย raw0.102
customer → dict หารด้วย raw0.699

customer เป็น​ตัว​ที่​อ่าน​ยาก​ที่สุด​ใน​สาม​ตัว​นี้ มัน​มี​ค่าที่​ไม่​ซ้ำ​ทั้ง column 2,000 ค่า และ​ใน​ก้อน​เดียว 1,994 ค่า ซึ่ง​ใกล้ 2,000 มาก

แต่​ก้อน​หนึ่ง​มี 10,000 แถว ค่า​หนึ่ง​ค่า​จึง​ถูก​ใช้​ซ้ำ​หลาย​ครั้ง​ภายใน​ก้อน​เดียวกัน dict ไบต์ ของ​มัน​คือ 559,336 เทียบ raw ไบต์ ที่ 800,360

สอง​อย่าง​ที่​ตาราง​ข้าง​บน​ไม่​ได้​พูด

ชนิด​ของ​ค่า​ไม่ใช่​ตัว​ตัดสิน customer เป็น​เลข​และ​มัน​เล็ก​ลง ส่วน id ก็​เป็น​เลข และ​มัน​ใหญ่​ขึ้น สอง​ตัว​นี้​มี raw ไบต์ เท่า​กัน​ที่ 800,360

จำนวน​ค่าที่​ไม่​ซ้ำ​ทั้ง column ก็​ไม่ใช่​ตัว​ตัดสิน total มี 125,327 ค่า และ placed_at มี 196,891 ค่า ต่าง​กัน​คนละ​ระดับ แต่​ตก​ฝั่ง​เดียวกัน

ตัว​ที่​ตัดสิน​คือ​คีย์ ค่าที่ไม่ซ้ำมากสุดใน row group เดียว เทียบ​กับ row group ปริยาย ที่ 10,000 และ​นั่น​คือ​ขอบ​ของ​ก้อน ไม่ใช่​คุณสมบัติ​ของ column

ก้อน​เดียวกัน กลไก​เดียวกัน แล้ว​สิ่ง​ที่​ต่าง​คือ​รายการ​ค่าที่​ไม่​ซ้ำ​ของ​ก้อน​นั้น​ยาว​แค่​ไหน

flowchart TB
  G["หนึ่ง row group · 10,000 แถว · คีย์ row group ปริยาย"]
  G --> A["ขั้วที่ dictionary เป็นภาระ · column id"]
  G --> B["ขั้วที่ dictionary จ่ายคืน · column restaurant"]
  A --> A1["ค่าที่ไม่ซ้ำมากสุดในกลุ่มเดียว · 10,000 ค่า"]
  A1 --> A2["dictionary เก็บทุกค่าซ้ำอีกรอบ ไม่มีค่าไหนถูกใช้ซ้ำ"]
  A2 --> A3["raw 800,360 ไบต์ · dict 1,200,440 ไบต์"]
  B --> B1["ค่าที่ไม่ซ้ำมากสุดในกลุ่มเดียว · 10 ค่า"]
  B1 --> B2["dictionary สิบสมาชิก ส่วนตัวรหัสกินที่แทนชื่อร้านเต็มๆ"]
  B2 --> B3["raw 8,398,262 ไบต์ · dict 208,680 ไบต์"]

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

ไบต์​มา​จาก​การ​รัน ส่วน​ข้อ​ที่​ว่า dictionary ผูก​กับ​ก้อน​ไหน มา​จาก​รูป​แบบ และ​สอง​อย่าง​นี้​เป็น​คนละ​หลัก​ฐาน

ค่า 800,360 กับ 1,200,440 เป็น​สิ่ง​ที่ probe วัด​จาก​คลัง​ที่ colstore.py เขียน​ลง​จริง และ​ค่า​ไบต์​ของ​ทั้ง​หก column ใน​บท​นี้​อ่าน​จาก​หมวด ### 3_dict_เทียบ_raw ของ​ผล​ชุด​เดียวกัน

ส่วน​ข้อ​ที่​ว่า dictionary เป็น​ของ​ประจำ column chunk ไม่ใช่​ของ​ประจำ​ทั้ง column เป็น​สิ่ง​ที่​รูป​แบบ​ของ Parquet กำหนด​ไว้ และ​คลัง​ของ​คอร์ส​นี้​ยืม​รูป​นั้น​มา

รูป​แบบ​นั้น​ยัง​กำหนด​ทาง​ถอย​ไว้​ด้วย คือ​ตัว​เขียน​ถอย​กลับ​ไป​ใช้ PLAIN เมื่อ dictionary ของ​ก้อน​โต​เกิน​เพดาน​ที่​ตั้ง​ไว้ คลัง​ของ​คอร์ส​นี้​ไม่มี​ทาง​ถอย​นั้น มัน​ใส่ dictionary ตาม​ที่​สั่ง ตัวเลข​ของ id จึง​เป็น​ตัวเลข​ของ​กรณี​ที่​ตัว​เขียน​จริง​จะ​หลบ​ไป​แล้ว

รู้​แล้ว​ว่า​เมื่อไร​ควร​ใส่ dictionary ยัง​ไม่รู้​ว่า​ตัว​รหัส​ต้อง​กว้าง​เท่าไร

fence แรก​ของ​บท​นี้​เลือก​ความ​กว้าง​ของ​ตัว​รหัส​ที่​บรรทัด​ซึ่ง​ตั้ง​ค่า w แล้ว​ส่ง w ต่อ​ไป​ให้ struct.pack ค่าที่ w รับ​ได้​ทุก​ค่า​ใน​บรรทัด​นั้น​มี​หน่วย​เป็น byte เต็ม

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

บท​ที่ 4 · bit ไม่ใช่ byte ถอด​ข้อ​จำกัด​นั้น​ออก แล้ว​วัด​ว่า​เหลือ​เท่าไร โดย​ไม่​เปลี่ยน​อย่าง​อื่น​สัก​อย่าง


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

  • Apache Parquet — Encodings (เข้า​ถึง 2026-09-10) — ที่มา​ของ​ข้อ​ที่​ว่า dictionary เป็น​ของ​ประจำ column chunk “The dictionary will be stored in a dictionary page per column chunk” และ​ของ​ข้อ​ที่​ว่า ตัว​เขียน​ถอย​กลับ​ไป​ใช้ PLAIN ได้​เมื่อ dictionary โต​เกิน​เพดาน “If the dictionary grows too big … the encoding will fall back to the plain encoding” · ดึง​หน้า File Format มา​อ่าน​แล้ว​ไม่มี​คำ​ว่า dictionary เลย​สัก​ครั้ง สอง​ข้อ​นี้​จึง​อยู่​หน้า​นี้

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

  • fence สอง​อัน​ใน​บท​นี้​ยก​มา​จาก scripts/column-store/colstore.py บรรทัด​ที่ 155 และ​บรรทัด​ที่ 104 · คอร์ส​นี้​ไม่​แก้​อะไร​ใน scripts/query-engine/qe/ แม้แต่ byte เดียว

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

ข้อ 1 / 3

ใส่ dictionary ให้ครบทั้งหก column แล้ว column ไหนใหญ่ขึ้นแทนที่จะเล็กลง