本トピックでは、AnalyticDB for MySQL の書き込みとクエリに関するよくある質問に回答します。
質問に製品エディションが指定されていない場合、その回答は AnalyticDB for MySQL Data Warehouse Edition および Enterprise Edition にのみ適用されます。
FAQ 概要
-
データクエリ時に「Query exceeded maximum time limit of 1800000.00ms」エラーが発生した場合はどうすればよいですか。
-
データクエリ時に「Out of Memory Pool size pre cal. available 0 require 3」エラーが発生した場合はどうすればよいですか。
-
データクエリ時に「STORAGE_INDEX_ERROR, msg:Index does not exist」エラーが発生した場合はどうすればよいですか。
-
複数ステートメント機能を使用して複数の SQL ステートメントを実行する際に「multi-statement found」エラーが発生した場合はどうすればよいですか。
-
SELECT * FROM ... GROUP BY ...クエリを実行すると「Column 'XXX' not in GROUP BY clause」エラーが表示されるのはなぜですか。 -
INSERT OVERWRITE SELECT ステートメントの実行後、元のテーブルのデータが上書きされないのはなぜですか。
-
Logstash プラグインを使用して INSERT ON DUPLICATE KEY UPDATE ステートメントでデータを一括挿入できますか。
Enterprise Edition、Basic Edition、Data Lakehouse Edition のクラスターは、JDBC 経由での Hudi テーブルからのデータクエリをサポートしていますか。
はい。Hudi テーブルは、エンタープライズ版、ベーシック版、またはデータレイクハウス版のクラスターで作成した後、JDBC を使用して直接クエリできます。
Enterprise Edition、Basic Edition、Data Lakehouse Edition のクラスターは、OSS から Hudi テーブルのデータを読み取ることをサポートしていますか。
はい。外部テーブルを使用して OSS の Hudi テーブルからデータを読み取る方法の詳細については、「外部テーブルを使用した Data Lakehouse Edition クラスターへのデータインポート」をご参照ください。
Enterprise Edition、Basic Edition、Data Lakehouse Edition:XIHE MPP ジョブと XIHE BSP ジョブの自動切り替えはサポートされていますか。
いいえ。ジョブを送信する際に、インタラクティブリソースグループまたはジョブリソースグループのどちらに送信するかを手動で指定する必要があります。これにより、ジョブが XIHE MPP ジョブとして実行されるか、XIHE BSP ジョブとして実行されるかが決まります。
Enterprise Edition、Basic Edition、Data Lakehouse Edition のクラスターでジョブを実行するために、XIHE MPP と XIHE BSP をどのように選択しますか。
デフォルトでは、XIHE BSP ジョブは非同期で送信されます。同期送信と非同期送信の違いは、クライアントがクエリの完了を待つ必要があるかどうかです。
非同期送信には、次の制限があります。
-
結果セットには最大 10,000 行まで含めることができます。
-
CSV ファイルのダウンロードリンクを含め、最大 1,000 件の結果セットを最大 30 日間保持できます。
INSERT INTO SELECT、INSERT OVERWRITE SELECT、CREATE TABLE AS SELECT など、実行時間が長く計算負荷が高いものの、結果セットが小さいクエリには、非同期送信を使用することを推奨します。
Enterprise Edition、Basic Edition、Data Lakehouse Edition のクラスターで XIHE BSP ジョブのステータスを表示する方法
-
Data Lakehouse Edition クラスターのジョブエディターを使用して XIHE BSP ジョブを送信した場合、ジョブエディター > Sql開発 ページに移動し、ページ下部の 実行レコード タブでジョブのステータスを表示します。
-
ジョブエディターから XIHE BSP ジョブを送信しなかった場合は、内部システムテーブルからそのステータスをクエリできます。次のステートメントを実行します。
SELECT status FROM information_schema.kepler_meta_elastic_job_list WHERE process_id='<job_id>';ステータス別にすべての XIHE BSP ジョブの数を取得するには、次のステートメントを実行します。
SELECT status,count(*) FROM information_schema.kepler_meta_elastic_job_list GROUP BY status;
SQL ジョブのリソース分離
Data Warehouse Edition (Elastic Mode) クラスターと Enterprise Edition、Basic Edition、Data Lakehouse Edition のクラスターはリソースグループをサポートしています。リソースグループのタイプの詳細については、「リソースグループの概要 (Data Warehouse Edition)」および「リソースグループの概要 (Data Lakehouse Edition)」をご参照ください。さまざまなタイプのリソースグループを作成し、SQL ジョブを適切なグループに送信してリソースを分離できます。
IN 句の項目が多すぎる場合の対処法
AnalyticDB for MySQL では、IN リストの項目数に制限があります。デフォルトでは、上限は 2,000 ですが、この値は調整できます。
IN リストの項目数は 5,000 を超えることはできません。項目数が多くなると、パフォーマンスが低下する可能性があります。
たとえば、制限を 3,000 に設定するには、次のステートメントを実行します。
SET ADB_CONFIG max_in_items_count=3000;
「Query exceeded maximum time limit」 エラーの解決策
このエラーは、SQL クエリが AnalyticDB for MySQL で設定されているデフォルトの実行タイムアウト 1,800,000 ms (30 分) を超えたために発生します。単一のクエリまたはクラスター内のすべてのクエリに対して、クエリタイムアウトを設定できます。
-
単一のクエリのタイムアウトを設定します。
/*+ QUERY_TIMEOUT=xxx */SELECT count(*) FROM t; -
クラスター内のすべてのクエリのタイムアウトを設定します。
SET ADB_CONFIG QUERY_TIMEOUT=xxx;詳細については、「一般的な設定パラメーター」をご参照ください。
メモリ不足エラーの解決策
原因:AnalyticDB for MySQL クラスターで、大規模かつ実行時間の長い SQL クエリが実行されている可能性があります。これらのクエリは大量のメモリを消費するため、新しい SQL クエリを送信するとメモリ不足エラーが発生します。
解決策:数分待ってから、SQL ステートメントを再度実行してください。
「STORAGE_INDEX_ERROR」 エラーの解決策
原因:このエラーは、一部の古い AnalyticDB for MySQL カーネルバージョンに存在する既知の不具合が原因です。特定の条件下では、この不具合によりテーブルのインデックスメタデータに不整合が生じる可能性があります。その結果、クエリ中にインデックスが見つからず、STORAGE_INDEX_ERROR 例外が発生します。
解決策:クラスターのカーネルバージョンをアップグレードしてください。この問題は、新しいカーネルバージョンで修正されています。
-
アップグレード期間:カーネルバージョンのアップグレードには通常約 30 分かかります。
-
サービス中断:アップグレード中に、数秒間の一時的な接続中断が発生します。
-
推奨事項:アップグレードは、計画されたメンテナンスウィンドウまたはオフピーク時間中に実行することを推奨します。一時的な接続中断をスムーズに処理できるよう、アプリケーションに自動再接続メカニズムがあることを確認してください。
「multi-statement found」 エラーの解決策
複数ステートメント機能は、カーネルバージョンが 3.1.9.3 以降のクラスターでのみサポートされています。まず、クラスターのカーネルバージョンが 3.1.9.3 以降であることを確認してください。カーネルバージョンが 3.1.9.3 より古い場合は、テクニカルサポートに連絡してアップグレードしてください。カーネルバージョンが 3.1.9.3 以降でもエラーが解決しない場合は、クライアントで複数ステートメント機能が無効になっている可能性があります。
たとえば、MySQL JDBC クライアントを使用してクラスターに接続する場合、SET ADB_CONFIG ALLOW_MULTI_QUERIES=true; コマンドを実行して複数ステートメント機能を手動で有効にするだけでなく、allowMultiQueries JDBC 接続プロパティを true に設定する必要もあります。
クエリ結果で時刻値が切り捨てられる問題のトラブルシューティング
まず、MySQL クライアントを使用して結果を確認してください。MySQL クライアントで時刻値が正しく表示される場合は、結果セットを処理している別のクライアントツールが原因である可能性があります。
AES_ENCRYPT 関数のエラー修正
次のステートメントでは、エラーが報告されます。
SELECT CONVERT(AES_DECRYPT(AES_ENCRYPT('ABC123','key_string'),'key_string'),char(10));
原因:このエラーは、AES_ENCRYPT(varbinary x, varchar y) 関数の最初の引数 x のデータ型が varbinary である必要があるためです。次の例は、有効なステートメントを示しています。
SELECT CONVERT(AES_DECRYPT(AES_ENCRYPT(CAST('ABC123' AS VARBINARY), 'key_string'), 'key_string'),char(10));
クエリ結果の予期せぬ変更
データが更新されていないことを確認した場合、次の理由でクエリ結果が予期せず変更されることがあります。
-
ORDER BY句なしでLIMIT句が使用されています。AnalyticDB for MySQL は、複数のノードで複数のスレッドにわたってクエリを実行する分散データベースです。一部のスレッドがLIMIT句を満たすのに十分な行を返すと、クエリは終了します。したがって、ORDER BY句がない場合、システムは固定されたスレッドの応答順序を保証できないため、結果の順序は保証されません。 -
グループ化集計クエリでは、
SELECTリスト内のフィールドが集計関数に含まれておらず、GROUP BY句にも含まれていない場合、そのフィールドにはグループからランダムな値が返されます。
問題が解決しない場合は、テクニカルサポートにお問い合わせください。
単一テーブルでの ORDER BY クエリが遅い問題
原因:データがストレージ層でソートされずに分散して格納されているためです。これにより、大量の不要なデータ読み取りが引き起こされ、クエリ時間が増加する可能性があります。
解決策:ORDER BY 句で指定されたフィールドにクラスター化インデックスを作成してください。クラスター化インデックスを使用すると、データはストレージ層で部分的にソートされます。ORDER BY クエリは読み取るデータが少なくなるため、パフォーマンスが向上します。クラスター化インデックスの作成方法の詳細については、「クラスター化インデックスの追加」をご参照ください。
-
各テーブルは、クラスター化インデックスを 1 つだけサポートします。別のフィールドにクラスター化インデックスが既に存在する場合、
ORDER BY句で指定されたフィールドに新しいインデックスを作成する前に、既存のインデックスを削除する必要があります。 -
大きなテーブルにクラスター化インデックスを追加すると、BUILD ジョブに必要な時間が増加し、その結果、ストレージノードの CPU 使用率に影響します。
スキャンされた行数の不一致
この問題は、通常、レプリケーションテーブルが原因で発生します。 AnalyticDB for MySQL では、レプリケーションテーブルのコピーが各シャードに格納されます。レプリケーションテーブルをクエリすると、スキャンされた行数がコピーごとに繰り返しカウントされます。
INSERT OVERWRITE でのデータ重複
主キーがない AnalyticDB for MySQL のテーブルでは、自動重複排除はサポートされていません。
「Column not in GROUP BY clause」 エラーの解決策
グループ化クエリでは、クエリステートメント SELECT * FROM table GROUP BY key を使用してすべてのフィールドを取得することはできません。すべてのフィールドを明示的にリストする必要があります。以下に SQL の例を示します。
SELECT nation.name FROM nation GROUP BY nation.nationkey
INSERT OVERWRITE SELECT が元のテーブルのデータを上書きしない理由
原因:INSERT OVERWRITE ステートメントは、パーティションごとにデータを上書きします。新しいパーティションは、同じパーティション値を共有する古いパーティションを置き換えます。SELECT の結果が空の場合、新しいパーティションは作成されないため、元のテーブルの既存のデータは上書きされません。
解決策:元のテーブルのデータを上書きする前に、SELECT の結果が空にならないように INSERT OVERWRITE SELECT ステートメントを変更してください。
JSON 結果における IN 演算子の値の制限
カーネルバージョンが 3.1.4 以前の AnalyticDB for MySQL クラスターの場合、IN 演算子で指定される値の数は 16 を超えることはできません。カーネルバージョンが 3.1.4 より後のクラスターの場合、制限はありません。クラスターのカーネルバージョンの確認方法については、「クラスターのカーネルバージョンを表示する」をご参照ください。
OSS の GZIP 圧縮 CSV ファイルのデータソースとしての使用
AnalyticDB for MySQL では、OSS の GZIP 圧縮 CSV ファイルを外部テーブルのデータソースとして使用できます。そのためには、外部テーブル定義に compress_type=gzip を追加する必要があります。OSS 外部テーブルの構文の詳細については、「非パーティション化 OSS 外部テーブル」をご参照ください。
INSERT ON DUPLICATE KEY はサポートされていますか。
AnalyticDB for MySQL は、算術式ではなく、値の等価更新のみをサポートします。
UPDATE ステートメントでの JOIN 句の使用
この機能は、カーネルバージョン 3.1.6.4 以降の AnalyticDB for MySQL クラスターでのみ利用できます。 詳細については、「UPDATE」をご参照ください。
SQL ステートメントで変数を設定できますか。
AnalyticDB for MySQL は、SQL 文での変数の設定をサポートしていません。
Logstash プラグインを使用して INSERT ON DUPLICATE KEY UPDATE ステートメントでデータを一括挿入できますか。
はい。 INSERT ON DUPLICATE KEY UPDATE ステートメントを使用してデータをバッチで挿入する場合、各 ON DUPLICATE KEY UPDATE の後に VALUES() ステートメントを追加する必要はありません。 最後の VALUES() ステートメントの後に追加するだけで済みます。
たとえば、student_course テーブルに 3 件のレコードを一括挿入するには、次のステートメントを実行します。
INSERT INTO student_course(`id`, `user_id`, `nc_id`, `nc_user_id`, `nc_commodity_id`, `course_no`, `course_name`, `business_id`)
VALUES(277943, 11056941, '1001EE1000000043G2T5', '1001EE1000000043G2TO', '1001A5100000003YABO2', 'kckm303', 'Industrial Accounting Practice V9.0--77', 'kuaiji'),
(277944, 11056943, '1001EE1000000043G2T5', '1001EE1000000043G2TO', '1001A5100000003YABO2', 'kckm303', 'Industrial Accounting Practice V9.0--88', 'kuaiji'),
(277945, 11056944, '1001EE1000000043G2T5', '1001EE1000000043G2TO', '1001A5100000003YABO2', 'kckm303', 'Industrial Accounting Practice V9.0--99', 'kuaiji')
ON DUPLICATE KEY UPDATE
course_name = VALUES(course_name),
business_id = VALUES(business_id);
組み込みデータセットのロードの前提条件
クラスターには少なくとも 24 ACU の予約済みストレージリソースが必要であり、user_default リソースグループには少なくとも 16 ACU の予約済みコンピューティングリソースが必要です。
組み込みデータセットのロードの検証
ジョブを開発する > Sql開発 ページでロードの進行状況を表示できます。組み込みデータセットの読み込み ボタンの
アイコンがグレー表示になり、ライブラリテーブル タブに ADB_SampleData_TPCH データベースとそのテーブルが表示されていれば、データセットは正常にロードされています。
組み込みデータセットのロード時に発生した障害への対応
まず、DROP TABLE table_name; SQL 文を実行して、データベース内のすべてのテーブルを削除します。次に、DROP DATABASE ADB_SampleData_TPCH; SQL 文を実行して、組み込みデータセットのデータベースを削除します。ADB_SampleData_TPCH データベースが削除されたら、データセットを再読み込みします。
標準アカウントでの組み込みデータセットの使用
組み込みデータセット機能は、AnalyticDB for MySQL の権限管理ルールに従います。組み込みデータセットがクラスターにロードされても、標準データベースアカウントは、ADB_SampleData_TPCH データベースに対する権限がない限り、データセットを使用できません。特権アカウントは、次のステートメントを実行して、標準アカウントに必要な権限を付与する必要があります。
GRANT select ON ADB_SampleData_TPCH.* TO <user_name>;
組み込みデータセットのテスト
データセットのロードが成功すると、AnalyticDB for MySQL は、対応するクエリスクリプトを提供します。Sql開発 ページで スクリプト タブを開き、サンプルクエリステートメントを実行します。クエリの詳細については、「TPC-H テストクエリ」をご参照ください。
データセットの整合性を確保するために、ADB_SampleData_TPCH データベースに対しては読み取り操作のみを実行することを推奨します。DDL または DML の変更によりデータセットのロードステータスが異常になった場合は、ADB_SampleData_TPCH データベースを削除し、データセットを再度ロードしてください。