メタデータの末尾にスキップ
メタデータの先頭に移動

 

クエリ実行の効率性を高めるために、Clustrixはクエリプランキャッシュ(QPC)を採用しています。これはユーザのクエリのコンパイルされたバージョンを保存します。負荷時のClustrix製品のパフォーマンスを検証するために、system.qpc_queries テーブルを調べることができます。各ノードはそれぞれのクエリキャッシュを保持します。

クエリパラメータ (例えば、'WHERE id = N' の中の ”N") は、キャッシュされません。Clustrix がクエリを実行するためにQPCを使用する場合は、全ての新しいパラメータがコンパイルされたクエリの中に代入されます。異なるセットのパラメータでの効率を最大にするために、クエリは複数のプランをキャッシュすることができます。テーブルのインデックスはテーブルが含んでいる値の分散に関する統計を提供します。この与えられた情報を使って、Clustrixは異なるパラメータ値に対して最適化されたプランを考え出すことができます。

例えば、"SELECT * FROM foo WHERE a = ? AND b = ?"というクエリに関して、Clustrixは a が常にNULL、あるいは b が常に0、a='foo' に対して aがNULL、あるいは b=99 に対して b=0、の場合の最適プランを定義することができます(テーブルはインデックスされていると仮定します)。

system.qpc_queries テーブルは以下のフィールドを含みます。

  • nodeid: プランがキャッシュされたノードのID。多くの場合において、クエリは最終的にノードに渡って分散されますが、幾つかの場合において、一つのクライアントあるいはプロセスが一つのノードでの過度な負荷の原因であることがあります。この場合、あるノードのエントリのみをリスト表示するために nodeid でフィルタすることができます。
  • statement: プランが基づいているSQLクエリ。定数はパラメータ化されます。
  • query_id: クエリに割り当てられたユニークな識別子。
  • cache_id: ノードに関してキャッシュに割り当てられたユニークな識別子。クエリとキャッシュIDはキャッシュがフラッシュされた時に代わります。代表的にはDDLクエリによるものです。Not of general interest, except for detecting cache flushes.
  • plan_id: 同じクエリについて生成されたUnique identifier assigned to differentiate multiple plans generated for the same query.
  • exec_count: プランが作成されてからこのクエリプランが実行された回数。
  • exec_ms: このプランが作成されてからのクエリの実行に費やしたCPU 時間(ミリ秒)。クエリの編集時間を含みません。

長い間実行されているクエリの場所を知るために、exec_ms フィールドの調べてください。

例えば、クラスタ内でもっとも長く実行されているクエリのトップ3については、以下のクエリを発行してください:

SELECT nodeid, exec_count, exec_ms as total_ms, exec_ms/exec_count as avg_ms, left(statement,100)
  FROM qpc_queries
 ORDER BY total_ms desc
 LIMIT 3;

最初のクエリを実行し調査の対照とした場合、約35秒掛かります。EXPLAIN と SHOW CREATE TABLE の出力は、フルテーブルスキャンが実行されることを明らかにします:

mysql> EXPLAIN SELECT count(*) FROM files WHERE service_id = 2266 AND mod_time > TIMESTAMPADD(MINUTE,-15,NOW());
+------------------------------------------------------------------------------------------------------------------------+-----------+-----------+
| Operation                                                                                                              | Est. Cost | Est. Rows |
+------------------------------------------------------------------------------------------------------------------------+-----------+-----------+
| row_count "expr1"                                                                                                      |     31.84 |      1.00 |
|   stream_combine                                                                                                       |     31.76 |      0.82 |
|     compute expr0 := param(0)                                                                                          |     10.23 |      0.27 |
|       filter isnotnull(param(0))                                                                                       |     10.22 |      0.27 |
|         filter (1.mod_time > add_time_interval(current_timestamp(), param(2), param(1))) and (1.service_id = param(3)) |     10.22 |      0.30 |
|           index_scan 1 := files.__base_files                                                                           |     10.20 |      0.34 |
+------------------------------------------------------------------------------------------------------------------------+-----------+-----------+
6 rows in set (0.01 sec)
 
mysql> show create table files\G
*************************** 1. row ***************************
       Table: files
Create Table: CREATE TABLE `files` (
  `service_id` int(11),
  `mod_time` datetime
) CHARACTER SET utf8 /*$ REPLICAS=2 SLICES=3 */
1 row in set (0.00 sec) 


パフォーマンスを改善するには、以下のコマンドを発行して、service_idmod_time にインデックスを作成します:

mysql> alter table files add index service_mod (service_id, mod_time);
Query OK, 0 rows affected (0.82 sec)

このインデックスを使って、クエリの平均実行時間を容認可能な3ミリ秒にします。ます。 

TOP
inserted by FC2 system