Table.StopFolding ป้องกันไม่ให้ขั้นตอน downstream ถูกส่งกลับไปประมวลผลที่ data source เดิม ช่วยเมื่อต้องดีบักหรือเมื่อการบังคับประมวลผลใน Power Query ให้ผลลัพธ์ที่คาดหวัง
= Table.StopFolding(table)
= Table.StopFolding(table)
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| table | table | Yes | ตารางที่ต้องการหยุด query folding จากจุดนี้เป็นต้นไป |
เมื่อขั้นตอนบางอย่างทำให้ query folding ล้มเหลวหรือทำให้เกิดข้อจำกัดบนแหล่งข้อมูล ให้ใช้ Table.StopFolding เพื่อย้ายการประมวลผลมาอยู่ที่ Power Query
let Source = Sql.Database("SomeSQLServer", "MyDb"), MyTable = Source{[Item="MyTable"]}[Data], MyLocalTable = Table.StopFolding(MyTable) in MyLocalTablelet
Source = Sql.Database("SomeSQLServer", "MyDb"),
MyTable = Source{[Item="MyTable"]}[Data],
MyLocalTable = Table.StopFolding(MyTable)
in
MyLocalTable
table
let Source = Sql.Database("Server01", "Sales"), Orders = Source{[Item="Orders"]}[Data], Local = Table.StopFolding(Orders), Filtered = Table.SelectRows(Local, ea…let
Source = Sql.Database("Server01", "Sales"),
Orders = Source{[Item="Orders"]}[Data],
Local = Table.StopFolding(Orders),
Filtered = Table.SelectRows(Local, each [Amount] > 1000 and [Status] = "Completed")
in
Filtered
table ที่ถูกกรองแล้ว
let Source = Sql.Database("Server01", "Sales"), Orders = Source{[Item="Orders"]}[Data], Stopped = Table.StopFolding(Orders), Buffered = Table.Buffer(Stopped) in…let
Source = Sql.Database("Server01", "Sales"),
Orders = Source{[Item="Orders"]}[Data],
Stopped = Table.StopFolding(Orders),
Buffered = Table.Buffer(Stopped)
in
Buffered
table ที่ถูก buffer และหยุด folding
let Source = Sql.Database("Server", "DB"), Data = Source{[Item="Customers"]}[Data], Local = Table.StopFolding(Data), Matched = Table.SelectRows(Local, each Text…let
Source = Sql.Database("Server", "DB"),
Data = Source{[Item="Customers"]}[Data],
Local = Table.StopFolding(Data),
Matched = Table.SelectRows(Local, each Text.Lower([Name]) = "john doe")
in
Matched
table ที่ตรงกับการแปลง text
ไม่เสมอ การย้ายงานมาทำใน Power Query (แทนที่จะให้ SQL ประมวลผล) อาจช้ากว่าเดิม ผมแนะนำให้ใช้ Table.StopFolding เมื่อจำเป็นเท่านั้น เช่น ดีบักปัญหาหรือเลี่ยงข้อจำกัดของแหล่งข้อมูล ส่วนใหญ่ folding ช่วยให้เร็ว
Table.StopFolding หยุดการส่งสั่งกลับไปยัง source แต่ไม่บังคับอ่านข้อมูล ส่วน Table.Buffer บังคับให้อ่านข้อมูลทั้งหมดมาเก็บในหน่วยความจำ ใช้ Table.Buffer เมื่อต้องอ่านข้อมูลหลายครั้ง ใช้ Table.StopFolding เมื่อต้องการป้องกันปัญหา folding
ใน Power Query Desktop ถ้าปลายลูกศรขึ้นด้านบน (icon ของแต่ละขั้นตอน) ชี้ไปยัง source ทำให้ folding ทำงาน ผมบอกคำแนะนำ: ใช้ Applied Steps ดูแต่ละขั้นตอน แล้วถ้า dependencies เชื่อมไปยัง source บอกว่า folding กำลังทำงาน
วาง Table.StopFolding หลังจากดึงข้อมูลแล้ว ก่อนการแปลงผลลัพธ์ที่ซับซ้อน หรือเมื่อเจออื่น ๆ ที่ไม่ folding ได้ (เช่น List.Generate) ผมลองใช้ดู ถ้า performance ไม่ผิด ถอดออก ถ้าดีขึ้นเก็บไว้
Table.StopFolding หยุด Query Folding (การส่งสั่งกลับไปยัง data source เดิม) ทำให้ขั้นตอนถัดไปไม่ถูกแปลงเป็นคิวรีที่รันบนแหล่งข้อมูล แต่ประมวลผลใน Power Query engine แทน
ที่เจ๋งคือในบางกรณี folding อาจส่งผลลัพธ์ที่ไม่คาดหวัง เช่นเมื่อตรรมชาติของฐานข้อมูล (ตัวอักษรพิมพ์เล็ก/ใหญ่ หรือวันที่) มีพฤติกรรมต่างจาก Power Query ด้วย Table.StopFolding เราบังคับให้ประมวลผลทั้งหมดเกิดขึ้นใน Power Query ซึ่งให้ความสอดคล้อง
ส่วนตัวผมใช้บ่อยเวลาดีบักปัญหาข้อมูล ตัดสินใจว่าส่วนไหน folding ได้ส่วนไหนไม่ได้ หรือเมื่อความสามารถของแหล่งข้อมูลจำกัด (บางฐานข้อมูลอ่อนแอบางประมาณ) ผมใช้ StopFolding เพื่อเลี่ยงปัญหา timeout หรือคิวรีที่ซับซ้อน