#背景・目的
- Athenaでどこに時間がかかっているか内訳を調べたい。
#結論
- Athenaのget-query-executionのオプションを指定することで統計情報が取得できる。
#内容
CLIで調査する
- 以下のコマンドを実行する。
aws athena get-query-execution --query-execution-id {クエリID} --query QueryExecution.Statistics --output table
- 結果
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| GetQueryExecution |
+--------------------+------------------------------+----------------------------+-------------------------+---------------------------------+------------------------------+
| DataScannedInBytes | EngineExecutionTimeInMillis | QueryPlanningTimeInMillis | QueryQueueTimeInMillis | ServiceProcessingTimeInMillis | TotalExecutionTimeInMillis |
+--------------------+------------------------------+----------------------------+-------------------------+---------------------------------+------------------------------+
| 79139461 | 5083 | 798 | 295 | 68 | 5446 |
+--------------------+------------------------------+----------------------------+-------------------------+---------------------------------+------------------------------+
-
DataScannedInBytes
- スキャンしたデータ量(バイト数)
-
EngineExecutionTimeInMillis
- クエリの実行にかかった時間(ミリ秒)
-
QueryPlanningTimeInMillis
- Athenaがクエリ実行計画に要した時間(ミリ秒)
- データソースからテーブルパーティションを取得するために費やした時間も含まれる。
- この時間はEngineExecutionTimeのサブセット。
-
QueryQueueTimeInMillis
- リソースを待機している時間。(ミリ秒)
- 実行前の時間と思われる。
-
ServiceProcessingTimeInMillis
- クエリ実行後、クエリ結果を公開するのに要した時間(ミリ秒)
-
TotalExecutionTimeInMillis
- クエリを実行するのに要した時間(ミリ秒)
- 合計時間と思われる。
-
TotalExecutionは以下のように整理できる。
- 上述したとおりQueryPlanningTimeInMillisはEngineExecutionTimeInMillisのサブセットのため、計算対象から外しています。
内訳 | 実行時間 | 計算対象 |
---|---|---|
EngineExecutionTimeInMillis | 5083 | ◯ |
QueryPlanningTimeInMillis | 798 | |
QueryQueueTimeInMillis | 295 | ◯ |
ServiceProcessingTimeInMillis | 68 | ◯ |
TotalExecutionTimeInMillis | 5446 |
#考察
- これらの数字を確認することで以下の判断ができそう。
- QueryQueueTimeInMillisが長い。
- スループットが大きい。(多い)
- 競合のクエリが多いなど。
- アカウントあたりのAPIコールのクォーターの引き上げを検討する。
- StartQueryExecution(デフォルト20/秒)
- QueryPlanningTimeInMillisが長い。
- テーブルパーティションを取得する時間も含まれるので、パーティション数が多いか追加で確認する。
- GlueやAthenaのパーティションインデックスを検討する。
- ServiceProcessingTimeInMillis
- クエリの結果を返すのに時間がかかっている。
- 単純にデータ量が多い場合が考えられる。
- QueryQueueTimeInMillisが長い。
#参考
https://docs.aws.amazon.com/cli/latest/reference/athena/get-query-execution.html
https://docs.aws.amazon.com/ja_jp/athena/latest/ug/service-limits.html#service-limits-api-calls