Thep Excel

Table.Bufferแคชตารางลงหน่วยความจำ

Table.Buffer บังคับโหลดตารางลงหน่วยความจำและแยกออกจากแหล่งข้อมูลต้นทาง ช่วยป้องกันการ fold และควบคุมเวลาประมวลผล

fx
= Table.Buffer(table, [options]) as table

ความนิยม5/10
ความยาก4/10
ประโยชน์6/10

อัปเดต 12 December 2025

Syntax & Arguments

อาร์กิวเมนต์ ชนิด ค่าเริ่มต้น คำอธิบาย
table Table ตารางที่ต้องการบัฟเฟอร์ลงหน่วยความจำ
[options]ไม่บังคับ Record null ตัวเลือก เช่น [BufferMode = BufferMode.Eager] (โหลดทันที) หรือ BufferMode.Delayed (โหลดเมื่อจำเป็น)

[ ] = อาร์กิวเมนต์ที่ไม่บังคับ

Additional Notes

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

Examples

โหลด SQL Table ลงหน่วยความจำlet Source = Sql.Database("MyServer", "MyDatabase"), Orders = Source{[Item="Orders"]}[Data], Buffered = Table.Buffer(Orders) in Buffered

ดึงข้อมูล Orders จาก SQL Database จากนั้นใช้ Table.Buffer เพื่อโหลดลงหน่วยความจำทั้งหมด หลังจากนี้สิ่งที่ทำกับ Buffered จะไม่ไปลงตัว SQL Server อีก

fx
let
Source = Sql.Database("MyServer", "MyDatabase"),
Orders = Source{[Item="Orders"]}[Data],
Buffered = Table.Buffer(Orders)
in
Buffered

