このトピックでは、AnalyticDB for MySQLの書き込みとクエリに関するよくある質問に対する回答を提供します。
質問でエディションが指定されていない場合、質問はAnalyticDB for MySQL Data Warehouse editionクラスターにのみ適用されます。
FAQの概要
Java Database Connectivity (JDBC) を使用して、data Lakehouse Editionクラスター内のHudiテーブルのデータを照会できますか?
Data Lakehouse Editionクラスターを使用して、Object Storage Service (OSS) に保存されているHudiテーブルのデータを読み取ることはできますか?
Data Lakehouse Editionクラスターは、XIHE超並列処理 (MPP) ジョブとXIHEバルク同期並列 (BSP) ジョブを自動的に切り替えることができますか。
Data Lakehouse Editionクラスターでジョブを実行するには、XIHE MPPとXIHE BSPを選択する方法を教えてください。
Data Lakehouse EditionクラスターのXIHE BSPジョブのステータスを確認するにはどうすればよいですか?
マルチステートメント機能を使用して複数のSQLステートメントを連続して実行するときに、"multi-statement be found" エラーが返された場合はどうすればよいですか?
主キーを持たないAnalyticDB for MySQLテーブルでINSERT OVERWRITEステートメントを使用すると、データが複製されるのはなぜですか。
SELECT * FROM TABLE GROUP BY KEYステートメントが実行されたときに、「GROUP BY句にない列 'XXX' 」エラーが発生するのはなぜですか。
使用できますか。AnalyticDB for MySQLの外部テーブルデータソースとしてOSSからのcsv.gzファイル?
INSERT ON DUPLICATE KEY UPDATEステートメントはAnalyticDB for MySQLでサポートされていますか?
INSERT ON DUPLICATE KEY UPDATEステートメントを実行して、Logstashプラグインを使用してデータをバッチ挿入できますか?
組み込みデータセットがAnalyticDB for MySQLクラスターにロードされているかどうかを確認するにはどうすればよいですか?
組み込みデータセットをロードした後、AnalyticDB for MySQLクラスターをテストするにはどうすればよいですか?
JDBCを使用して、Hudiテーブルのデータを Data Lakehouse Editionクラスター?
はい。JDBCを使用してHudiテーブルのデータを照会できます。 でHudiテーブルを作成した後、
Data Lakehouse Editionクラスターでは、JDBCを使用してHudiテーブルのデータを照会できます。を使用できますか OSSに保存されているHudiテーブルのデータを読み取るData Lakehouse Editionクラスター?
はい。外部テーブルを使用して、OSSに保存されているHudiテーブルのデータを読み取ることができます。 詳細については、「外部テーブルを使用してdata Lakehouse Editionにデータをインポートする」をご参照ください。
缶a Data Lakehouse Editionクラスターは、XIHE MPPジョブとXIHE BSPジョブを自動的に切り替えますか。
ジョブを送信するときは、対話型リソースグループまたはジョブリソースグループを指定して、ジョブがXIHE MPPジョブかXIHE BSPジョブかを判断する必要があります。
XIHE MPPとXIHE BSPのどちらかを選択して、 Data Lakehouse Editionクラスター?
デフォルトでは、XIHE BSPは非同期でジョブを送信します。 同期送信と非同期送信の唯一の違いは、クライアントがクエリの実行が完了するのを待つ必要があるかどうかです。
非同期送信には次の制限が課されます。
結果セットには、最大10,000行のデータを含めることができます。
システムは、CSVファイルのダウンロードURLを含む最大1,000の結果セットを最大30日間保持できます。
大量の計算能力を消費し、完了までに長時間を要するが、少数の結果セットを返すクエリに対しては、BSPジョブを非同期に送信することをお勧めします。 例: INSERT INTO SELECT
、INSERT OVERWRITE SELECT
、およびCREATE TABLE AS SELECT
。
でXIHE BSPジョブのステータスを確認する方法 Data Lakehouse Editionクラスター?
ジョブエディターを使用して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ジョブ間の相互影響を減らすためにリソースを分離するにはどうすればよいですか?
AnalyticDB for MySQL Data Warehouse EditionクラスターのエラスティックモードのCluster Editionおよび
Data Lakehouse Editionクラスターは、リソースグループ機能を提供します。 詳細については、「リソースグループの概要 (Data Warehouse Edition) 」および「リソースグループの概要 (Data Lakehouse Edition) 」をご参照ください。 さまざまな種類のリソースグループを作成し、対応するリソースグループにSQLジョブを送信してリソースを分離できます。IN演算子に多数の条件が指定されている場合はどうすればよいですか?
AnalyticDB for MySQLは、IN演算子に指定できる条件の数に制限を課します。 デフォルト値は2000です。 ビジネス要件に基づいて値を変更できます。
パフォーマンスを確保するために、IN演算子に5,000を超える条件を指定しないでください。
たとえば、次のステートメントを実行して、IN演算子の条件数を3000に設定します。
SET ADB_CONFIG max_in_items_count=3000;
「クエリが最大時間制限を超えた1800000.00ms」エラーが返された場合はどうすればよいですか?
AnalyticDB for MySQLでは、SQLクエリのタイムアウト期間を設定できます。 1,800,000ミリ秒後にクエリの実行が終了しない場合は、前述のエラーが返されます。 次のステートメントを実行して、クラスター内の単一のクエリまたはすべてのクエリのタイムアウト期間を設定できます。
単一のクエリの場合:
/*+ QUERY_TIMEOUT=xxx */SELECT count(*) FROM t;
クラスター内のすべてのクエリの場合:
SET ADB_CONFIG QUERY_TIMEOUT=xxx;
詳細については、「設定およびヒント設定パラメーター」をご参照ください。
マルチステートメント機能を使用して複数のSQLステートメントを連続して実行するときに、"multi-statement be found" エラーが返された場合はどうすればよいですか?
V3.1.9.3以降のAnalyticDB for MySQLクラスターのみがマルチステートメント機能をサポートしています。 クラスターのマイナーバージョンが要件を満たしているかどうかを確認する必要があります。 マイナーバージョンが3.1.9.3より前の場合は、テクニカルサポートにお問い合わせください。 マイナーバージョンが3.1.9.3以降であるが、エラーが続く場合、クライアントでマルチステートメント機能が無効になる可能性があります。
MySQL JDBCクライアントを使用してAnalyticDB for MySQLクラスターに接続する場合、SET ADB_CONFIG ALLOW_MULTI_QUERIES=true;
ステートメントを実行してマルチステートメント機能を有効にし、allowMultiQueries
プロパティをtrue
に設定する必要があります。
クエリ結果に切り捨て時間が含まれている場合はどうすればよいですか?
クエリ結果に含まれる時間がMySQLクライアントで期待どおりに表示されるかどうかを確認します。 時間が期待どおりに表示される場合は、クエリ結果が他のクライアントによって処理されるかどうかを確認します。
組み込みのAES_ENCRYPT() 関数でエラーが発生した場合はどうすればよいですか?
次のステートメントを実行するとエラーが発生することがあります。
SELECT CONVERT(AES_DECRYPT(AES_ENCRYPT('ABC123','key_string'),'key_string'),char(10));
この場合、AES_ENCRYPT(NCRYPT (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句がLIMIT句と一緒に使用されていない場合、クエリ結果はランダムな順序で返されます。
GROUP BY句と集計関数を使用するSELECTステートメントでは、GROUP BY句と集計関数に特定のフィールドが含まれていない場合、そのフィールドに対してランダムな値が返されます。
この問題が解決しない場合は、テクニカルサポートにお問い合わせください。
単一のテーブルでORDER by句を使用して並べ替えを行うクエリで、時間がかかるのはなぜですか。
データは分散して格納され、ストレージ層でソートされません。 その結果、クエリ中に大量の不要なデータが読み取られ、クエリの継続時間が長くなります。
ORDER BY句で使用されるフィールドにクラスタ化インデックスを作成することをお勧めします。 クラスター化インデックスを作成した後、データは最初にストレージ層でソートされます。 ORDER BY句を使用するクエリを実行する場合、少量のデータのみを読み取る必要があります。 これにより、クエリのパフォーマンスが向上します。 クラスター化インデックスの作成方法については、「ALTER TABLE」トピックの「クラスター化インデックスの作成」セクションをご参照ください。
テーブルに作成できるクラスタ化インデックスは1つだけです。 別のフィールドにすでにクラスタ化インデックスがあるテーブルのORDER BY句で使用されるフィールドにクラスタ化インデックスを作成する前に、まず既存のクラスタ化インデックスを削除する必要があります。
大きなテーブルのクラスタ化インデックスを作成すると、BUILDジョブの実行に必要な時間が長くなり、ストレージノードのCPU使用率に影響します。
実行計画内のすべてのテーブルのスキャン行数が、クエリによってスキャンされる行の総数と異なるのはなぜですか。
ほとんどの場合、この問題はレプリケートされたテーブルによって発生します。 AnalyticDB for MySQLは、各シャードにレプリケートされたテーブルを保存し、レプリケートされたテーブルがスキャンされるときに行数を繰り返しカウントします。
プライマリキーを持たないAnalyticDB for MySQLテーブルでINSERT OVERWRITEステートメントを使用すると、データが複製されるのはなぜですか。
プライマリキーがないAnalyticDB for MySQLテーブルでは、自動重複排除はサポートされていません。
SELECT * FROM TABLE GROUP BY KEYステートメントが実行されたときに、「GROUP BY句にない列 'XXX' 」エラーが発生するのはなぜですか。
GROUP BY句を使用する場合、クエリ結果はすべてのフィールドを表示できません。 ステートメントで列名を指定する必要があります。 サンプル文:
SELECT nation.name FROM nation GROUP BY nation.nationkey
クエリ結果がJSON形式で返される場合、IN演算子に指定される値の数に制限がありますか?
V3.1.4以前のAnalyticDB for MySQLクラスターの場合、IN演算子に指定された値の数は16を超えることはできません。 V3.1.4以降のAnalyticDB For MySQLクラスターの場合、IN演算子に指定される値の数に制限はありません。 クラスターのマイナーバージョンを照会する方法の詳細については、「購入、構成変更、アップグレード」トピックの「AnalyticDB For MySQLクラスターのマイナーバージョンを照会する方法」を参照してください。
使用できますか。AnalyticDB for MySQLの外部テーブルデータソースとしてOSSからのcsv.gzファイル?
はい、使用できます。AnalyticDB for MySQLの外部テーブルデータソースとしてのcsv.gzファイル。 外部テーブルの場合、compress_typeパラメーターをgzipに設定する必要があります。 OSS外部テーブルの構文については、「外部テーブルを使用してdata Warehouse Editionにデータをインポートする」トピックの「パーティション分割されていないOSS外部テーブル」をご参照ください。
INSERT ON DUPLICATE KEY UPDATEステートメントはAnalyticDB for MySQLでサポートされていますか?
はい。AnalyticDB for MySQLでは、INSERT ON DUPLICATE KEY UPDATEステートメントがサポートされています。 ただし、AnalyticDB for MySQLでは、INSERT ON DUPLICATE KEY UPDATEステートメントの変数に値のみを割り当てることができます。 このステートメントで式を割り当てることはできません。
AnalyticDB for MySQLのUPDATEステートメントでJOINを使用できますか?
UPDATEステートメントでJOINを使用できるのは、V3.1.6.4以降のAnalyticDB for MySQLクラスターのみです。 詳細については、「UPDATE」をご参照ください。
AnalyticDB for MySQLでSQL変数を設定できますか?
いいえ。AnalyticDB for MySQLでSQL変数を設定することはできません。
INSERT ON DUPLICATE KEY UPDATE
ステートメントを実行して、Logstashプラグインを使用してデータを一括挿入できますか?
はい。INSERT ON DUPLICATE KEY UPDATEステートメントを実行して、データを一括挿入できます。 INSERT ON DUPLICATE KEY UPDATE
ステートメントを実行してデータを一括挿入する場合、最後のVALUES()
の後にON DUPLICATE KEY UPDATE
句を追加する必要があります。
たとえば、次のステートメントを実行して、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 = 'Industrial Accounting Practice V9.0--77',
business_id = 'kuaiji';
AnalyticDB for MySQLクラスターが組み込みデータセットをロードするための条件は何ですか?
組み込みデータセットをロードするには、AnalyticDB for MySQLクラスターに、少なくとも24のAnalyticDBコンピューティングユニット (ACU) の予約済みストレージリソースと少なくとも16のコンピューティング予約済みリソースがuser_defaultリソースグループに含まれている必要があります。
組み込みデータセットがAnalyticDB for MySQLクラスターにロードされているかどうかを確認するにはどうすればよいですか?
AnalyticDB for MySQLクラスターの左側のナビゲーションウィンドウで、[ジョブの開発] > [SQLの開発] を選択します。 [SQL Development] ページで、読み込みの進行状況を確認できます。 アイコンが 組み込みデータセットの読み込み ボタンの前に表示され、[データベースとテーブル] タブにADB_SampleData_TPCHデータベースとデータベースのテーブルが表示されると、組み込みデータセットが読み込まれます。
読み込み失敗または読み込みの延長を示すエラーメッセージがシステムから返された場合はどうすればよいですか?
DROP TABLE table_name;
ステートメントを実行して、ADB_SampleData_TPCHデータベースからすべてのテーブルを削除します。 次に、DROP DATABASE ADB_SampleData_TPCH;
ステートメントを実行して、ADB_SampleData_TPCHデータベースを削除します。 ADB_SampleData_TPCHデータベースが削除されたら、組み込みデータセットをリロードします。
標準データベースアカウントを使用して組み込みデータセット機能を使用するにはどうすればよいですか?
組み込みデータセット機能は、AnalyticDB for MySQLの権限管理ルールに準拠しています。 クラスターに組み込みデータセットがロードされている場合でも、標準データベースアカウントにはADB_SampleData_TPCHデータベースに対する権限がありません。 特権アカウントを使用して、次のステートメントを使用して標準アカウントに権限を付与する必要があります。
GRANT select ON ADB_SampleData_TPCH.* TO <user_name>;
組み込みデータセットをロードした後、AnalyticDB for MySQLクラスターをテストするにはどうすればよいですか?
AnalyticDB for MySQLは、クラスターのテストに使用できる対応するクエリスクリプトを提供します。 組み込みデータセットが読み込まれたら、[ジョブの開発]> [SQLの開発] を選択し、[スクリプト] タブをクリックしてSQL文を実行します。 SQL文の詳細については、「TPC-Hテストクエリ」をご参照ください。
組み込みデータセットの整合性を確保するために、ADB_SampleData_TPCHデータベースでSELECTステートメントのみを実行することを推奨します。 他のDMLまたはDDLステートメントを実行すると、組み込みデータセットのデータが変更され、データセットの読み込みに失敗する可能性があります。 この場合、ADB_SampleData_TPCHデータベースを削除し、データセットをリロードする必要があります。