本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
最佳化您的查詢
使用本節中的建議來最佳化 Athena 中的SQL查詢。
LIMIT 搭配 ORDER BY 子句使用
ORDER BY
子句會以排序順序傳回資料。這需要 Athena 將所有資料列傳送至單一工作節點,然後排序資料列。這種查詢類型可以執行很長一段時間,甚至失敗。
如需提高查詢的效率,請查看頂端或底部 N
值,然後使用 LIMIT
子句。這樣可以將排序和限制推送至個別工作節點,而不是單一工作節點,進而大幅降低排序的成本。
最佳化JOIN子句
當您聯結兩個資料表時,Athena 會將右側的資料表分散至工作節點,然後串流左側的資料表以執行聯結。
因此,請在聯結左側指定較大的資料表,並在聯結的右側指定較小的資料表。如此一來,Athena 會使用較少的記憶體,並以較低的延遲執行查詢。
另外,請注意以下重點:
-
當您使用多個
JOIN
命令時,請按從最大到最小的順序指定資料表。 -
除非查詢需要交叉聯結,否則請予以避免。
Optimize GROUP BY 子句
GROUP BY
運算子會根據 GROUP
BY
資料欄將資料列分散至工作節點。我們會在記憶體中引用這些資料欄,並在擷取資料列時比較這些值。當 GROUP BY
資料欄相符時,這些值彙總在一起。考慮到此程序的運作方式,建議按從最高基數到最低基數的順序排序資料欄。
使用數字而不是字串
由於相較於字串,數字需要的記憶體較少,而且處理速度更快,因此請盡可能使用數字而不是字串。
限制資料欄的數目
若要減少儲存資料所需的記憶體總量,請限制 SELECT
陳述式中指定的資料欄數。
使用規則運算式,而非 LIKE
包含子句 (例如大型字串上的 LIKE '%string%'
) 的查詢可能需要非常大量的運算。當您篩選字串資料欄上的多個值時,請改用 regexp_like()
使用 LIMIT子句
當您執行查詢時,請不要選取所有資料欄,而是使用 LIMIT
子句,以只傳回您需要的資料欄。這樣做可減少透過查詢執行管道處理的資料集大小。當您查詢具有大量字串型資料欄的資料表時,LIMIT
子句會更有幫助。當您對任何查詢執行多個聯結或彙總時,LIMIT
子句也很有用。