このトピックでは、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つの値は同じと見なされます。 例えば、 |
MaxComputeは、高精度データ型DECIMALをサポートしています。 しかしながら、より高い精度が必要とされ得る。 | ビジネスでより高い精度が必要な場合は、データをSTRINGタイプとして保存し、ユーザー定義関数 (UDF) を使用して計算を実行できます。 | |
データ型の変換 | さまざまな予期しないエラーやコードメンテナンスの問題がデータ型変換中に発生します。 | 異なるデータ型の2つのフィールドに対してJOIN操作を実行する場合は、JOIN操作を実行する前にフィールドデータ型を変換することをお勧めします。 |
暗黙的な変換は、DATEデータ型とSTRINGデータ型の間で実行されます。 | STRINGデータ型のフィールドをDATEデータ型のフィールドを必要とする関数に渡す場合、STRINGデータ型とDATEデータ型の間の変換は、 |
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クエリはサブクエリ内にネストする必要があります。 | 非該当 |