ผลลัพธ์ตารางข้อมูล Orders ทั้งหมดถูกโหลดลงหน่วยความจำ การเข้าถึงแหล่งข้อมูลหยุด
ใช้ BufferMode.Eager สำหรับการโหลดทันทีlet Source = Excel.Workbook(File.Contents("C:\\Sales.xlsx")), SheetData = Source{[Item="Sheet1"]}[Data], Buffered = Table.Buffer(SheetData, [BufferMode = Buffer…

BufferMode.Eager บังคับให้ข้อมูลถูกโหลดทันที ตรงข้ามกับ Delayed ที่รอให้ต้องการข้อมูลจริง ๆ ก่อน

fx
let
Source = Excel.Workbook(File.Contents("C:\\Sales.xlsx")),
SheetData = Source{[Item="Sheet1"]}[Data],
Buffered = Table.Buffer(SheetData, [BufferMode = BufferMode.Eager])
in
Buffered

ผลลัพธ์ข้อมูลจาก Excel ถูกโหลดลงหน่วยความจำทันทีที่ query ทำงาน
ป้องกัน timeout จาก API ขนาดใหญ่let Source = Web.Contents("https://api.example.com/data?limit=100000"), Json = Json.Document(Source), ToTable = Table.FromList(Json[results], Splitter.SplitByNo…

เมื่อดึงข้อมูลจาก API ที่หนัก ให้ Buffer ก่อนทำ transformation ซับซ้อน นี่จะช่วยป้องกัน timeout และทำให้ query ประเมินค่าอย่างมีประสิทธิภาพ

fx
let
Source = Web.Contents("https://api.example.com/data?limit=100000"),
Json = Json.Document(Source),
ToTable = Table.FromList(Json[results], Splitter.SplitByNothing()),
Buffered = Table.Buffer(ToTable),
AddIndex = Table.AddIndexColumn(Buffered, "Index", 1),
Filtered = Table.SelectRows(AddIndex, each [Index] <= 1000)
in
Filtered

ผลลัพธ์ข้อมูล 100,000 แถวจาก API ถูกแคชลงหน่วยความจำก่อน จากนั้นจึงกรองเหลือ 1,000 แถว
Buffer ก่อนใช้ข้อมูลหลายครั้งlet Source = Csv.Document(File.Contents("C:\\Data.csv"), [Delimiter=","]), ToTable = Table.FromList(Source, Splitter.SplitByNothing()), Buffered = Table.Buffer(…

โดยไม่มี Table.Buffer ทุกครั้งที่ SelectRows มันต้องเข้าไปที่ไฟล์ CSV ซ้ำ ด้วย Buffer มันเข้าไฟล์ครั้งเดียวแล้วใช้ข้อมูลที่ cache ไว้

fx
let
Source = Csv.Document(File.Contents("C:\\Data.csv"), [Delimiter=","]),
ToTable = Table.FromList(Source, Splitter.SplitByNothing()),
Buffered = Table.Buffer(ToTable),
Column1 = Table.SelectRows(Buffered, each [Column1] = "Active"),
Column2 = Table.SelectRows(Buffered, each [Column2] > 1000),
Combined = Table.Combine({Column1, Column2})
in
Combined

ผลลัพธ์ข้อมูล CSV ถูก buffer ลังครั้งเดียว แล้วนำมาใช้ในหลาย operations

FAQs

Table.Buffer กับ Table.StopFolding ต่างกันอย่างไร?+

ผมคิดว่า StopFolding เป็น "ตัวเลิก" ส่วน Buffer เป็น "ตัวแคช" นะ StopFolding หยุดการ fold แต่ยังคงการเข้าถึง source ต่อไป ส่วน Buffer นั้นโหลดข้อมูลลงหน่วยความจำจริง ๆ ถ้าแค่อยากหยุด fold ให้ใช้ StopFolding เพราะเบากว่า ถ้าต้องการแยกข้อมูลออกจาก source ให้ใช้ Buffer

BufferMode.Eager กับ BufferMode.Delayed ต่างกันอย่างไร?+

ผมมักใช้ Eager เวลาต้องการให้ข้อมูลโหลดทันที ส่วน Delayed นั้นปล่อยให้ Power Query โหลดตามความจำเป็นเท่านั้น Eager เหมาะสำหรับข้อมูลที่น้อย ๆ ต้องการแน่นอน ส่วน Delayed เหมาะสำหรับข้อมูลที่เยอะแต่อาจไม่ใช้ทั้งหมด

Table.Buffer ใช้แล้วจะทำให้ query ช้าลงไหม?+

ได้จริง ผมเคยประสบ Buffer มีค่าใช้จ่าย memory ถ้าข้อมูลเยอะเกินไป มันอาจช้าแทนที่จะเร็ว ส่วนใหญ่ Buffer เหมาะสำหรับข้อมูลปานกลาง ถ้าข้อมูล 50 ล้าน rows ต้องคิดดูว่า buffer เสียคุ้มไหม

ข้อมูลที่ Buffer ได้รวม nested values ไหม?+

ผม buffer ได้แต่ scalar values เท่านั้น (ตัวเลข ข้อความ) ส่วน nested structures เช่น records, lists, tables ยังคงเป็น lazy references อยู่ นี่เรียกว่า shallow buffering

ต้อง Buffer ทั้งหมดมั้ย หรือบาง columns ก็พอ?+

ผมแนะนำให้ buffer ตั้งแต่ต้นเลย ก่อนทำ transformation ใดลงมา ถ้า buffer ทีหลังอาจมีส่วนของข้อมูลไม่ถูก buffer นะ ดังนั้นที่ดีที่สุดคือใช้ Table.Buffer ขึ้นมาเร็วที่สุดในสูตร

Resources & Related

ฟังก์ชันที่ผู้เขียนโยงไว้กับ Table.Buffer จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง

ฟังก์ชันนี้Table.BufferTable functions
Table functions (5)
Table.AddIndexColumn

Table.AddIndexColumn ใช้สำหรับเพิ่มคอลัมน์ที่มีลำดับเลขให้กับตาราง ช่วยให้สามารถกำหนดหมายเลขแถวตามลำดับได้

Table.Combine

Table.Combine ใช้สำหรับรวม list ของ table เข้าเป็น table เดียว ยับยั้ง append ตัว 1 แถวหลาย ๆ ตารางพร้อมกัน

Table.SelectRows

Table.SelectRows เป็นฟังก์ชันสำหรับกรองตาราง (filter table) ใน Power Query โดยใช้ฟังก์ชันเงื่อนไข (condition function) เพื่อตรวจสอบแต่ละแถว ถ้าเงื่อนไขคืนค่า true จะเก็บแถวนั้นไว้ ถ้าเป็น false จะตัดทิ้ง สามารถใช้ keyword 'each' ร่วมกับการอ้างอิงคอลัมน์ด้วย [ColumnName] เพื่อเขียนเงื่อนไขได้สะดวก รองรับการกรองตามตัวเลข ข้อความ วันที่ การตรวจสอบค่า null และเงื่อนไขที่ซับซ้อนด้วย and/or operators ฟังก์ชันนี้รองรับ Query Folding ซึ่งช่วยเพิ่มประสิทธิภาพเมื่อทำงานกับ data source ขนาดใหญ่

Table.StopFolding

Table.StopFolding ป้องกันไม่ให้ขั้นตอน downstream ถูกส่งกลับไปประมวลผลที่ data source เดิม ช่วยเมื่อต้องดีบักหรือเมื่อการบังคับประมวลผลใน Power Query ให้ผลลัพธ์ที่คาดหวัง

Table.TransformColumns

Table.TransformColumns ใช้สำหรับแปลงข้อมูลในคอลัมน์โดยใช้ฟังก์ชันที่กำหนดไว้ แต่ละคอลัมน์สามารถมีการแปลงแตกต่างกันได้ รองรับการเปลี่ยนแปลงประเภทข้อมูลในเวลาเดียวกัน

List functions (1)
List.Buffer

List.Buffer เก็บรายการข้อมูลไว้ในหน่วยความจำเพื่อเพิ่มประสิทธิภาพเมื่อต้องเข้าถึงรายการเดียวกันหลายครั้ง ฟังก์ชันนี้มีประโยชน์เมื่อต้องใช้ผลลัพธ์จากการคำนวณซ้ำๆ หรือเมื่อต้องการลดจำนวนการเข้าถึงแหล่งข้อมูลภายนอก

Comments

อีเมลของคุณจะไม่ถูกเผยแพร่