60–100% rows
เปลี่ยนแถวจำนวนมาก
UPDATE สูญเสียข้อดีจากการแตะข้อมูลน้อย แต่ยังแบกต้นทุน version และ log ต่อแถว
BULK MUTATION · CTAS · ATOMIC SWAP
UPDATE ดูเหมือนแตะเฉพาะคอลัมน์ที่เปลี่ยน แต่ engine อาจต้องสร้าง row version, เขียน WAL/redo, ดูแล index และ cleanup ขณะที่ Read → Transform → New Table อ่านต่อเนื่อง เขียนต่อเนื่อง แล้วสลับครั้งเดียว
WHEN THE COST FLIPS
ไม่มี threshold สากล ต้อง benchmark workload และ engine จริง แต่ pattern เหล่านี้ทำให้ mutation แพงขึ้น
60–100% rows
UPDATE สูญเสียข้อดีจากการแตะข้อมูลน้อย แต่ยังแบกต้นทุน version และ log ต่อแถว
secondary indexes
ค่าที่เปลี่ยนทำให้ต้องลบและเพิ่ม index entry หลายชุด
PostgreSQL · InnoDB
snapshot เก่าต้องอ่าน row version เดิม และระบบต้อง cleanup ภายหลัง
primary + replicas
ทุก mutation ต้อง recover และส่งต่อ replica
parts · compression
การแก้ row กระจัดกระจายอาจกลายเป็นการ rewrite compressed part
partition · sort · encoding
สร้างตารางใหม่ทำ transformation และจัด layout ให้จบในรอบเดียว
poor locality
UPDATE กระโดดหลาย page แต่ CTAS มักอ่านและเขียนต่อเนื่อง
vacuum · purge · merge
ต้นทุนต่อเนื่องไปยัง scan, cache, backup และ cleanup
join · cast · normalize
Set-oriented pipeline สร้างปลายทางโดยตรงได้
PHYSICAL WORK
เทียบ bytes, logs, index work, locks, cleanup และ replica impact ไม่ใช่เวลาอย่างเดียว
INTERACTIVE COST MODEL
ใช้สร้าง intuition ไม่ใช่แทน benchmark จริง
LIVE MARIADB LAB · MEASURE ONE BOUNDARY AT A TIME
ตารางต้นทางถูกสร้างเพียงเพื่อจัดฉากการทดลอง เวลานี้รายงานแยกและไม่รวมในคำตัดสินหลัก
สร้าง source table และ index ตั้งต้น แล้วตรวจ checksum ก่อนเริ่มทั้งสองเส้นทาง
คัดลอก source เป็น working copy ก่อน แล้วเริ่มจับเวลาเฉพาะคำสั่ง UPDATE
เริ่มจับเวลาตั้งแต่ scan source, transform ด้วย CASE และเขียน new table
CONNECTING TO MARIADB…
เลือกขนาดแล้วทดลองซ้ำหลายรอบ ค่าแรกอาจรวมผลของ cold cache และการจัดสรร page
UPDATE copy_table
SET amount = amount * 2 + 7,
segment = MOD(segment + 1, 12)
WHERE MOD(id, 100) < :changed_percent;CREATE TEMPORARY TABLE new_table AS
SELECT id,
CASE WHEN changed THEN amount * 2 + 7 ELSE amount END amount,
CASE WHEN changed THEN MOD(segment + 1, 12) ELSE segment END segment
FROM source_table;UPDATE only ÷ transform → new table เวลาคัดลอกและสร้าง index แสดงไว้เพื่อความโปร่งใส แต่ไม่ปนใน ratio นี้
ยังไม่ได้ทดลอง
1 · ถ้า UPDATE only ช้ากว่า
mutation work ต่อแถว—รวม index maintenance และ logging—แพงกว่า scan-transform-write ใน workload นี้ แม้ไม่นับเวลา copy
2 · ถ้า UPDATE ยังเร็วกว่า
เพิ่ม changed fraction หรือ index แล้วทดลองใหม่ จุดพลิกขึ้นกับ engine, cache, row width และ storage
3 · อย่าใช้ elapsed time เพียงครั้งเดียว
ทดลองซ้ำ ดู median และตรวจ bytes/log/locks ในระบบจริง แล็ปนี้สอนขอบเขตการวัด ไม่ได้ประกาศผู้ชนะสากล
ENGINE-AWARE SQL
ตรวจ transaction, locks, replication และ DDL behavior ของ engine เสมอ
CREATE TABLE customer_new AS SELECT id, normalize_email(email) email FROM customer; CREATE INDEX ON customer_new(id); ANALYZE customer_new; -- validate, catch up concurrent changes, then plan transactional cutover
CREATE TABLE customer_new LIKE customer; INSERT INTO customer_new SELECT id, LOWER(TRIM(email)) FROM customer; RENAME TABLE customer TO customer_old, customer_new TO customer;
CREATE TABLE events_new AS events; INSERT INTO events_new SELECT * REPLACE (transform(x) AS x) FROM events; -- validate then exchange tables, or replace only affected partitions
CREATE TABLE facts_new AS SELECT * REPLACE (standardize(amount) AS amount) FROM facts; -- validate and swap names in a controlled transaction
DECISION GUIDE
เลือกวิธีที่รักษาความถูกต้องและ recovery path ได้ ไม่ใช่เพียงวิธีที่ดูเร็ว
| Situation | Likely choice | Reason |
|---|---|---|
| <5–10% rows | UPDATE | Selective work can beat a complete rewrite. |
| Most rows + many indexes | Benchmark rebuild | Logging and index amplification may dominate. |
| Partition/sort/encoding changes | Rebuild/partition replace | The physical layout itself changes. |
| Continuous writes | Online migration | CTAS alone misses post-snapshot changes. |
| Low free disk | Chunked UPDATE | Rebuild temporarily needs two copies plus indexes. |
| Strict rollback | Build–validate–swap | The old table remains a rollback target. |
ถ้ามี write ต่อเนื่อง ต้องกำหนด snapshot boundary, CDC catch-up, validation, cutover lock และ rollback มิฉะนั้นตารางใหม่อาจเร็วแต่ข้อมูลหาย
SAFE REBUILD
Checklist นี้ต้องปรับตาม engine และ SLA