Thep Excel

Table.Buffer – โหลดตารางเข้า Memory เพื่อความเร็ว

โหลดตารางเข้าสู่หน่วยความจำ (RAM) เพื่อแยกข้อมูลจากแหล่งเดิมและป้องกันไม่ให้ Query Folding ดึงข้อมูลใหม่

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

By ThepExcel AI Agent
3 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 ตารางที่ต้องการ Buffer เข้าสู่หน่วยความจำ
options nullable record Optional BufferMode.Eager เลือก BufferMode: BufferMode.Eager (โหลดทันที) หรือ BufferMode.Delayed (โหลดเมื่อต้องใช้)

Examples

ตัวอย่างพื้นฐาน: Buffer ข้อมูลเพื่อใช้ซ้ำ
let Source = Excel.CurrentWorkbook(){[Name="Sales"]}[Content], Buffered = Table.Buffer(Source) in Buffered
ใช้เมื่อต้องดึงข้อมูลจาก Excel หลายครั้ง Buffer ทำให้ไม่ต้องอ่าน Excel ซ้ำทุกครั้ง
Power Query Formula:

let
    Source = Excel.CurrentWorkbook(){[Name="Sales"]}[Content],
    Buffered = Table.Buffer(Source)
in
    Buffered

Result:

ตารางเดิมแต่โหลดเข้า RAM เรียบร้อย

ตัวอย่างที่ 2: Buffer ก่อนแบ่งข้อมูลหลายทาง
let Source = Table.FromRecords({ [ID = 1, Status = "Active", Amount = 1000], [ID = 2, Status = "Inactive", Amount = 2000], [ID = 3, Status = "Active", Amount =…
Buffer ก่อน ทำให้ Active, Inactive, HighAmount ทั้งหมดใช้ข้อมูล Buffered ร่วมกัน ไม่ต้องดึงข้อมูล Source ใหม่
Power Query Formula:

let
    Source = Table.FromRecords({
        [ID = 1, Status = "Active", Amount = 1000],
        [ID = 2, Status = "Inactive", Amount = 2000],
        [ID = 3, Status = "Active", Amount = 1500]
    }),
    Buffered = Table.Buffer(Source),
    Active = Table.SelectRows(Buffered, each [Status] = "Active"),
    Inactive = Table.SelectRows(Buffered, each [Status] = "Inactive"),
    HighAmount = Table.SelectRows(Buffered, each [Amount] > 1200)
in
    Buffered

Result:

ตารางเดิม โดยข้อมูลดึงมาเพียงครั้งเดียว

ตัวอย่างที่ 3: Buffer ตารางขนาดใหญ่ก่อน Join หลายครั้ง
let LargeTable = Sql.Database("Server", "MyDB"){[Item="Products"]}[Data], BufferedProducts = Table.Buffer(LargeTable), Orders = Excel.CurrentWorkbook(){[Name="O…
Buffer Products ก่อน จะโหลด Products ครั้งเดียวแล้วนำมา Join กับ Orders และ Returns โดยไม่ต้องดึงข้อมูลใหม่
Power Query Formula:

let
    LargeTable = Sql.Database("Server", "MyDB"){[Item="Products"]}[Data],
    BufferedProducts = Table.Buffer(LargeTable),
    Orders = Excel.CurrentWorkbook(){[Name="Orders"]}[Content],
    JoinWithOrders = Table.NestedJoin(
        Orders, "ProductID",
        BufferedProducts, "ID",
        "Product"
    ),
    Returns = Excel.CurrentWorkbook(){[Name="Returns"]}[Content],
    JoinWithReturns = Table.NestedJoin(
        Returns, "ProductID",
        BufferedProducts, "ID",
        "Product"
    )
in
    JoinWithOrders

Result:

ตารางที่ Join กับ Products โดยข้อมูล Products โหลดมาเพียงครั้งเดียว

ตัวอย่างที่ 4: Buffer ด้วย Delayed Mode
let Source = Sql.Database("Server", "MyDB"){[Item="MassiveTable"]}[Data], Buffered = Table.Buffer(Source, [BufferMode = BufferMode.Delayed]) in Buffered
BufferMode.Delayed ใช้เมื่อตารางขนาดใหญ่มากและอาจไม่ได้ใช้ทั้งหมด จะช่วยประหยัด Memory ในระยะแรก
Power Query Formula:

let
    Source = Sql.Database("Server", "MyDB"){[Item="MassiveTable"]}[Data],
    Buffered = Table.Buffer(Source, [BufferMode = BufferMode.Delayed])
in
    Buffered

Result:

ตารางเดิม โดยจะโหลดเข้า Memory เมื่อต้องใช้ไม่ใช่ทันที

FAQs

Table.Buffer ช่วยเพิ่ม Performance ได้ไหม?

ไม่ใช่เสมอไป Buffer ช่วยเมื่อคุณใช้ตารางซ้ำหลายครั้ง ลดการดึงข้อมูลจากแหล่งเดิม แต่ถ้าใช้ตารางแค่ครั้งเดียว Buffer อาจทำให้ Performance แย่ลง เพราะต้องเสียเวลา + Memory ในการโหลด

ต่างจาก Table.StopFolding ยังไง?

Table.Buffer โหลดข้อมูลทั้งหมดเข้า Memory และป้องกัน Query Folding / Table.StopFolding เพียงป้องกัน Query Folding โดยไม่โหลดข้อมูล ถ้าต้องเพิ่ม Performance คุณควรเลือก Table.StopFolding อันดับแรก

เมื่อไหร่ควร Buffer?

ควร Buffer เมื่อ: (1) ใช้ตารางซ้ำ 2 ครั้งขึ้นไป (2) ตารางมาจาก Source ช้า เช่น SQL Database (3) ใช้ Join หรือ Merge ซ้ำกับตารางเดิม อย่า Buffer ถ้าใช้แค่ครั้งเดียว

BufferMode.Eager vs BufferMode.Delayed ต่างกันไหม?

Eager โหลดเข้า Memory ทันที (ค่าเริ่มต้น) / Delayed โหลดเมื่อต้องใช้จริง Delayed ช่วยประหยัด Memory ถ้าบางครั้งไม่ได้ใช้ตารางทั้งหมด

Resources & Related

Additional Notes

Table.Buffer ใช้เพื่อโหลดตารางเข้าสู่หน่วยความจำ (RAM) ซึ่งช่วยแยกข้อมูลจากแหล่งเดิมและป้องกันการดึงข้อมูลซ้ำในขั้นตอนถัดไป

ในทางปฏิบัติ Table.Buffer มีประโยชน์มากเมื่อคุณต้องใช้ตารางเดียวกันหลายครั้ง เช่นแบ่งข้อมูลเป็นหลาย Group หรือทำ Join กับตารางเดิมหลายครั้ง เพราะจะโหลดข้อมูลจากแหล่งเดิมเพียงครั้งเดียว

แต่ส่วนตัวผม Buffer ไม่ใช่วิธีแก้ปัญหาประสิทธิภาพแบบสากล นอกจากจะช่วยในกรณีที่ใช้ตารางซ้ำแล้ว Buffer อาจทำให้ Performance แย่ลง เพราะต้องโหลดข้อมูลทั้งหมดเข้า Memory ก่อน จึงควรใช้อย่างชาญฉลาด ไม่ใช่ใช้ให้ทั่ว 😎

Leave a Reply

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