聯結提示 - AWS Clean Rooms

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

聯結提示

聯結提示會建議查詢執行的聯結策略。語法、引數和一些範例來自 Apache Spark SQL 參考,以取得詳細資訊

BROADCAST

建議使用 AWS Clean Rooms 廣播聯結。無論 autoBroadcastJoinThreshold 為何,都會廣播具有提示的聯結端。如果聯結的兩端都有廣播提示,則具有較小大小 (根據統計資料) 的那一側將廣播。

別名:BROADCASTJOIN、MAPJOIN

參數:資料表識別符 (選用)

範例

-- Broadcast a specific table SELECT /*+ BROADCAST(students) */ e.name, s.course FROM employees e JOIN students s ON e.id = s.id; -- Broadcast multiple tables SELECT /*+ BROADCASTJOIN(s, d) */ * FROM employees e JOIN students s ON e.id = s.id JOIN departments d ON e.dept_id = d.id;

MERGE

建議使用 AWS Clean Rooms 隨機排序合併聯結。

別名:SHUFFLE_MERGE、MERGEJOIN

參數:資料表識別符 (選用)

範例

-- Use merge join for a specific table SELECT /*+ MERGE(employees) */ * FROM employees e JOIN students s ON e.id = s.id; -- Use merge join for multiple tables SELECT /*+ MERGEJOIN(e, s, d) */ * FROM employees e JOIN students s ON e.id = s.id JOIN departments d ON e.dept_id = d.id;

SHUFFLE_HASH

建議使用 AWS Clean Rooms 隨機雜湊聯結。如果兩端都有隨機雜湊提示,則查詢最佳化工具會選擇較小的端 (根據統計資料) 做為建置端。

參數:資料表識別符 (選用)

範例

-- Use shuffle hash join SELECT /*+ SHUFFLE_HASH(students) */ * FROM employees e JOIN students s ON e.id = s.id;

SHUFFLE_REPLICATE_NL

建議使用 AWS Clean Rooms shuffle-and-replicate巢狀迴圈聯結。

參數:資料表識別符 (選用)

範例

-- Use shuffle-replicate nested loop join SELECT /*+ SHUFFLE_REPLICATE_NL(students) */ * FROM employees e JOIN students s ON e.id = s.id;

Spark SQL 中的提示疑難排解

下表顯示未在 SparkSQL 中套用提示的常見案例。如需其他資訊,請參閱 考量和限制

使用案例 查詢範例
找不到資料表參考
SELECT /*+ BROADCAST(fake_table) */ * FROM employees e INNER JOIN students s ON e.eid = s.sid;
資料表未參與聯結操作
SELECT /*+ BROADCAST(s) */ * FROM students s WHERE s.age > 25;
巢狀子查詢中的資料表參考
SELECT /*+ BROADCAST(s) */ * FROM employees e INNER JOIN (SELECT * FROM students s WHERE s.age > 20) sub ON e.eid = sub.sid;
資料欄名稱而非資料表參考
SELECT /*+ BROADCAST(e.eid) */ * FROM employees e INNER JOIN students s ON e.eid = s.sid;
沒有必要參數的提示
SELECT /*+ BROADCAST */ * FROM employees e INNER JOIN students s ON e.eid = s.sid;
基礎資料表名稱而非資料表別名
SELECT /*+ BROADCAST(employees) */ * FROM employees e INNER JOIN students s ON e.eid = s.sid;