---
title: Table.Buffer – โหลดตารางเข้า Memory เพื่อความเร็ว
url: https://www.thepexcel.com/functions/power-query/table-functions/table-buffer/
type: function-explainer
program: Power Query
syntax: "Table.Buffer(table as table, optional options as nullable record) as table"
date: 2025-12-03
updated: 2025-12-24
scores:
  popularity: 5
  difficulty: 4
  usefulness: 6
---

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

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

## คำอธิบาย

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

## Syntax

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

## Arguments

| Name | Required | Type | Default | Description |
| --- | --- | --- | --- | --- |
| table | Yes | table |  | ตารางที่ต้องการ Buffer เข้าสู่หน่วยความจำ |
| options | No | nullable record | BufferMode.Eager | เลือก BufferMode: BufferMode.Eager (โหลดทันที) หรือ BufferMode.Delayed (โหลดเมื่อต้องใช้) |

## ตัวอย่าง

### 1. ตัวอย่างพื้นฐาน: Buffer ข้อมูลเพื่อใช้ซ้ำ

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

**ผลลัพธ์:** `ตารางเดิมแต่โหลดเข้า RAM เรียบร้อย`

ใช้เมื่อต้องดึงข้อมูลจาก Excel หลายครั้ง Buffer ทำให้ไม่ต้องอ่าน Excel ซ้ำทุกครั้ง

### 2. ตัวอย่างที่ 2: Buffer ก่อนแบ่งข้อมูลหลายทาง

```excel
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
```

**ผลลัพธ์:** `ตารางเดิม โดยข้อมูลดึงมาเพียงครั้งเดียว`

Buffer ก่อน ทำให้ Active, Inactive, HighAmount ทั้งหมดใช้ข้อมูล Buffered ร่วมกัน ไม่ต้องดึงข้อมูล Source ใหม่

### 3. ตัวอย่างที่ 3: Buffer ตารางขนาดใหญ่ก่อน Join หลายครั้ง

```excel
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
```

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

Buffer Products ก่อน จะโหลด Products ครั้งเดียวแล้วนำมา Join กับ Orders และ Returns โดยไม่ต้องดึงข้อมูลใหม่

### 4. ตัวอย่างที่ 4: Buffer ด้วย Delayed Mode

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

**ผลลัพธ์:** `ตารางเดิม โดยจะโหลดเข้า Memory เมื่อต้องใช้ไม่ใช่ทันที`

BufferMode.Delayed ใช้เมื่อตารางขนาดใหญ่มากและอาจไม่ได้ใช้ทั้งหมด จะช่วยประหยัด Memory ในระยะแรก

## หมายเหตุเพิ่มเติม

- ใช้ Table.Buffer เมื่อต้องใช้ตารางเดิมหลายครั้ง จะช่วยโหลดข้อมูลครั้งเดียวแล้วนำมาใช้ซ้ำ

- ถ้าต้องป้องกัน Query Folding แต่ไม่รู้ว่า Buffer ต่อให้ประสิทธิภาพ ลองใช้ Table.StopFolding ก่อน

- เมื่อ Buffer ตารางจาก SQL Server หรือ Database อื่น จะช่วยเพิ่ม Performance เพราะไม่ต้องทำการ Query ด้วยตัวของ Server

- BufferMode.Delayed มีประโยชน์ก็ต่อเมื่อบางครั้งอาจไม่ได้ใช้ตารางทั้งหมด หรือ Memory มีจำกัด

- ใช้ร่วมกับ Table.Profile หรือ Expression.Evaluate ได้เพื่อวิเคราะห์ผลลัพธ์ของ Buffer

## คำถามที่พบบ่อย

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

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

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

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

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

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

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

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

## ฟังก์ชันที่เกี่ยวข้อง

- [Table.StopFolding – หยุด Query Folding (บังคับประมวลผลใน Power Query)](https://www.thepexcel.com/functions/power-query/table-functions/table-stopfolding/)

## แหล่งข้อมูลเพิ่มเติม

- [Microsoft Learn - Official Documentation](https://learn.microsoft.com/en-us/powerquery-m/table-buffer) _(official)_
- [PowerQuery.how - Table.Buffer Reference](https://powerquery.how/table-buffer/) _(article)_
- [Table.StopFolding - Alternative to Buffer](https://learn.microsoft.com/en-us/powerquery-m/table-stopfolding) _(official)_

---

_Source: [https://www.thepexcel.com/functions/power-query/table-functions/table-buffer/](https://www.thepexcel.com/functions/power-query/table-functions/table-buffer/)_
