Table.Buffer บังคับโหลดตารางลงหน่วยความจำและแยกออกจากแหล่งข้อมูลต้นทาง ช่วยป้องกันการ fold และควบคุมเวลาประมวลผล
| อาร์กิวเมนต์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
| table | Table | ตารางที่ต้องการบัฟเฟอร์ลงหน่วยความจำ | |
| [options]ไม่บังคับ | Record | null | ตัวเลือก เช่น [BufferMode = BufferMode.Eager] (โหลดทันที) หรือ BufferMode.Delayed (โหลดเมื่อจำเป็น) |
[ ] = อาร์กิวเมนต์ที่ไม่บังคับ
Table.Buffer บังคับให้ Power Query โหลดข้อมูลตารางลงหน่วยความจำ (memory) ทั้งหมด แล้วตัดการเชื่อมต่อจากแหล่งต้นทาง
ที่เจ๋งคือสามารถป้องกันการ fold (folding) ไม่ให้คิวรี่ลงมา SQL Server ซ้ำ เมื่อคุณทำ Table.Buffer ข้อมูลจะถูก “ล็อก” ไว้ในหน่วยความจำ และการแปลงที่มาหลังจากนั้นจะทำงานกับข้อมูลที่โหลดแล้ว ไม่ได้ไปค้นหา source ใหม่
ส่วนตัวผมใช้ Table.Buffer บ่อย ๆ ในสองกรณี: (1) เมื่อข้อมูล SQL Server หรือ API เปลี่ยนแปลงตลอด – โหลดมาก่อนเพื่อให้ผลลัพธ์คงที่ (2) เมื่อคิวรี่ซับซ้อนมาก ๆ – buffer เข้าเพื่อลดภาระบน source ระวังอย่างเดียวคือ memory ถ้าข้อมูลเยอะเกินไป หรือใช้ Table.StopFolding ก็ได้ถ้าแค่อยากหยุด fold
ดึงข้อมูล Orders จาก SQL Database จากนั้นใช้ Table.Buffer เพื่อโหลดลงหน่วยความจำทั้งหมด หลังจากนี้สิ่งที่ทำกับ Buffered จะไม่ไปลงตัว SQL Server อีก
BufferMode.Eager บังคับให้ข้อมูลถูกโหลดทันที ตรงข้ามกับ Delayed ที่รอให้ต้องการข้อมูลจริง ๆ ก่อน
เมื่อดึงข้อมูลจาก API ที่หนัก ให้ Buffer ก่อนทำ transformation ซับซ้อน นี่จะช่วยป้องกัน timeout และทำให้ query ประเมินค่าอย่างมีประสิทธิภาพ
โดยไม่มี Table.Buffer ทุกครั้งที่ SelectRows มันต้องเข้าไปที่ไฟล์ CSV ซ้ำ ด้วย Buffer มันเข้าไฟล์ครั้งเดียวแล้วใช้ข้อมูลที่ cache ไว้
ผมคิดว่า StopFolding เป็น "ตัวเลิก" ส่วน Buffer เป็น "ตัวแคช" นะ StopFolding หยุดการ fold แต่ยังคงการเข้าถึง source ต่อไป ส่วน Buffer นั้นโหลดข้อมูลลงหน่วยความจำจริง ๆ ถ้าแค่อยากหยุด fold ให้ใช้ StopFolding เพราะเบากว่า ถ้าต้องการแยกข้อมูลออกจาก source ให้ใช้ Buffer
ผมมักใช้ Eager เวลาต้องการให้ข้อมูลโหลดทันที ส่วน Delayed นั้นปล่อยให้ Power Query โหลดตามความจำเป็นเท่านั้น Eager เหมาะสำหรับข้อมูลที่น้อย ๆ ต้องการแน่นอน ส่วน Delayed เหมาะสำหรับข้อมูลที่เยอะแต่อาจไม่ใช้ทั้งหมด
ได้จริง ผมเคยประสบ Buffer มีค่าใช้จ่าย memory ถ้าข้อมูลเยอะเกินไป มันอาจช้าแทนที่จะเร็ว ส่วนใหญ่ Buffer เหมาะสำหรับข้อมูลปานกลาง ถ้าข้อมูล 50 ล้าน rows ต้องคิดดูว่า buffer เสียคุ้มไหม
ผม buffer ได้แต่ scalar values เท่านั้น (ตัวเลข ข้อความ) ส่วน nested structures เช่น records, lists, tables ยังคงเป็น lazy references อยู่ นี่เรียกว่า shallow buffering
ผมแนะนำให้ buffer ตั้งแต่ต้นเลย ก่อนทำ transformation ใดลงมา ถ้า buffer ทีหลังอาจมีส่วนของข้อมูลไม่ถูก buffer นะ ดังนั้นที่ดีที่สุดคือใช้ Table.Buffer ขึ้นมาเร็วที่สุดในสูตร
ฟังก์ชันที่ผู้เขียนโยงไว้กับ Table.Buffer จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
Table.AddIndexColumn ใช้สำหรับเพิ่มคอลัมน์ที่มีลำดับเลขให้กับตาราง ช่วยให้สามารถกำหนดหมายเลขแถวตามลำดับได้
Table.Combine ใช้สำหรับรวม list ของ table เข้าเป็น table เดียว ยับยั้ง append ตัว 1 แถวหลาย ๆ ตารางพร้อมกัน
Table.SelectRows เป็นฟังก์ชันสำหรับกรองตาราง (filter table) ใน Power Query โดยใช้ฟังก์ชันเงื่อนไข (condition function) เพื่อตรวจสอบแต่ละแถว ถ้าเงื่อนไขคืนค่า true จะเก็บแถวนั้นไว้ ถ้าเป็น false จะตัดทิ้ง สามารถใช้ keyword 'each' ร่วมกับการอ้างอิงคอลัมน์ด้วย [ColumnName] เพื่อเขียนเงื่อนไขได้สะดวก รองรับการกรองตามตัวเลข ข้อความ วันที่ การตรวจสอบค่า null และเงื่อนไขที่ซับซ้อนด้วย and/or operators ฟังก์ชันนี้รองรับ Query Folding ซึ่งช่วยเพิ่มประสิทธิภาพเมื่อทำงานกับ data source ขนาดใหญ่
Table.StopFolding ป้องกันไม่ให้ขั้นตอน downstream ถูกส่งกลับไปประมวลผลที่ data source เดิม ช่วยเมื่อต้องดีบักหรือเมื่อการบังคับประมวลผลใน Power Query ให้ผลลัพธ์ที่คาดหวัง
Table.TransformColumns ใช้สำหรับแปลงข้อมูลในคอลัมน์โดยใช้ฟังก์ชันที่กำหนดไว้ แต่ละคอลัมน์สามารถมีการแปลงแตกต่างกันได้ รองรับการเปลี่ยนแปลงประเภทข้อมูลในเวลาเดียวกัน
List.Buffer เก็บรายการข้อมูลไว้ในหน่วยความจำเพื่อเพิ่มประสิทธิภาพเมื่อต้องเข้าถึงรายการเดียวกันหลายครั้ง ฟังก์ชันนี้มีประโยชน์เมื่อต้องใช้ผลลัพธ์จากการคำนวณซ้ำๆ หรือเมื่อต้องการลดจำนวนการเข้าถึงแหล่งข้อมูลภายนอก
ยังไม่มีบทความที่เกี่ยวข้องกับฟังก์ชันนี้
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่