ทำไมภาระงาน OLTP และ OLAP มักไม่ควรอยู่ในฐานข้อมูลเดียวกัน
เรียนรู้ว่าการผสมงานเชิงธุรกรรม (OLTP) กับงานวิเคราะห์ (OLAP) ในฐานข้อมูลเดียวกันทำให้แอปช้าลง เพิ่มค่าใช้จ่าย และซับซ้อนด้านปฏิบัติการอย่างไร — และควรทำอย่างไรแทน

OLTP vs OLAP: คืออะไร (อธิบายแบบไม่ใช้ศัพท์เทคนิค)
เมื่อคนพูดว่า “OLTP” และ “OLAP” พวกเขากำลังพูดถึงสองรูปแบบการใช้งานฐานข้อมูลที่ต่างกันมาก
OLTP: ฐานข้อมูลที่ขับเคลื่อนการทำงานประจำ
OLTP (Online Transaction Processing) คือภาระงานเบื้องหลังการกระทำประจำวันที่ต้องเร็วและถูกต้องเสมอ คิดว่า: “บันทึกการเปลี่ยนแปลงตอนนี้เลย”
งาน OLTP ทั่วไปได้แก่ สร้างคำสั่งซื้อ อัพเดตสต็อก บันทึกการชำระเงิน หรือเปลี่ยนที่อยู่ลูกค้า งานพวกนี้มักเล็ก (ไม่กี่แถว) เกิดบ่อย และต้องตอบกลับภายในมิลลิวินาทีเพราะมีคนหรือระบบรอผล
OLAP: ฐานข้อมูลที่อธิบายธุรกิจ
OLAP (Online Analytical Processing) คือภาระงานที่ใช้เพื่อเข้าใจว่าเกิดอะไรขึ้นและทำไม คิดว่า: “สแกนข้อมูลจำนวนมากแล้วสรุป”
งาน OLAP ทั่วไป ได้แก่ แดชบอร์ด รายงานแนวโน้ม การวิเคราะห์โคฮอร์ต การพยากรณ์ และคำถามแบบ slice-and-dice เช่น: “รายได้เปลี่ยนแปลงอย่างไรตามภูมิภาคและหมวดสินค้าตลอด 18 เดือนที่ผ่านมา?” คิวรีเหล่านี้มักอ่านหลายแถว ทำการคำนวณรวมหนัก ๆ และอาจใช้เวลาวินาทีหรือเป็นนาทีโดยที่ผลลัพธ์ไม่ได้ถือว่า "ผิด" หากไม่เร็วนัก
ข้อมูลเหมือนกัน แต่เป้าหมายต่างกัน—และความต้องการต่างกัน
แนวคิดหลักเรียบง่าย: OLTP ปรับแต่งเพื่อการเขียนที่เร็วและสม่ำเสมอ พร้อมการอ่านขนาดเล็ก ในขณะที่ OLAP ปรับแต่งเพื่อการอ่านจำนวนมากและการคำนวณซับซ้อน เพราะเป้าหมายต่างกัน การตั้งค่าฐานข้อมูล ดัชนี โครงร่างการเก็บข้อมูล และวิธีการสเกลมักต่างกันด้วย
หมายเหตุคำว่า: มักไม่ใช่ไม่เคย ทีมเล็กบางทีมอาจใช้ฐานข้อมูลเดียวกันได้ชั่วคราว โดยเฉพาะเมื่อปริมาณข้อมูลยังน้อยและมีกฎการเขียนคิวรีอย่างเข้มงวด ส่วนตอนหลังจะพูดถึงสิ่งที่จะพังก่อน รูปแบบการแยบ และวิธีย้ายการรายงานออกจาก production อย่างปลอดภัย
ตัวอย่างสั้น ๆ
- Checkout (OLTP): ลูกค้าคลิก “จ่าย” แล้วแอปบันทึกคำสั่งซื้อ สถานะการชำระเงิน และอัพเดตสต็อก
- แดชบอร์ดรายงาน (OLAP): ผู้จัดการเปิดแดชบอร์ดที่สรุปคำสั่งซื้อเป็นพันหรือเป็นล้านรายการ เพื่อแสดงอัตราการแปลง ค่าการสั่งซื้อเฉลี่ย และแนวโน้มรายสัปดาห์
เป้าหมายต่างกัน ตัวชี้วัดความสำเร็จต่างกัน
OLTP และ OLAP อาจ “ใช้ SQL” เหมือนกัน แต่ถูกปรับจูนเพื่อหน้าที่ต่างกัน—และนั่นสะท้อนในสิ่งที่แต่ละฝั่งถือว่าเป็นความสำเร็จ
OLTP: ความเร็ว ความพร้อมกัน และความถูกต้อง
ระบบ OLTP ขับเคลื่อนการทำงานประจำวัน: กระบวนการเช็คเอาท์ อัพเดตบัญชี การจอง เครื่องมือสนับสนุน เป้าหมายคือ:
- เวลาตอบสนองเร็ว สำหรับการอ่าน/เขียนขนาดเล็ก (คิดเป็นมิลลิวินาที)
- ผู้ใช้พร้อมกันจำนวนมาก โดยไม่ชะงัก
- ความถูกต้องและความสอดคล้องของข้อมูล เพราะยอดเงินผิดหรือคำสั่งซื้อซ้ำเป็นปัญหาธุรกิจจริง
ความสำเร็จมักวัดด้วยเมตริกความหน่วง เช่น p95/p99 อัตราความผิดพลาด และพฤติกรรมภายใต้ภาระพร้อมกันสูง
OLAP: การสแกน การรวมผล และความยืดหยุ่น
ระบบ OLAP ตอบคำถามเช่น “อะไรเปลี่ยนแปลงไตรมาสนี้?” หรือ “เซกเมนต์ไหนที่เลิกใช้งานหลังการปรับราคาหรือไม่?” คิวรีเหล่านี้มักจะ:
- สแกนข้อมูลจำนวนมาก ข้ามหลายแถว
- ทำ การคำนวณรวม (SUM, COUNT, percentiles) และ join หลายตาราง
- เปลี่ยนบ่อยเมื่อผู้วิเคราะห์สำรวจและปรับคำถาม
ความสำเร็จในฝั่งนี้ดูที่ ปริมาณคิวรีที่รองรับได้ เวลาในการได้คำตอบ (time-to-insight) และความสามารถรันคิวรีซับซ้อนได้โดยไม่ต้องปรับจูนทีละรายงาน
ทำไม "ระบบเดียวสำหรับทุกอย่าง" ถึงสร้างการประนีประนอม
เมื่อคุณบังคับให้ทั้งสองภาระงานไปรันบนฐานข้อมูลเดียว คุณกำลังขอให้มันดีทั้งงานธุรกรรมขนาดเล็กที่มีปริมาณสูง และการสแกนขนาดใหญ่พร้อมการสำรวจ ข้อสรุปมักเป็นการประนีประนอม: OLTP มีความหน่วงที่ไม่คาดคิด, OLAP ถูกจำกัดเพื่อปกป้อง production, และทีมมักถกเถียงกันว่าคิวรีของใคร "อนุญาต". เป้าหมายต่างกันสมควรได้ตัวชี้วัดความสำเร็จที่ต่างกัน—และมักได้ระบบที่แยกจากกัน
การแย่งทรัพยากร: เมื่อการวิเคราะห์ไปรบกวนธุรกรรม
เมื่อ OLTP (การทำธุรกรรมประจำ) และ OLAP (การรายงาน/วิเคราะห์) รันบนฐานข้อมูลเดียว พวกมันจะแย่งทรัพยากรร่วมกัน ผลลัพธ์ไม่ใช่แค่ "รายงานช้าขึ้น" แต่มักเป็นการเช็คเอาต์ช้าลง การล็อกอินติดขัด และปัญหาแอปที่ไม่คาดคิด
CPU และหน่วยความจำ: คิวรียาว vs คิวรีสั้น
คิวรีเชิงวิเคราะห์มักรันนานและหนัก: join ข้ามตารางใหญ่ การคำนวณรวม การเรียง และการจัดกลุ่ม พวกมันสามารถครอบงำคอร์ CPU และหน่วยความจำสำหรับ hash join และ buffer การเรียง
ในขณะเดียวกัน คิวรีธุรกรรมมักเล็กแต่ไวต่อความหน่วง ถ้า CPU อิ่มหรือหน่วยความจำโดนกดดัน คิวรีสั้นเหล่านั้นจะต้องรอหลังคิวรีใหญ่ ถึงแม้ว่างานแต่ละรายการจะต้องการเวลาเพียงไม่กี่มิลลิวินาทีจริง ๆ
ดิสก์ I/O: การสแกนขนาดใหญ่ vs การอ่าน/เขียนเล็ก ๆ จำนวนมาก
การวิเคราะห์มักทำให้เกิดการสแกนตารางใหญ่และอ่านเพจจำนวนมากแบบต่อเนื่อง OLTP ทำตรงข้าม: การอ่าน/เขียนแบบสุ่มเล็ก ๆ จำนวนมากพร้อมการเขียนดัชนีและล็อก
นำมารวมกัน ระบบเก็บข้อมูลต้องจัดการรูปแบบการเข้าถึงที่ไม่เข้ากัน แคชที่ช่วย OLTP อาจถูก "ชะล้าง" โดยการสแกนของ analytics และความหน่วงการเขียนอาจพุ่งเมื่อดิสก์ถูกใช้สำหรับสตรีมข้อมูลรายงาน
แรงกดดันจาก connection pool และการคิว
ผู้วิเคราะห์ไม่กี่คนรันคิวรีกว้าง ๆ อาจผูกการเชื่อมต่อไว้เป็นนาที ถ้าแอปใช้ pool ขนาดคงที่ คำขอจะเข้าแถวรอการเชื่อมต่อว่าง การต่อคิวนี้ทำให้ระบบที่ดูเหมือนสุขภาพดีรู้สึกพัง: ค่าเฉลี่ยความหน่วงอาจดูใช้ได้ แต่ความหน่วงชนหาง (p95/p99) กลับเจ็บปวด
ผู้ใช้เห็นอะไรบ้าง
จากมุมภายนอก จะเห็นเป็น timeout, กระบวนการเช็คเอาต์ช้า ผลการค้นหาล่าช้า และพฤติกรรมที่ผิดปกติ—มักปรากฏเฉพาะตอนที่มีการรายงานหรือปลายเดือน ทีมแอปเห็น error, ทีม analytics เห็นคิวรีช้า, แต่ปัญหาจริง ๆ คือการแย่งทรัพยากรใต้พื้นผิว
โครงสร้างข้อมูลและความต้องการดัชนีกินกันคนละทาง
OLTP และ OLAP ไม่ได้แค่ "ใช้ฐานข้อมูลต่างกัน"—พวกมันให้รางวัลกับการออกแบบเชิงกายภาพที่ตรงกันข้าม เมื่อคุณพยายามรองรับทั้งสองในที่เดียว มักได้การประนีประนอมที่แพงแต่ยังไม่ดีพอ
OLTP: ปรับแต่งเพื่อการค้นหาเฉพาะที่เร็ว
ภาระงานเชิงธุรกรรมถูกครอบงำด้วยคิวรีสั้นที่เข้าถึงข้อมูลส่วนน้อย: ดึงคำสั่งซื้อหนึ่งรายการ อัพเดตแถวสต็อกหนึ่งแถว แสดงเหตุการณ์ล่าสุด 20 รายการของผู้ใช้หนึ่งคน
นั่นทำให้สคีม่า OLTP มุ่งไปที่ storage แบบแถวและดัชนีที่รองรับการค้นหาแบบจุดและช่วงสั้น (มักเป็น primary key, foreign key และดัชนีรองที่สำคัญไม่กี่ตัว) เป้าหมายคือความหน่วงต่ำที่คาดเดาได้ โดยเฉพาะสำหรับการเขียน
OLAP: ปรับแต่งเพื่อการสแกน การจัดกลุ่ม และการสรุป
ภาระงานวิเคราะห์มักต้องอ่านหลายแถวและแค่บางคอลัมน์: “รายได้ตามสัปดาห์ตามภูมิภาค”, “อัตราแปลงตามแคมเปญ”, “สินค้าท็อปตามมาร์จิ้น”
ระบบ OLAP ได้ประโยชน์จาก storage แบบคอลัมน์ (อ่านเฉพาะคอลัมน์ที่ต้องการ), การพาร์ติชัน (เพื่อตัดข้อมูลเก่า/ไม่เกี่ยวข้อง) และการคำนวณรวมล่วงหน้า (materialized views, rollups, ตารางสรุป) เพื่อให้รายงานไม่ต้องคำนวณซ้ำ ๆ
ทำไมการ "เพิ่มดัชนีทุกอย่าง" ถึงย้อนผล
การตอบสนองทั่วไปคือเพิ่มดัชนีจนทุกแดชบอร์ดเร็วขึ้น แต่ดัชนีทุกชิ้นเพิ่มต้นทุนการเขียน: insert, update, delete ต้องดูแลโครงสร้างมากขึ้น นอกจากนี้ยังเพิ่มพื้นที่เก็บข้อมูลและทำให้การบำรุงรักษาช้าลง เช่น vacuum, reindex, backup
ตัววางแผนคิวรีและสถิติที่สึกหลุด (อธิบายแบบไม่ซับซ้อน)
ฐานข้อมูลเลือกรายการวางแผนคิวรีจากสถิติ—การประมาณจำนวนแถวที่ตรงกับตัวกรอง ความเลือกของดัชนี และการกระจายข้อมูล OLTP เปลี่ยนข้อมูลตลอดเวลา เมื่อการกระจายเปลี่ยน สถิติก็อาจคลาดเคลื่อน และ planner อาจเลือกแผนที่ดีเมื่อวานแต่ช้าในวันนี้
ผสมกับคิวรี OLAP หนัก ๆ ที่สแกนและ join ตารางใหญ่มากขึ้น ทำให้ความผันผวนเพิ่มขึ้น: "แผนที่ดีที่สุด" ยากจะทำนาย และการปรับจูนเพื่อภาระงานหนึ่งมักทำให้อีกภาระแย่ลง
การล็อก MVCC และผลข้างเคียงด้านการบำรุงรักษา
แม้ว่าฐานข้อมูลของคุณจะ "รองรับการพร้อมกัน" การผสมระหว่างการรายงานหนักกับธุรกรรมสดสร้างความช้าละเอียดที่ยากจะคาดเดา—และยากอธิบายให้ลูกค้าที่มองเห็นเวลาเช็คเอาต์หมุนดู
คิวรียาวยังสร้างปัญหาล็อก
คิวรีแบบ OLAP มักสแกนหลายแถว join หลายตาราง และรันเป็นวินาทีหรือเป็นนาที ในช่วงนั้นพวกมันอาจถือ lock (เช่น บนวัตถุสกีมา หรือเมื่อใช้ temp structures) และบ่อยครั้งจะ เพิ่มปัญหาการล็อกโดยอ้อม โดยการทำให้แถวจำนวนมากอยู่ "ในสถานะที่มีการใช้งาน"
แม้มี MVCC (multi-version concurrency control) ฐานข้อมูลยังต้องติดตามหลายเวอร์ชันของแถวเดียวกันเพื่อให้ผู้อ่านและผู้เขียนไม่บล็อกกัน ซึ่งช่วยได้ แต่ไม่ขจัดการแย่งทรัพยากร—โดยเฉพาะเมื่อคิวรีแตะตารางร้อนที่ธุรกรรมอัพเดตตลอดเวลา
ค่าแฝงของ MVCC ที่ซ่อนอยู่: การเก็บกวาดทำยากขึ้น
MVCC หมายความว่าเวอร์ชันแถวเก่าจะคงอยู่จนกว่าฐานข้อมูลจะสามารถลบได้อย่างปลอดภัย รายงานที่รันนานอาจเปิด snapshot ยาว ซึ่งป้องกันการเก็บกวาดจากการคืนพื้นที่
นั่นส่งผลต่อ:
- Vacuum/garbage collection: การเก็บกวาดไม่สามารถลบ tuple/เวอร์ชันที่ตายแล้วได้เร็ว
- Bloat/fragmentation: พื้นที่เก็บข้อมูลโตขึ้น ดัชนีมีประสิทธิภาพลดลง และแคชใช้งานได้แย่ลง
- แรงกดดันการบีบอัด: บางเอนจินจะทำงานพื้นหลังหนักขึ้น ซึ่งขโมย I/O และ CPU จากธุรกรรม
ผลคือการโดนสองต่อ: การรายงานทำให้ฐานข้อมูลทำงานหนักขึ้น และ ทำให้ระบบช้าลงเมื่อเวลาผ่านไป
ระดับ isolation ทำให้ความหน่วงไม่สม่ำเสมอขึ้น
เครื่องมือรายงานมักร้องขอ isolation สูงขึ้น (หรือเผลอรันใน transaction ยาว) การ isolation สูงขึ้นทำให้การรอ lock เพิ่มขึ้นและเพิ่มจำนวนเวอร์ชันที่ต้องจัดการ จากฝั่ง OLTP คุณจะเห็นเป็นการพุ่งของความหน่วง: คำสั่งส่วนใหญ่เขียนเร็ว แต่บางรายการดันหยุดนิ่งอย่างไม่คาดคิด
ตัวอย่างปฏิบัติ: รายงานปลายเดือนทำให้คำสั่งซื้อช้า
ปลายเดือน ฝ่ายการเงินรันคิวรี "รายได้ตามสินค้า" ที่สแกนคำสั่งซื้อและรายการสินค้าทั้งเดือน ขณะที่คิวรีรัน การเขียนคำสั่งซื้อใหม่ยังรับได้ แต่ vacuum ไม่สามารถเก็บกวาดเวอร์ชันเก่าได้ อินเด็กซ์สึกหรอ ฯลฯ API คำสั่งซื้อเริ่มเห็น timeout — ไม่ใช่เพราะระบบล่ม แต่เพราะการแย่งทรัพยากรและการเก็บกวาดผลักความหน่วงเกินขีดจำกัด
การกระแทกของภาระงานและความหน่วงที่ไม่คาดคิด
ระบบ OLTP อยู่รอดด้วยความสามารถในการคาดการณ์ การเช็คเอาต์ การอัพเดต หรือการทำงานสนับสนุนไม่ใช่ "โอเคส่วนใหญ่" ถ้ามันเร็ว 95% ของเวลา—ผู้ใช้จะสังเกตช่วงที่ช้าได้ OLAP มักเป็นแบบ bursty: คิวรีหนักไม่กี่ตัวอาจเงียบเป็นชั่วโมงแล้วพุ่งขึ้นและใช้ทรัพยากรมาก
การเกิด spike เป็นเรื่องปกติจากเหตุธุรกิจ
การจราจรทางการวิเคราะห์มักมารวมกันรอบกิจวัตร:
- แดชบอร์ดสำหรับ standup เช้าหลายคนรีเฟรชพร้อมกัน
- รายงานที่ตั้งเวลาให้เริ่มต้นตรงชั่วโมง
- ปิดงบปลายเดือนหรือไตรมาสที่กระตุ้นการสแกนและ join ยาว
ในขณะที่การจราจร OLTP มักสม่ำเสมอ เมื่อสองภาระงานแชร์ฐานข้อมูล spike ของ analytics จะกลายเป็นความหน่วงที่ไม่คาดคิดสำหรับธุรกรรม—timeout หน้าเว็บ ช้าการโหลด และ retry ที่เพิ่มภาระอีก
ทำไมการจำกัดและการตั้งเวลาแก้ได้บ้างแต่ไม่จบ
คุณลดความเสียหายได้ด้วยยุทธวิธีเช่นรันรายงานกลางคืน จำกัด concurrency ตั้ง statement timeouts หรือกำหนด query cost caps เหล่านี้เป็นเกราะป้องกันที่มีประโยชน์ โดยเฉพาะสำหรับ "การรายงานบน production"
แต่พวกมันไม่แก้ความตึงเครียดพื้นฐาน: คิวรี OLAP ออกแบบมาให้ใช้ทรัพยากรมากเพื่อให้คำตอบของคำถามใหญ่ ขณะที่ OLTP ต้องการเศษทรัพยากรเล็ก ๆ ตลอดวัน เดี๋ยวมีรีเฟรชแดชบอร์ดที่ไม่คาดคิดหรือคิวรี ad-hoc ผ่านมา ระบบร่วมก็จะเปิดเผยปัญหาอีกครั้ง
ปัญหา "เพื่อนบ้านส่งเสียงดัง"
บนโครงสร้างพื้นฐานร่วม หนึ่งผู้ใช้หรือ job ทาง analytics ที่ "ดัง" สามารถผูก cache อิ่ม ใช้ disk จนเต็ม หรือกด scheduler ของ CPU—โดยไม่ได้ทำอะไรผิด OLTP กลายเป็นผู้ได้รับผลกระทบ และแย่ที่สุดคือความล้มเหลวจะดูเป็นแบบสุ่ม: ความหน่วงพุ่งขึ้นแทนที่จะเป็น error ที่ชัดเจน
ความซับซ้อนด้านการบริหาร: แบ็คอัพ ความปลอดภัย และการวางแผนความจุ
การผสม OLTP และ OLAP ไม่ได้สร้างแค่ปัญหาประสิทธิภาพ—มันทำให้การปฏิบัติการประจำวันยากขึ้น ฐานข้อมูลกลายเป็นกล่องเดียวสำหรับทุกอย่าง และงานปฏิบัติการทุกชิ้นต้องรับความเสี่ยงของทั้งสองภาระงาน
แบ็คอัพ การกู้คืน และ DR ช้าลง
ตารางวิเคราะห์มักโตทั้งกว้างและเร็ว (เก็บประวัติมากขึ้น คอลัมน์เพิ่มขึ้น สรุปหลายแบบ) ปริมาณนี้เปลี่ยนเรื่องการกู้คืนให้ยากขึ้น
แบ็คอัพเต็มใช้เวลานานขึ้น ใช้พื้นที่มากขึ้น และเพิ่มโอกาสที่จะพลาดหน้าต่างแบ็คอัพ การกู้คืนแย่กว่า: เมื่อคุณต้องคืนระบบเร็ว คุณกำลังคืนทั้งข้อมูลธุรกรรมที่แอปต้องการและชุดข้อมูลวิเคราะห์ขนาดใหญ่ที่ไม่จำเป็นต่อการเปิดธุรกิจอีกครั้ง การทดสอบการกู้คืนฉุกเฉินก็ใช้เวลานานขึ้น และทำให้น้อยครั้งลง—ตรงกันข้ามกับสิ่งที่คุณควรทำ
การวางแผนความจุกลายเป็นเดาทาง
การเติบโตของธุรกรรมมักคาดเดาได้: ลูกค้ามากขึ้น คำสั่งซื้อเพิ่มขึ้น แถวเพิ่มขึ้น การเติบโตของการวิเคราะห์มักกระโดด: แดชบอร์ดใหม่ นโยบายการเก็บรักษาใหม่ หรือทีมตัดสินใจเก็บ "แค่ปีเดียว" ของกิจกรรมดิบ
เมื่อทั้งสองอยู่ด้วยกัน คุณตอบยากว่า:
- เราโตขึ้นเพราะสินค้าประสบความสำเร็จ หรือเพราะรายงานเก็บประวัติเยอะขึ้น?
- เราต้องการ storage เร็วขึ้นสำหรับธุรกรรม หรือ storage ถูกลงสำหรับ analytics?
ความไม่แน่นอนนี้นำไปสู่การ provision เกินความจำเป็น (จ่ายเพิ่มแต่ไม่ได้ใช้) หรือ provision น้อยไป (ล่มแบบเซอร์ไพรส์)
การบังคับเกราะป้องกันทำได้ยากและไม่ยุติธรรม
ในฐานข้อมูลร่วม คิวรี "บริสุทธิ์" หนึ่งชิ้นอาจกลายเป็นเหตุการณ์ คุณจะเพิ่มเกราะป้องกันเช่น statement timeouts โควต้าภาระงาน หน้าต่างการรายงานที่ตั้งเวลา หรือกฎการจัดการภาระงาน สิ่งเหล่านี้ช่วยได้แต่เปราะ: แอปกับนักวิเคราะห์แข่งขันกันในข้อจำกัดเดียว และการเปลี่ยนแปลงนโยบายสำหรับกลุ่มหนึ่งอาจทำให้อีกกลุ่มพัง
ความปลอดภัยและการควบคุมการเข้าถึงยุ่งเหยิงขึ้น
แอปมักต้องการสิทธิจำกัดเฉพาะงาน นักวิเคราะห์มักต้องการสิทธิอ่านกว้าง ๆ ข้ามหลายตารางเพื่อสำรวจและตรวจสอบ การรวมทั้งสองไว้ในฐานข้อมูลเดียวเพิ่มแรงกดดันให้ขยายสิทธิออกไป "เพื่อให้รายงานทำงานได้" ซึ่งเพิ่ม blast radius ของความผิดพลาดและขยายจำนวนคนที่เห็นข้อมูลที่ละเอียดอ่อน
การสเกลและค่าใช้จ่าย: คุณมักจ่ายสองครั้ง (หรือมากกว่า)
พยายามรัน OLTP และ OLAP ในฐานข้อมูลเดียวมักดูเหมือนถูกกว่า—จนกว่าคุณจะเริ่มสเกล ปัญหาไม่ใช่แค่ประสิทธิภาพ แต่คือวิธีที่แต่ละภาระงานควรสเกลซึ่งผลักดันให้คุณต้องเลือกโครงสร้างพื้นฐานต่างกัน และการรวมกันบีบบังคับให้เกิดการประนีประนอมที่มีราคาแพง
การสเกล OLTP มักขับเคลื่อนโดยการเขียน (และมักเจ็บปวด)
ระบบธุรกรรมถูกจำกัดด้วยการเขียน: อัพเดตเล็ก ๆ จำนวนมาก ความหน่วงเข้มงวด และพีกที่ต้องรับได้ทันที การสเกล OLTP มักหมายถึงการสเกลแนวตั้ง (CPU ใหญ่ขึ้น ดิสก์เร็วขึ้น หน่วยความจำมากขึ้น) เพราะภาระงานที่เน้นเขียนไม่ค่อยขยายได้ง่าย
เมื่อถึงขีดจำกัดแนวตั้ง คุณต้องพิจารณา sharding หรือแพตเทิร์นการสเกลการเขียนอื่น ๆ ซึ่งเพิ่มภาระวิศวกรรมและมักต้องเปลี่ยนแอป
การสเกล OLAP ขับเคลื่อนโดยคอมพิวต์ (และมักยืดหยุ่น)
ภาระงานวิเคราะห์สเกลต่างกัน: การสแกนยาว การคำนวณรวมหนัก และ throughput การอ่านสูง ระบบ OLAP มักสเกลด้วยการเพิ่ม compute แบบกระจายและแยก compute จาก storage เพื่อให้เพิ่มพลังการคิวรีโดยไม่ต้องย้ายหรือทำสำเนาข้อมูล
ถ้า OLAP แชร์ฐานข้อมูล OLTP คุณไม่สามารถสเกลการวิเคราะห์แยกได้ คุณต้องสเกลทั้งฐานข้อมูล—แม้ว่าการทำธุรกรรมจะยังไหวก็ตาม
บิลที่ซ่อนอยู่: จ่ายทรัพยากรระดับ OLTP เพื่อรองรับ analytics
เพื่อให้ธุรกรรมเร็วขณะรันรายงาน ทีมมัก over-provision ฐานข้อมูล production: เพิ่ม CPU เผื่อไว้, storage ระดับพรีเมียม, และ instance ขนาดใหญ่ขึ้น "กันไว้ไงไม่ต้องคิด" นั่นหมายความว่าคุณจ่ายราคา OLTP เพื่อรองรับพฤติกรรม OLAP
การแยกระบบช่วยลดการ provision เกินความจำเป็น เพราะแต่ละระบบถูกปรับขนาดตามงาน: OLTP เพื่อการเขียนหน่วงต่ำที่คาดเดาได้, OLAP เพื่อการอ่านหนักเป็นครั้งคราว ผลคือมักถูกกว่าโดยรวม—แม้จะเป็น "สองระบบ"—เพราะคุณเลิกจ่ายสำหรับ capacity ระดับพรีเมียมเพื่อรันรายงานบน production
สถาปัตยกรรมทั่วไปที่แยก OLTP และ OLAP
ทีมส่วนใหญ่แยก ภาระงานเชิงธุรกรรม (OLTP) ออกจาก ภาระงานวิเคราะห์ (OLAP) โดยเพิ่มระบบอ่านหรือระบบวิเคราะห์แยกต่างหาก แทนที่จะบังคับให้ฐานข้อมูลเดียวให้บริการทั้งคู่
รูปแบบ 1: Read replica สำหรับการรายงาน
ก้าวแรกที่พบบ่อยคือ read replica ของฐานข้อมูล OLTP ที่เครื่องมือ BI รันคิวรี
ข้อดี: เปลี่ยนแปลงแอปน้อย, SQL คุ้นเคย, ติดตั้งเร็ว
ข้อเสีย: ยังเป็นเอนจินและสกีม่าเดียวกัน รายงานหนักอาจอิ่ม CPU/I/O ของ replica; บางรายงานต้องการฟีเจอร์ที่ replica ไม่มี; และ replication lag ทำให้ตัวเลขอาจล้าหลังเป็นนาที (หรือมากกว่า) Lag ยังสร้างบทสนทนา "ทำไมไม่ตรงกับ production" ตอนเกิดเหตุ
เหมาะที่สุด: ทีมเล็ก ปริมาณข้อมูลพอประมาณ "เกือบเรียลไทม์" ดีแต่ไม่วิกฤต และคิวรีรายงานถูกควบคุม
รูปแบบ 2: คลังข้อมูลเฉพาะ / ฐานข้อมูลวิเคราะห์
OLTP ยังคงปรับแต่งเพื่อการเขียนและการอ่านจุด ในขณะที่การวิเคราะห์ย้ายไปยัง data warehouse (หรือ DB แบบคอลัมน์) ที่ออกแบบมาสำหรับการสแกน การบีบอัด และการคำนวณรวมขนาดใหญ่
ข้อดี: ประสิทธิภาพ OLTP ที่คาดเดาได้, แดชบอร์ดเร็วขึ้น, รองรับผู้วิเคราะห์พร้อมกันได้ดีขึ้น, และการจูนค่าใช้จ่ายชัดเจน
ข้อเสีย: คุณต้องดูแลระบบอีกชุดและต้องมี data model (มักเป็น star schema) ที่เป็นมิตรกับการวิเคราะห์
เหมาะที่สุด: ข้อมูลโตขึ้น หลายผู้มีส่วนได้ส่วนเสีย รายงานซับซ้อน หรือต้องการ latency ของ OLTP ต่ำมาก
รูปแบบ 3: Pipeline แบบ CDC ไปยังการวิเคราะห์
แทนการทำ ETL แบบเป็นช่วง คุณสตรีมการเปลี่ยนแปลงด้วย CDC จาก log ของ OLTP ไปยัง warehouse (มักทำเป็น ELT)
ข้อดี: ข้อมูลสดขึ้นโดยมีภาระน้อยลงบน OLTP, การประมวลผล incremental ง่ายขึ้น, และ auditability ดีขึ้น
ข้อเสีย: มีชิ้นส่วนมากขึ้นและต้องจัดการการเปลี่ยนสกีมาอย่างระมัดระวัง
เหมาะที่สุด: ปริมาณใหญ่ ความต้องการ freshness สูง และทีมพร้อมสำหรับ pipeline
การย้ายข้อมูลจาก OLTP ไปยัง OLAP อย่างปลอดภัย
การย้ายข้อมูลจากฐานข้อมูลเชิงธุรกรรม (OLTP) ไปยังระบบวิเคราะห์ (OLAP) ไม่ใช่แค่ "คัดลอกตาราง" แต่เป็นการสร้าง pipeline ที่เชื่อถือได้และมีผลกระทบน้อย เป้าหมายคือให้ analytics ได้ข้อมูลที่ต้องการโดยไม่เสี่ยงต่อทราฟฟิค production
ETL vs ELT (เวอร์ชันภาษาง่าย)
ETL (Extract, Transform, Load) คือการทำความสะอาดและปรับรูปรายการก่อนที่จะโหลดเข้า warehouse เหมาะเมื่อการคำนวณใน warehouse แพง หรือคุณต้องการควบคุมสิ่งที่จะเก็บอย่างเข้มงวด
ELT (Extract, Load, Transform) โหลดข้อมูลดิบก่อนแล้วแปลงภายใน warehouse มักตั้งค่าได้เร็วและเปลี่ยนแปลงง่าย: คุณเก็บประวัติแหล่งข้อมูลและปรับทรานส์ฟอร์มเมื่อความต้องการเปลี่ยน
กฎปฏิบัติ: ถ้าตรรกะธุรกิจเปลี่ยนบ่อย ELT ลดงานซ้ำ; ถ้าการกำกับดูแลต้องการข้อมูลที่คัดกรองแล้วอย่างเข้มงวด ETL อาจเหมาะกว่า
พื้นฐาน CDC: เก็บการเปลี่ยนแปลงโดยไม่ต้องสแกนหนัก
Change Data Capture (CDC) สตรีม insert/update/delete จาก OLTP (มักจาก log) ไปยังระบบวิเคราะห์ แทนการสแกนตารางใหญ่ซ้ำ ๆ CDC ให้คุณย้ายเฉพาะสิ่งที่เปลี่ยน
ประโยชน์:
- การรายงานเกือบเรียลไทม์ โดยไม่รบกวนการอ่านข้อมูลขนาดใหญ่บน production
- การ replay และ backfill เมื่อต้อง rebuild ตารางวิเคราะห์
- การติดตามประวัติ (ใครเปลี่ยนอะไร เมื่อไหร่) ถ้าคุณเก็บ event การเปลี่ยนแปลง
ความสดของข้อมูล: เรียลไทม์ vs เกือบเรียลไทม์ vs รายวัน
ความสดเป็นการตัดสินใจเชิงธุรกิจพร้อมต้นทุนทางเทคนิค
- เรียลไทม์ (วินาที): ดีที่สุดสำหรับแดชบอร์ดปฏิบัติการ แต่รักษายากที่สุด; ข้อผิดพลาดของ pipeline ปรากฏเร็ว
- เกือบเรียลไทม์ (นาที): จุดสมดุลที่พบบ่อย—ตัดสินใจได้ดีโดยไม่ซับซ้อนเกินไป
- แบตช์รายวัน: ง่ายและถูก เหมาะกับการรายงานทางการเงินที่ "เมื่อวานก็พอ"
กำหนด SLA ชัดเจน (เช่น: “ข้อมูลหน่วงไม่เกิน 15 นาที”) เพื่อให้ผู้มีส่วนได้ส่วนเสียเข้าใจความหมายของคำว่า "สด"
การตรวจคุณภาพข้อมูลที่ป้องกันการล้มอย่างเงียบ ๆ
pipeline มักพังเงียบ ๆ—จนกว่าจะมีคนสังเกตตัวเลขไม่ตรง เพิ่มการตรวจแบบเบา ๆ สำหรับ:
- การเปลี่ยนแปลงสกีมา: คอลัมน์ใหม่ เปลี่ยนชื่อฟิลด์ หรือเปลี่ยนชนิดข้อมูลที่อาจทำให้ข้อมูลหาย
- เหตุการณ์มาถึงช้า: คำสั่งซื้อหรือการชำระเงินที่มาทีหลัง ควรมี "lookback window"
- การกำจัดซ้ำ: การ retry และ replay อาจนับซ้ำ ใช้ ID เสถียรและโหลดแบบ idempotent
การป้องกันเหล่านี้ทำให้ OLAP เชื่อถือได้ในขณะที่ปกป้อง OLTP
เมื่อการใช้ฐานข้อมูลเดียวอาจรับได้
การเก็บ OLTP และ OLAP ไว้ด้วยกันไม่ใช่ "ผิดเสมอไป" มันอาจเป็นทางเลือกที่สมเหตุสมผลชั่วคราวเมื่อแอปเล็ก การวิเคราะห์เบา และคุณบังคับขอบเขตอย่างเข้มงวดเพื่อไม่ให้การวิเคราะห์มาทำให้การชำระเงินช้าหรือ timeout
สถานการณ์ที่รับได้
แอปเล็กที่มีการวิเคราะห์เบาและจำกัดการรันคิวรี มักพออยู่ในฐานข้อมูลเดียวได้—โดยเฉพาะช่วงแรก จุดสำคัญคือต้องซื่อสัตย์กับความหมายของ "เบา": แดชบอร์ดไม่กี่ชิ้น จำนวนแถวพอประมาณ และเพดานเวลารันคิวรีชัดเจน
สำหรับชุดรายงานที่ซ้ำ ๆ และจำกัด materialized views หรือ summary tables ลดต้นทุนการวิเคราะห์ แทนการสแกนธุรกรรมดิบ คุณคำนวณสรุปเป็นรายวันหรือรายชั่วโมง ทำให้คิวรีส่วนใหญ่สั้นและคาดเดาได้
ถ้าผู้ใช้ยอมรับความล่าช้า หน้าต่างการรายงานนอกช่วงพีค ช่วยได้ ตั้งงานหนักตอนกลางคืนหรือช่วงที่คนใช้น้อย และพิจารณา role การรายงานที่มีสิทธิและข้อจำกัดทรัพยากรเข้มงวด
เกราะป้องกันที่ควรมี
- ตั้ง statement timeouts และยกเลิกคิวรีที่วิ่งยาว
- จำกัด concurrency สำหรับผู้ใช้รายงาน
- ตรวจสอบ p95/p99 ของธุรกรรมหลักแยกจากเวลารันรายงาน
สัญญาณเตือนชัดเจนว่าควรแยก
ถ้าคุณเห็น latency ธุรกรรมเพิ่มขึ้นเป็นประจำ เหตุการณ์ระหว่างการรันรายงาน การหมด connection pool หรือเรื่อง "คิวรีหนึ่งทำให้ production ล่ม" แปลว่าคุณพ้นโซนปลอดภัยแล้ว การแยกฐานข้อมูลหรืออย่างน้อยใช้ replica จะกลายเป็นเรื่องพื้นฐานในการดูแลระบบ ไม่ใช่แค่การปรับแต่ง
เช็คลิสต์การย้ายแบบปฏิบัติ: จากแชร์ไปสู่แยก
การย้ายการวิเคราะห์ออกจากฐานข้อมูล production เป็นเรื่องของการทำให้งานมองเห็นได้ ตั้งเป้า และย้ายทีละน้อย
1) ทำ inventory ว่าตอนนี้เกิดอะไรขึ้นจริง ๆ
เริ่มด้วยหลักฐาน ไม่ใช่สมมติ คัดรายการ:
- endpoint/c」にqueries OLTP ยอดนิยมตามความถี่และ p95/p99 (checkout, login, create order ฯลฯ)
- รายงาน/แดชบอร์ด OLAP ยอดนิยมตามเวลารัน ปริมาณการสแกน และความสำคัญทางธุรกิจ
รวมการวิเคราะห์ "ซ่อนอยู่": SQL ad-hoc จาก BI tools งานที่ตั้งเวลา และการส่งออก CSV
2) กำหนดเป้าหมาย: SLO สำหรับ OLTP และความสดของ analytics
เขียนเป้าหมายที่คุณจะปรับแต่งเพื่อ:
- OLTP SLO: p95/p99 latency อัตราข้อผิดพลาด และ throughput สูงสุดที่ต้องทนได้
- ความสดของ analytics: ยอมให้ข้อมูลล้าหลังได้เท่าไร (5 นาที 1 ชั่วโมง วันถัดไป) และเวลาในการ rebuild ถ้า pipeline พัง
นี่ช่วยหลีกเลี่ยงการถกเถียงว่า "ช้าไหม" กับ "โอเคไหม" และช่วยเลือกสถาปัตยกรรม
3) เลือกเส้นทางการแยก
เลือกตัวเลือกง่ายสุดที่ตอบโจทย์:
- Read replica: ใช้ได้เร็วสำหรับการรายงานที่เน้นอ่าน แต่ยังถูกกดดันจากคิวรีหนักและ lag
- Warehouse: เหมาะกับการสแกนขนาดใหญ่ join มาก และประวัติยาว; เป็นที่ที่เหมาะสำหรับ BI
- CDC pipeline (ETL/ELT): ดีเมื่ออยากได้ analytics เกือบเรียลไทม์โดยไม่กระทบ production
4) เปิดใช้งานอย่างปลอดภัย (ทดสอบแบบขนานก่อน)
- ยืนยันความหมายของตัวเลข (เขตเวลา การคืนเงิน คำนิยาม "ผู้ใช้แอคทีฟ") เพื่อให้ตัวเลขตรงกัน
- รันแดชบอร์ดเก่าและใหม่แบบขนานตลอดรอบธุรกิจ
- ตัดทีละรายงาน เริ่มจากคิวรีที่เป็นปัญหามากที่สุด
- ล็อกการเข้าถึงการรายงานบน production เมื่อผู้มีส่วนได้ส่วนเสียเชื่อถือแหล่งใหม่
5) เพิ่มเกราะป้องกันไม่ให้ถอยหลัง
ตั้งการมอนิเตอร์สำหรับ replica lag/pipeline delays เวลารันแดชบอร์ด และค่าใช้จ่าย warehouse เพิ่ม query budgets (timeouts, concurrency limits) และมี playbook ชัดเจน: ต้องทำอย่างไรเมื่อ freshness ลดลง โหลดพุ่ง หรือเมตริกสำคัญเบี้ยว
ข้อสังเกตปฏิบัติถ้าคุณกำลังสร้างแอปเอง
ถ้าคุณยังเริ่มเร็ว ความเสี่ยงใหญ่คือเผลอสร้างการวิเคราะห์เข้าไปในเส้นทางฐานข้อมูลเดียวกับธุรกรรมหลัก (เช่น คิวรีแดชบอร์ดที่กลายเป็น "สำคัญต่อ production") วิธีหลีกเลี่ยงคือออกแบบการแยกไว้แต่แรก—แม้จะเริ่มด้วย read replica ก็ตาม—และใส่มันในเช็คลิสต์สถาปัตยกรรม
แพลตฟอร์มอย่าง Koder.ai ช่วยได้ตรงนี้เพราะคุณสามารถจำลองฝั่ง OLTP (React app + Go services + PostgreSQL) และร่างขอบเขตการรายงาน/warehouse ในโหมด planning ก่อน deploy เมื่อผลิตภัณฑ์โตขึ้น คุณสามารถ export โค้ด ขยายสคีมา และเพิ่ม CDC/ELT โดยไม่ปล่อยให้ "รายงานบน production" กลายเป็นนิสัยถาวร
คำถามที่พบบ่อย
What’s the simplest way to explain OLTP vs OLAP?
OLTP (Online Transaction Processing) รับผิดชอบการทำงานประจำวัน เช่น การสร้างคำสั่งซื้อ การอัพเดตสินค้าคงคลัง และการบันทึกการชำระเงิน โฟกัสที่ ความหน่วงต่ำ ความสามารถในการรองรับพร้อมกันสูง และ ความถูกต้องของข้อมูล.
OLAP (Online Analytical Processing) ตอบคำถามเชิงธุรกิจด้วยการสแกนและสรุปข้อมูลจำนวนมาก (แดชบอร์ด แนวโน้ม โคฮอร์ต) โดยให้ความสำคัญกับ throughput การวิเคราะห์ที่ยืดหยุ่น และการสรุปข้อมูล ไม่ได้เน้นการตอบกลับในระดับมิลลิวินาที.
Why does running analytics on the same database hurt transactional performance?
เพราะภาระงานทั้งสองแย่งทรัพยากรชุดเดียวกัน:
- CPU & memory: การรวม/join จำนวนมากและการคำนวณหนักอาจเบียดเบียนคำสั่งสั้น ๆ ของธุรกรรมที่ต้องการความหน่วงต่ำ
- Disk I/O: การสแกนข้อมูลขนาดใหญ่รบกวนการอ่าน/เขียนแบบสุ่มเล็กๆ และการเขียน log/index ของ OLTP
- Cache churn: การสแกนขนาดใหญ่สามารถผลักข้อมูลร้อนของ OLTP ออกไป ทำให้ช้าอย่างฉับพลัน
- Connection pool pressure: คิวรี BI ยาว ๆ ไม่กี่ตัวอาจยึดการเชื่อมต่อทั้งหมดและทำให้คำขอแอปต้องรอ
ผลลัพธ์คือค่าสถิติหาง (p95/p99) ของการทำงานหลักไม่แน่นอนและช้าลงเป็นครั้งคราว.
Can’t we just add more indexes to make both OLTP and OLAP fast?
โดยทั่วไปไม่ใช่ทางออกที่ดี การเพิ่มดัชนีเพื่อให้แดชบอร์ดเร็วขึ้นมักย้อนกลับได้เพราะ:
- ดัชนีเพิ่ม ต้นทุนการเขียน (insert/update/delete ต้องอัปเดตโครงสร้างมากขึ้น)
- ดัชนีใช้ พื้นที่เก็บข้อมูล มากขึ้นและทำให้การบำรุงรักษาช้าลง (vacuum/reindex/backup)
- คุณอาจปรับจูนให้ดีแค่รายงานเดียว แต่ทำให้คำสั่งอื่นหรือการเขียนของ OLTP แย่ลง
สำหรับงานวิเคราะห์ มักได้ผลดีกว่าจาก การแบ่งพาร์ติชัน, storage แบบคอลัมน์, หรือการคำนวณรวมล่วงหน้า ในระบบที่ออกแบบมาสำหรับ OLAP.
How do MVCC and long-running queries make shared databases slower over time?
MVCC ช่วยลดการบล็อกระหว่างผู้อ่านกับผู้เขียน แต่ไม่ได้แก้ปัญหาการทำงานร่วมกันอย่างสิ้นเชิง:
- รายงานยาวๆ ยึด snapshot เก่าไว้ ทำให้การเก็บกวาดเวอร์ชันเก่า (cleanup) ถูกเลื่อนออกไป
- การเลื่อนการเก็บกวาดทำให้เกิด bloat/fragmentation ทำให้การค้นช้าลงและแคชใช้งานได้แย่ลง
- งานเบื้องหลังสำหรับการเก็บกวาด/บีบอัด จะใช้ CPU และ I/O ที่ OLTP ต้องการ
แม้ไม่มีการล็อกชัดเจนแล้ว การวิเคราะห์หนักๆ ก็ทำให้ระบบช้าลงตามเวลาได้.
What are the warning signs that it’s time to separate OLTP and OLAP?
คุณมักเห็นสัญญาณเช่น:
- พุ่งขึ้นของ p95/p99 latency สำหรับ endpoint สำคัญ (checkout/login/update)
- Timeouts หรือการ retry เพิ่มขึ้นในช่วงที่มีการรายงาน
- Connection pool exhaustion (คำขอแอปรอการเชื่อมต่อ DB ว่าง)
- เหตุการณ์ที่เกิดขึ้นพร้อมกับการรายงานปลายเดือน/ไตรมาส
ถ้าระบบช้าหรือเกิดปัญหาแบบสุ่มในตอนรีเฟรชแดชบอร์ด แปลว่าเป็นสัญญาณชัดเจนว่าควรแยก.
When does a read replica make sense for reporting?
Replica อ่านเป็นก้าวแรกที่พบบ่อย:
- ข้อดี: เปลี่ยนแปลงแอปน้อย เปิดใช้เร็ว ใช้ SQL แบบเดิม แยกภาระการเขียนออกจากตัวผลิต
- ข้อเสีย: รายงานหนักยังอาจอิ่ม CPU/I/O ของ replica; replication lag อาจทำให้ตัวเลขต่างกับ production; ยังใช้เทคโนโลยี row-store แบบ OLTP
เหมาะเมื่อปริมาณข้อมูลไม่มากและการหน่วงเป็น "นาที" ยังยอมรับได้.
When should we use a dedicated data warehouse instead of a replica?
คลังข้อมูล (data warehouse) เหมาะเมื่อคุณต้องการ:
- ประสิทธิภาพสูงบน การสแกน, join, และการสรุปข้อมูลขนาดใหญ่
- นักวิเคราะห์จำนวนมากรันคิวรีพร้อมกัน
- เก็บประวัติยาวโดยไม่กระทบ OLTP
- แยกการจูนและค่าใช้จ่ายชัดเจน (OLTP เพื่อความหน่วงต่ำ, OLAP เพื่อ throughput)
โดยปกติจำเป็นต้องมีโมเดลที่เหมาะกับการวิเคราะห์ (เช่น star/snowflake) และ pipeline สำหรับโหลดข้อมูล.
What is CDC, and why is it often better than running big ETL queries on production?
CDC (Change Data Capture) สตรีมการ insert/update/delete จากฐานข้อมูล OLTP (มักจาก log) ไปยังระบบวิเคราะห์.
ข้อดีคือ:
- ย้าย เฉพาะสิ่งที่เปลี่ยน แทนการสแกนตารางใหญ่ซ้ำ ๆ
- ได้ความสดของข้อมูลแบบ near-real-time โดยไม่รบกวน OLTP มาก
- ทำให้การ replay/backfill ง่ายขึ้นเมื่อจำเป็น
ข้อแลกเปลี่ยนคือเพิ่มความซับซ้อนของระบบและต้องจัดการการเปลี่ยนแปลงสกีมาอย่างระมัดระวัง.
How do I choose between ETL and ELT for moving OLTP data into OLAP?
เลือกตามความถี่ที่ตรรกะธุรกิจเปลี่ยนและสิ่งที่ต้องการเก็บ:
- ELT: โหลดข้อมูลดิบก่อน แล้วแปลงใน warehouse ต่อ เหมาะเมื่อนิยามเปลี่ยนบ่อยและต้องการพัฒนารวดเร็ว
- ETL: แปลงก่อนโหลด เหมาะเมื่อคุณต้องการเก็บผลลัพธ์ที่คัดกรองแล้วอย่างเข้มงวด
แนวปฏิบัติ: เริ่มด้วย ELT เพื่อความเร็ว แล้วเพิ่ม governance (tests, curated models) เมื่อเมตริกสำคัญนิ่งขึ้น.
Is it ever acceptable to keep OLTP and OLAP on the same database?
ได้ — แบบชั่วคราวและในเงื่อนไขที่เข้มงวด หากคุณ:
- ทำให้การวิเคราะห์เบามากจริง ๆ และมีเพดานชัดเจน
- ใช้ pre-aggregations (materialized views/summary tables) เพื่อหลีกเลี่ยงการสแกนดิบ
- ตั้งเวลารันรายงานนอกชั่วโมงทำการหรือมีบทบาทการรายงานที่จำกัดสิทธิและทรัพยากร
แต่ถ้าการรายงานเริ่มทำให้ latency พุ่งหรือเกิดเหตุการณ์ต่อเนื่อง ก็ควรแยกระบบทันที.