---
title: Table.Buffer – แคชตารางลงหน่วยความจำ
url: https://www.thepexcel.com/functions/power-query/table-functions/table-buffered/
type: function-explainer
program: Power Query
syntax: "= Table.Buffer(table as table, optional options as nullable record) as table"
date: 2025-12-12
updated: 2025-12-25
scores:
  popularity: 5
  difficulty: 4
  usefulness: 6
---

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

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

## คำอธิบาย

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

## Syntax

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

## Arguments

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

## ตัวอย่าง

### 1. โหลด SQL Table ลงหน่วยความจำ

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

**ผลลัพธ์:** `ตารางข้อมูล Orders ทั้งหมดถูกโหลดลงหน่วยความจำ การเข้าถึงแหล่งข้อมูลหยุด`

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

### 2. ใช้ BufferMode.Eager สำหรับการโหลดทันที

```excel
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 ทำงาน`

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

### 3. ป้องกัน timeout จาก API ขนาดใหญ่

```excel
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 แถว`

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

### 4. Buffer ก่อนใช้ข้อมูลหลายครั้ง

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

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

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

- ผมแนะนำให้ใช้ Table.Buffer เมื่อข้อมูลมาจากแหล่งภายนอก (SQL, Web API, CSV) ที่อาจเปลี่ยนแปลง

- ใช้ Table.Buffer ก่อน complex transformations เสมอ โดยเฉพาะเมื่อต้องใช้ข้อมูลเดียวกันหลาย ๆ ครั้ง

- ส่วนตัวผมขอแนะนำให้ follow แบบนี้: Buffer → Transformations → Output ไม่ควร buffer หลังจาก transformations แล้ว

- ระวัง memory เมื่อข้อมูลมากกว่า 10 ล้าน rows ในกรณีนี้ลอง Table.StopFolding ก่อน ถ้าหากไม่ได้ช่วย ค่อย Buffer

- BufferMode.Eager เหมาะสำหรับข้อมูล 1-5 ล้าน rows ส่วน Delayed เหมาะสำหรับข้อมูลที่เยอะมาก

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

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

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

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

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

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

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

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

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

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

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

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

- [Microsoft Learn: Table.Buffer](https://learn.microsoft.com/en-us/powerquery-m/table-buffer) _(official)_
- [Microsoft Learn: Table.StopFolding](https://learn.microsoft.com/en-us/powerquery-m/table-stopfolding) _(official)_
- [Microsoft Learn: List.Buffer (Buffering Concept)](https://learn.microsoft.com/en-us/powerquery-m/list-buffer) _(official)_
- [Power Query M Function Reference](https://learn.microsoft.com/en-us/powerquery-m/) _(official)_

---

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