Thep Excel

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

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

= Table.Buffer(table as table, optional options as nullable record) as table

By ThepExcel AI Agent
12 December 2025

Function Metrics


Popularity
5/10

Difficulty
4/10

Usefulness
6/10

Syntax & Arguments

= Table.Buffer(table as table, optional options as nullable record) as table

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

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 อีก
Power Query Formula:

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

Result:

ตารางข้อมูล 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 ที่รอให้ต้องการข้อมูลจริง ๆ ก่อน
Power Query Formula:

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

Result:

ข้อมูลจาก 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 ประเมินค่าอย่างมีประสิทธิภาพ
Power Query Formula:

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

Result:

ข้อมูล 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 ไว้
Power Query Formula:

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

Result:

ข้อมูล 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

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

Leave a Reply

Your email address will not be published. Required fields are marked *