ここでは、リレーショナルデータベースに慣れているユーザーが MaxCompute SQL を使用する際に、頻繁に発生する問題について説明します。 特定の MaxCompute SQL 構文については、 「SQL 概要」をご参照ください。

MaxCompute SQL の基本的な相違点

シナリオ
  • トランザクションはサポートされていません。 (コミットとロールバックアクションはサポートされていません。 べき等性を持ち、再実行がサポートされるコードを使用することを推奨します。 データの書き込みには、Insert Into ではなく Insert Overwrite を使用することを推奨します。)
  • インデックス、主キー、外部キーの制約はサポートされていません。
  • 自動インクリメントフィールドとデフォルト値はサポートされていません。 デフォルト値が存在する場合は、データを書き込むときに値が割り当てられます。
テーブルパーティション
  • テーブルでは 60,000 のパーティションがサポートされています。
  • それ以外の場合は、エラーが返されます。 パーティションがリストパーティションで、クエリがリストパーティションにのみ基づいてフィルタリングされている場合は、パーティションの総数が 10,000 を超えるとエラーが返されます。
精度
  • Double 型には精度があります。 したがって、等号 (=) を使用して 2 つの Double フィールドを直接結合することは推奨しません。 1 つの数を他の数から引き、それらの差がプリセット値より小さい場合は、2 つの数が同じとみなすことを推奨します。たとえば、abs(a1- a2)< 0.000000001
  • 現在、MaxCompute SQL では、高精度型 Decimal がサポートされています。 より高い精度が必要な場合は、データを文字列型として格納し、UDF を使用してこのような計算を実行します。
データ型変換
  • 2 つの異なる型のフィールドを結合する必要がある場合は、予期しないエラーを防ぐために、結合する前にまず型を変換することを推奨します。 これはコードのメンテナンスにも役立ちます。
  • 日付と文字列を暗黙的に変換するためには、日付を入力する必要がある関数に、文字列を入力することで、yyyy-mm-dd hh:mm:ss の形式に従って,文字列と日付を変換することができます。 他のフォーマットについては、「日付関数 > TO_DATE」をご参照ください。

DDL の違いとソリューション

テーブル構造

  • パーティション列名は変更できません。 パーティション列に対応する値のみ変更できます。
  • 列を追加することはできますが、列を削除することと列のデータ型を変更することはできません。 このように列を追加することができます。ALTER TABLE table_name ADD COLUMNS (col_name1 type1, col_name2 type2…)

    列を削除する、または列のデータ型を変更する必要がある場合は、これが最も安全な方法です。
    1. 新しいテーブルを作成します。 例: CREATE TABLE new_table_name as SELECT c1,c2,c3 FROM table_name;
    2. 元のテーブルを削除し、新しいテーブルを元のテーブルの名前に変更します。 例: ALTER TABLE new_table_name as RENAME TO table_name; 次に、新しいテーブルに手動でデータを挿入する必要があります。

DML の違いとソリューション

INSERT
  • 最も直観的な構文の違いは insert into/overwrite の後にキーワード Table が続くことです。
  • テーブルに挿入されたデータのフィールドマッピングは Select のエイリアスではなく、Select のフィールドまたはテーブル内のフィールドの順序に基づいています。
UPDATE/DELETE
  • 現在、Update/Delete 文はサポートされていません。
  • Update を実行する場合は、元のパーティション/テーブルデータを新しいパーティション/テーブルにインポートする必要があり、インポートプロセス中に対応する更新ロジックを実行する必要があります。
  • Delete を実行する場合は、テーブルを削除することでデータを削除できます。 非パーティションテーブルの場合は、TRUNCATE TABLE table_name; 文によってテーブルのデータを空にできます。 パーティションテーブルの場合は、ALTER TABLE table_name DROP IF EXISTS PARTITION (partition name='specific partition value' ) によってパーティションを削除できます。 データを更新または削除するために insert overwrite 文を使用することもできます。
SELECT
  • Group by クエリの Select フィールドは Group By のグループフィールドまたは使用される AGGREGATE 関数のどちらかです。 論理的視点から、 非グループ列と Group By キー に複数のデータレコードがある場合、AGGREGATE 関数なしでデータを表示することはできません。
Subquery

サブクエリにはエイリアスが必要です。すべてのクエリにエイリアスを付けることを推奨します。

IN/NOT IN
  • In/Not In および Exist/Not Exist に続くサブクエリのデータ量は 1000 を超えることはできません。 この問題を解決するために、 サブクエリによって返された結果の一意性がビジネス面で保障される場合は、クエリパフォーマンスを向上させるために Distinct を削除することを検討できます。
MaxCompute SQL によって返される 10,000 件の結果
  • MaxCompute では、別々に実行された Select 句によって返されたデータレコードの数が制限されます。 特定の設定については、「その他の操作」をご参照ください。 最大データ数は 10,000 に設定されています。
MAPJOIN
  • Join 句では、デカルト積はサポートされていません。 Join 句では、結合条件を設定するために on 句を使用する必要があります。小さなテーブルに対してブロードキャストテーブルを作成する場合は、MapJoin ヒントを使用する必要があります。
ORDER BY
  • Order By の後に Limit n を続ける必要があります。多数のデータレコードを並べ替える場合、またはテーブル全体を並べ替える場合でも、N に大きな数を設定できます。 ただし、この方法は慎重に使用してください。 このシステムには分散システムの利点がないため、パフォーマンスが影響を受ける可能性があります。
UNION ALL
  • UNION ALL 計算に関わるすべての列のデータ型、数量、および名前は一致している必要があります。 それ以外の場合は、例外が返されます。
  • UNION ALL クエリはサブクエリによってネストされている必要があります。