ระบุอัลกอริทึมที่ใช้ในการ Join ข้อมูลจากสองตาราง ช่วยให้คุณควบคุมประสิทธิภาพการทำงานได้ดีขึ้น
={{ JoinAlgorithm.Dynamic | JoinAlgorithm.PairwiseHash | JoinAlgorithm.SortMerge | JoinAlgorithm.LeftHash | JoinAlgorithm.RightHash | JoinAlgorithm.LeftIndex | JoinAlgorithm.RightIndex }}
={{ JoinAlgorithm.Dynamic | JoinAlgorithm.PairwiseHash | JoinAlgorithm.SortMerge | JoinAlgorithm.LeftHash | JoinAlgorithm.RightHash | JoinAlgorithm.LeftIndex | JoinAlgorithm.RightIndex }}
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| JoinAlgorithm.Dynamic | number (0) | Optional | ปล่อยให้ Power Query เลือกอัลกอริทึมที่เหมาะสมเอง โดยดูจากลักษณะของข้อมูลและตาราง (ค่าเริ่มต้น) | |
| JoinAlgorithm.PairwiseHash | number (1) | Optional | เก็บข้อมูลของทั้งสองตารางไว้ในหน่วยความจำก่อน แล้วค่อย Join ทีหลัง ใช้ได้ดีถ้าข้อมูลน้อยเท่านั้น | |
| JoinAlgorithm.SortMerge | number (2) | Optional | Join โดยถือว่าทั้งสองตารางถูกเรียงลำดับแล้ว เร็วและประหยัดหน่วยความจำ แต่ต้องแน่ใจว่าข้อมูลเรียงตาม Join Key จริงๆ | |
| JoinAlgorithm.LeftHash | number (3) | Optional | เก็บข้อมูลตารางซ้ายไว้เป็น Lookup Table แล้ว Stream ข้อมูลตารางขวา เหมาะเวลาตารางซ้ายเล็กกว่า | |
| JoinAlgorithm.RightHash | number (4) | Optional | เก็บข้อมูลตารางขวาไว้เป็น Lookup Table แล้ว Stream ข้อมูลตารางซ้าย เหมาะเวลาตารางขวาเล็กกว่า | |
| JoinAlgorithm.LeftIndex | number (5) | Optional | ใช้ Key จากตารางซ้ายเพื่อ Query ตารางขวา เหมาะตารางขวาใหญ่ที่รองรับ Query Folding | |
| JoinAlgorithm.RightIndex | number (6) | Optional | ใช้ Key จากตารางขวาเพื่อ Query ตารางซ้าย เหมาะตารางซ้ายใหญ่ที่รองรับ Query Folding |
let LeftTable = Table.FromRecords({[ID = 1, Name = "Alice"], [ID = 2, Name = "Bob"]}), RightTable = Table.FromRecords({[ID = 1, Salary = 50000], [ID = 2, Salary…let
LeftTable = Table.FromRecords({[ID = 1, Name = "Alice"], [ID = 2, Name = "Bob"]}),
RightTable = Table.FromRecords({[ID = 1, Salary = 50000], [ID = 2, Salary = 60000]}),
Joined = Table.Join(LeftTable, {"ID"}, RightTable, {"ID"}, JoinKind.Inner, JoinAlgorithm.Dynamic)
in
Joined
ตารางที่รวม ID, Name, และ Salary โดยให้ Power Query เลือกวิธี Join เอง
let SmallTable = Table.FromRecords({[ProductID = 1, ProductName = "Laptop"], [ProductID = 2, ProductName = "Phone"]}), LargeTable = Table.FromRecords({[ProductI…let
SmallTable = Table.FromRecords({[ProductID = 1, ProductName = "Laptop"], [ProductID = 2, ProductName = "Phone"]}),
LargeTable = Table.FromRecords({[ProductID = 1, Quantity = 100], [ProductID = 2, Quantity = 200], [ProductID = 1, Quantity = 50]}),
Joined = Table.Join(SmallTable, {"ProductID"}, LargeTable, {"ProductID"}, JoinKind.Inner, JoinAlgorithm.LeftHash)
in
Joined
ตารางที่ Join ProductID Name และ Quantity โดยเก็บ SmallTable ไว้ในหน่วยความจำ
let SortedLeft = Table.Sort(Table.FromRecords({[ID = 2, Value = "B"], [ID = 1, Value = "A"]}), {{"ID", Order.Ascending}}), SortedRight = Table.Sort(Table.FromRe…let
SortedLeft = Table.Sort(Table.FromRecords({[ID = 2, Value = "B"], [ID = 1, Value = "A"]}), {{"ID", Order.Ascending}}),
SortedRight = Table.Sort(Table.FromRecords({[ID = 1, Amount = 100], [ID = 2, Amount = 200]}), {{"ID", Order.Ascending}}),
Joined = Table.Join(SortedLeft, {"ID"}, SortedRight, {"ID"}, JoinKind.Inner, JoinAlgorithm.SortMerge)
in
Joined
ตารางที่ Join ID Value และ Amount โดยใช้ SortMerge ซึ่งเร็วและประหยัด
let LargeTable = Table.FromRecords({[ID = 1, Name = "A"], [ID = 2, Name = "B"]}), SmallTable = Table.FromRecords({[ID = 1, Category = "X"], [ID = 2, Category =…let
LargeTable = Table.FromRecords({[ID = 1, Name = "A"], [ID = 2, Name = "B"]}),
SmallTable = Table.FromRecords({[ID = 1, Category = "X"], [ID = 2, Category = "Y"]}),
Joined = Table.Join(LargeTable, {"ID"}, SmallTable, {"ID"}, JoinKind.Inner, JoinAlgorithm.RightHash)
in
Joined
ตารางที่ Join ID Name และ Category โดยเก็บ SmallTable ไว้ในหน่วยความจำ
JoinAlgorithm.Type นั่นแหละคือตัวควบคุมว่า Power Query จะใช้อัลกอริทึมไหนในการ Join ข้อมูลครับ ผมเห็นมาหลายครั้งที่คนเขียน M code ลืมใส่ใจเรื่องนี้ แล้วได้ผลลัพธ์ที่ช้ามากๆ เลือกอัลกอริทึมที่เหมาะสมกับข้อมูลของคุณแล้วเร็วเลย
LeftHash เก็บตารางซ้ายไว้ในหน่วยความจำ Stream ตารางขวา ใช้เวลาตารางซ้ายเล็กกว่า RightHash เก็บตารางขวาไว้ในหน่วยความจำ Stream ตารางซ้าย ใช้เวลาตารางขวาเล็กกว่า ผมมักตรวจสอบว่าตารางไหนเล็กกว่าแล้วเลือกให้เหมาะสม
ผมแนะนำให้ใช้ SortMerge เมื่อข้อมูลเรียงลำดับแล้วตามพื้นฐาน Join Key แล้วครับ มันเร็วมากและประหยัดหน่วยความจำ แต่ต้องแน่ใจจริงๆ ว่าข้อมูลเรียงแล้ว ถ้าไม่เรียงผลลัพธ์จะผิดแน่ๆ
LeftIndex ใช้ Key จากตารางซ้ายเพื่อ Query ตารางขวา เหมาะตารางขวาใหญ่ที่รองรับ Query Folding (เช่น SQL database) RightIndex ใช้ Key จากตารางขวาเพื่อ Query ตารางซ้าย เหมาะตารางซ้ายใหญ่ ผมใช้มากเวลาทำงานกับ Database ที่รองรับ Folding
ส่วนตัวผมแนะนำให้เริ่มด้วย Dynamic (ค่าเริ่มต้น) ปล่อยให้ Power Query เลือกเอง แต่ถ้า Performance ไม่ดีหรือคุณรู้ลักษณะข้อมูลได้ดีก็ให้ระบุอัลกอริทึมเฉพาะครับ
เวลาที่เราทำ Join ข้อมูลจากตารางสองตางในตัวกำหนด Power Query ด้านหลังส่วนใหญ่คนไม่เห็นอัลกอริทึมที่ใช้คำนวณ แต่ผมบอกให้ฟังนะ อัลกอริทึมที่ถูกเลือกมันส่งผลกับความเร็วและการใช้หน่วยความจำเยอะเลยครับ
ที่เจ๋งคือ JoinAlgorithm.Type มันให้คุณเลือกใช้อัลกอริทึมที่เหมาะสมเอง ไม่ว่าจะเป็น Dynamic (ปล่อยให้ Power Query เลือก) LeftHash RightHash SortMerge หรือ Index-based ต่างๆ แต่ละตัวมีจุดเด่นที่แตกต่างกันครับ
ส่วนตัวผมตรวจสอบชนิดข้อมูลและขนาดตารางก่อนเลือกอัลกอริทึม ถ้าตารางเล็กกว่าก็ใช้ Hash ถ้าตารางใหญ่ก็ลองใช้ Index หรือ SortMerge แล้วดูว่าไหนเร็วกว่า 😎