本文為您列舉MaxCompute SQL與標準SQL的區別及常見問題解決方案。
MaxCompute SQL與標準SQL的基本區別
主要區別 | 問題現象 | 解決方案 |
應用情境 | 不支援事務(不支援Commit和Rollback,不推薦使用INSERT INTO)。 | 建議代碼具備等冪性,支援重新執行。推薦您使用INSERT OVERWRITE寫資料。 |
不支援索引和主鍵約束。 | 無。 | |
部分欄位不支援預設值或預設函數。 | 如果欄位有預設值,您可以在資料寫入時自行賦值。MaxCompute支援在建立表時,對BIGINT、DOUBLE、BOOLEAN和STRING類型的欄位添加預設值。 | |
不支援自增欄位。 | 無。 | |
表分區 | 單表最多支援6萬個分區。超過6萬個分區會報錯。 | 選擇合適的分區列,減少分區數。 |
一次查詢輸入的分區不能超過1萬個,否則會報錯。如果是2級分區且查詢時只根據2級分區進行過濾,總的分區數大於1萬也可能導致報錯。 | ||
精度 | DOUBLE類型存在精度問題。 | 不建議直接使用等號(=)關聯兩個DOUBLE欄位。建議將兩個數相減,如果差距小於一個預設的值,則認為兩個數是相同的。例如 |
雖然MaxCompute支援高精度類型DECIMAL,但是有更高精度的要求。 | 如果有更高的精度要求,您可以先把資料存放區為STRING類型,然後使用UDF實現對應的計算。 | |
資料類型轉換 | 出現各種預期外的錯誤,代碼維護問題。 | 如果有2個不同的欄位類型需要執行JOIN操作,建議您先轉換欄位類型再執行JOIN操作。 |
日期類型和字串的隱式轉換。 | 如果在需要傳入日期類型的函數中傳入一個字串,字串和日期類型根據 |
DDL與DML的區別及解決方案
主要區別 | 問題現象 | 解決辦法 |
表結構 | 不能修改分區列列名,只能修改分區列對應的值。 | 解決方案請參見分區和分區列的區別是什嗎?。 |
支援增加列,但是不支援刪除列及修改列的資料類型。 | 解決方案請參見如何修改列的資料類型?和如何刪除列?。 | |
INSERT | MaxCompute SQL需要在INSERT INTO或INSERT OVERWRITE後加關鍵字TABLE。 | 無。 |
資料插入表的欄位對應不是根據SELECT的別名執行,而是根據SELECT欄位的順序和表中欄位的順序執行映射。 | 無。 | |
UPDATE和DELETE | 僅支援對Transactional表執行UPDATE和DELETE語句。 | |
SELECT | MaxCompute SQL最多支援6張小表的MAPJOIN,並且連續JOIN的表不能超過16張。 | |
IN和NOT IN | IN、NOT IN、EXISTS和NOT EXISTS,後面的子查詢返回的分區資料量不能超過1000條。 | 解決方案請參見在執行MaxCompute SQL過程中,使用NOT IN後面接子查詢,子查詢返回的結果是上萬層級的資料量,但當IN和NOT IN後面的子查詢返回的是分區時,返回的數量上限為1000。在必須使用NOT IN的情況下,該如何?此查詢?。如果業務上已經保證子查詢返回結果的唯一性,可以考慮去掉DISTINCT,從而提升查詢效能。 |
SQL返回10000條 | MaxCompute限制了單獨執行SELECT語句時返回的資料條數。 | 解決方案請參見LIMIT限制輸出行數(number)。 |
需要查詢的結果資料條數很多。 | ||
MAPJOIN | JOIN不支援笛卡爾積。 | JOIN必須要用ON關鍵字設定關聯條件。 如果有一些小表要作為廣播表,需要使用MAPJOIN HINT。 |
ORDER BY | ORDER BY需要配合LIMIT N使用。 | 如果希望執行巨量資料量的排序任務,甚至是全表排序任務,可以增大N值。解決方案請參見MaxCompute查詢得到的資料是根據什麼排序的?。 |
UNION ALL | 參與UNION ALL運算的所有表必須列數一致,否則會報錯。 | 參與UNION ALL運算的所有列的資料類型、列個數和列名稱必須完全一致。 |
UNION ALL需要再嵌套一層子查詢。 | 無。 |