すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:MaxCompute SQLと標準SQLおよび関連ソリューションの基本的な違い

最終更新日:Jan 17, 2025

このトピックでは、MaxCompute SQLと標準SQLの基本的な違いおよび関連ソリューションについて説明します。

MaxCompute SQLと標準SQLの基本的な違い

項目

問題

解決策

シナリオ

MaxCompute SQLは、COMMITやROLLBACKなどのトランザクションステートメントをサポートしていません。 MaxCompute SQLでINSERT INTOを使用しないことを推奨します。

コードはべき等で記述され、再実行をサポートすることを推奨します。 INSERT OVERWRITEを使用してデータを書き込むことを推奨します。

MaxCompute SQLは、インデックスとプライマリキーの制約をサポートしていません。

非該当

特定のフィールドは、デフォルト値またはデフォルト関数をサポートしません。

フィールドにデフォルト値がある場合は、データの書き込み中にフィールドに値を割り当てることができます。 MaxComputeでは、テーブルを作成するときに、BIGINT、DOUBLE、BOOLEAN、およびSTRING型のフィールドにデフォルト値を追加できます。

MaxCompute SQLは、自動インクリメントフィールドをサポートしていません。

非該当

テーブルパーティション

テーブルには最大60,000個のパーティションを含めることができます。 パーティションの数が60,000を超えると、エラーが報告されます。

適切なパーティションキー列を選択して、パーティションの数を減らします。

一度に10,000を超えるパーティションのデータをクエリすることはできません。 それ以外の場合は、エラーが返されます。 パーティション分割されたテーブルに2つのレベルのパーティションが含まれており、クエリ内のレベル2のパーティションのみに基づいてデータがフィルタリングされている場合、パーティションの総数が10,000を超えるとエラーが報告されることがあります。

この問題の解決策の詳細については、INSERT INTOまたはINSERT OVERWRITEステートメントを実行したときに「1つのインスタンスが10000を超えるパーティションにデータを出力できません」というエラーメッセージが表示された場合はどうすればよいですか。

精度

DOUBLEデータ型の精度は高くありません。

DOUBLE型の2つのフィールドを関連付けるために、等号 (=) を使用しないことを推奨します。 2つのフィールドの値を差し引くことを推奨します。 値の差がプリセット値よりも小さい場合、2つの値は同じと見なされます。 例えば、ABS(a1-a2) の結果が0.000000001未満である場合、a1とa2は同じと見なされる。

MaxComputeは、高精度データ型DECIMALをサポートしています。 しかしながら、より高い精度が必要とされ得る。

ビジネスでより高い精度が必要な場合は、データをSTRINGタイプとして保存し、ユーザー定義関数 (UDF) を使用して計算を実行できます。

データ型の変換

さまざまな予期しないエラーやコードメンテナンスの問題がデータ型変換中に発生します。

異なるデータ型の2つのフィールドに対してJOIN操作を実行する場合は、JOIN操作を実行する前にフィールドデータ型を変換することをお勧めします。

暗黙的な変換は、DATEデータ型とSTRINGデータ型の間で実行されます。

STRINGデータ型のフィールドをDATEデータ型のフィールドを必要とする関数に渡す場合、STRINGデータ型とDATEデータ型の間の変換は、yyyy-mm-dd hh:mi:ss形式に基づいて実行されます。

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

項目

問題

解決策

テーブルのスキーマ

パーティションキー列の値は変更できますが、パーティションキー列の名前は変更できません。

この問題の解決策の詳細については、パーティションとパーティションキー列の違いは何ですか?

列は追加できますが、削除することはできません。 列のデータ型は変更できません。

この問題の解決策の詳細については、列のデータ型を変更するにはどうすればよいですか?テーブルから列を削除するにはどうすればよいですか?

INSERT

MaxCompute SQLの場合、INSERT INTOまたはINSERT OVERWRITEステートメントの後にキーワードTABLEを追加する必要があります。

非該当

データがテーブルに挿入されると、フィールドマッピングは、SELECTステートメントのエイリアスではなく、SELECTステートメントのフィールドシーケンスとテーブルのフィールドシーケンスに基づいて実行されます。

非該当

UPDATEとDELETE

UPDATEおよびDELETEステートメントは、トランザクションテーブルでのみ実行できます。

この問題の解決策の詳細については、MaxComputeテーブルまたはパーティションからデータを削除するにはどうすればよいですか?MaxComputeテーブルまたはパーティションのデータを更新するにはどうすればよいですか?

SELECT

MaxCompute SQL文は、最大6つの小さなテーブルに対してMAPJOINを実行でき、最大16のテーブルを連続して結合できます。

この問題の解決策の詳細については、join操作を実行したときに「最大16の結合入力が許可されています」というエラーメッセージが表示された場合はどうすればよいですか?

INとNOT IN

IN、NOT IN、EXISTS、またはNOT EXISTSに続くサブクエリによって返されるパーティションの数は、1,000を超えることはできません。

この問題の解決策の詳細については、「NOT INを使用してMaxCompute SQLステートメントを実行し、その後にサブクエリを実行すると、サブクエリは数万のデータレコードを返すことになります。 ただし、INまたはNOT INに続くサブクエリがパーティションデータを返す場合、返されるデータレコードの最大数は1,000です。 サブクエリが予想数のデータレコードを返し、NOT INのロジックが実装されるようにするにはどうすればよいですか? ビジネスがサブクエリ結果の一意性を保証できる場合は、DISTINCTを削除してクエリのパフォーマンスを向上させることができます。

MaxCompute SQL によって返される 10,000 件の結果

MaxComputeは、単一のSELECTステートメントで返すことができるデータレコードの最大数を制限します。

この問題の解決策の詳細については、「LIMIT」をご参照ください。

多数のデータレコードをクエリする必要があります。

この問題の解決策の詳細については、SQLTaskを使用してSQL文を実行するときに、クエリ結果の数が10,000を超えた場合にすべてのデータを取得するにはどうすればよいですか。

MAPJOIN

JOIN句はデカルト積をサポートしていません。

join句で結合条件を設定するには、ONキーワードを使用する必要があります。

小さなテーブルをブロードキャストテーブルとして使用する場合は、MAPJOIN HINTを使用する必要があります。

ORDER BY

ORDER BYはLIMIT Nと一緒に使用する必要があります。

大量のデータを並べ替えたり、テーブル内のすべてのデータを並べ替えたりする場合は、Nの値を増やすことができます。この問題の解決策の詳細については、MaxComputeでデータをクエリした後、クエリ結果はどのようにソートされますか。

UNION ALL

UNION allに含まれるすべてのテーブルの列数は一貫している必要があります。 それ以外の場合は、エラーが返されます。

UNION allに含まれるすべての列の列数と名前とデータ型は一致している必要があります。

UNION ALLクエリはサブクエリ内にネストする必要があります。

非該当