SlideShare a Scribd company logo
1 of 63
クエリパフォーマンス
チューニングの手法
HPE Vertica Advanced Performance Tuning
April 27, 2016
本章の概要
– クエリの解析方法の概要
– クエリのプロファイル
– 実行計画
– 統計情報
– カウンター
– イベントタイプ
– 追加のシステムテーブル
クエリ解析方法の概要
3
クエリの解析方法
4
クエリの
プロファイル
• トランザクションID
• ステートメントID
• リソース使用率
実行計画
• プロジェクション
• パスID
• データの再配布
統計情報
カウンター
• 実行時間
• ファイルのハンドル数、
生成された行、等
• 統計情報が無い、
もしくは、古いこと
をトリガ
イベントタイプ追加の
テーブル
• ユーザー情報
• クエリの実行時間
• チューニングの推奨
事項
• 統計情報がない
• Join や Group By
のスピル
システムテーブル
– 標準システムテーブルは、データベース内の様々な特徴と機能を監視
SELECT table_name, table_description FROM
system_tables ORDER BY table_name;
– 追加のデータコレクターテーブルは、データベースの構成要素の様々な特徴を監視
SELECT table_name, component, description FROM
data_collector ORDER BY table_name;
– ユーザーは、システムテーブルと内容に対する SELECT 権限を持つ必要あり
– dbadmin 権限の一部
5
データ保持ポリシーの確認
– 関数 GET_DATA_COLLECTOR_POLICY() を使って、設定を確認
SELECT GET_DATA_COLLECTOR_POLICY('QueryExecutions');
GET_DATA_COLLECTOR_POLICY
----------------------------------------------
1000KB kept in memory, 20000KB kept on disk.
(1 row)
6
データ保持ポリシーの変更
– 関数 SET_DATA_COLLECTOR_POLICY() を使って、全ノード上のコンポーネントの保持ポリシーを設定
SELECT SET_DATA_COLLECTOR_POLICY('QueryExecutions', 2000, 40000);
SET_DATA_COLLECTOR_POLICY
----------------------------------------------
SET
(1 row)
SELECT GET_DATA_COLLECTOR_POLICY('QueryExecutions');
GET_DATA_COLLECTOR_POLICY
----------------------------------------------
2000KB kept in memory, 40000KB kept on disk.
(1 row)
7
データコレクターテーブルの消去
– 関数 CLEAR_DATA_COLLECTOR() を使って、データコレクターテーブルのメモリ、ディスク上のレコードを消去
SELECT CLEAR_DATA_COLLECTOR('QueryExecutions');
CLEAR_DATA_COLLECTOR
----------------------------------------------
CLEAR
(1 row)
SELECT CLEAR_DATA_COLLECTOR();
CLEAR_DATA_COLLECTOR
----------------------------------------------
CLEAR
(1 row)
8
クエリのプロファイル
9
クエリの解析方法
10
クエリの
プロファイル
• トランザクションID
• ステートメントID
• リソース使用率
実行計画
• プロジェクション
• パスID
• データの再配布
統計情報
カウンター
• 実行時間
• ファイルのハンドル数、
生成された行、等
• 統計情報が無い、
もしくは、古いこと
をトリガ
イベントタイプ追加の
テーブル
• ユーザー情報
• クエリの実行時間
• チューニングの推奨
事項
• 統計情報がない
• Join や Group By
のスピル
クエリプロファイルの生成
– クエリの前に PROFILE をつけることにより、クエリパフォーマンス分析のために使える情報が得られる
11
PROFILE SELECT order_number,date_ordered
FROM store.store_orders_fact orders
WHERE orders.store_key IN (
SELECT store_key
FROM store.store_dimension
WHERE store_state = 'MA')
AND orders.vendor_key NOT IN (
SELECT vendor_key
FROM public.vendor_dimension
WHERE vendor_state = 'MA')
AND date_ordered < '2012-03-01';
プロファイルの結果
12
NOTICE 4788: Statement is being profiled.
HINT: SELECT *
FROM v_monitor.execution_engine_profiles
WHERE transaction_id = 45035996273738674 AND statement_id = 15;
NOTICE 3557: Initiator memory for query: [on pool general: 732615 KB, minimum: 147104
KB]
NOTICE 5077: Total memory required by query: [732615 KB]
order_number | date_ordered
--------------+--------------
292437 | 2012-01-01
240145 | 2012-01-01
234175 | 2012-01-02
27987 | 2012-01-02
47916 | 2012-01-02
8588 | 2012-01-01
252130 | 2012-01-02
213721 | 2012-01-02
265128 | 2012-01-02
クエリの出力をリダイレクト
13
=> o /dev/null
=> PROFILE SELECT order_number,date_ordered
FROM store.store_orders_fact;
NOTICE 4788: Statement is being profiled
HINT: Select * from v_monitor.execution_engine_profiles where
transaction_id=45035996273710140 and statement_id=28;
NOTICE 3557: Initiator memory for query: [on pool general: 6816 KB, minimum:
6816 KB]
NOTICE 5077: Total memory required by query: [6816 KB]
=> o
マネージメントコンソールのクエリプロファイル
14
プロファイリングの状態の確認
– プロファイリングが有効化されているかどうか確認するためには、下記を実行
15
SELECT SHOW_PROFILING_CONFIG();
SHOW_PROFILING_CONFIG
--------------------------------------------
Session Profiling: Local off, Global off
EE Profiling: Local off, Global off
Query Profiling: Local off, Global off
プロファイリングの管理
– 全ノードにおいて、全セッションに対するプロファイリングを有効化/無効化
SELECT SET_CONFIG_PARAMETER('[global_profiling_type]',[1/0]);
– プロファイリングのタイプ
– session—基本的なセッションのパラメーターとロックタイムアウトのデータのプロファイリング
– ee—各クエリの実行に関する情報をプロファイリング
– query—クエリ文やクエリ実行時間のような実行したクエリに関する一般的な情報のプロファイリング
– プロファイリングのデータを消去
SELECT CLEAR_PROFILING('[type_of_profiling]');
16
プロファイル結果に対する対応
プロファイルで、過度のメモリが使われていることが判明した場合
– データセットのサイズを最小化するために述語を使用
–フィルタ、サブクエリの使用、 RLE エンコーディングの使用の検討
– メモリのスピルの回避
–データセットの最小化
–サブクエリの使用
–実行計画でソートを遅らせる
–ノードあるいは使用されているリソースプールへのメモリ追加
17
実行計画
18
クエリの解析方法
19
クエリの
プロファイル
• トランザクションID
• ステートメントID
• リソース使用率
実行計画
• プロジェクション
• パスID
• データの再配布
統計情報
カウンター
• 実行時間
• ファイルのハンドル数、
生成された行、等
• 統計情報が無い、
もしくは、古いこと
をトリガ
イベントタイプ追加の
テーブル
• ユーザー情報
• クエリの実行時間
• チューニングの推奨
事項
• 統計情報がない
• Join や Group By
のスピル
実行計画の生成
– クエリの前に EXPLAIN をつけることにより、オプティマイザのクエリプランの実行ストラテジーが得られる
– オプティマイザが実行可能なプランを評価し、コストに基づいて最良な選択肢を返す
20
EXPLAIN SELECT order_number,date_ordered
FROM store.store_orders_fact orders
WHERE orders.store_key IN (
SELECT store_key
FROM store.store_dimension
WHERE store_state = 'MA')
AND orders.vendor_key NOT IN (
SELECT vendor_key
FROM public.vendor_dimension
WHERE vendor_state = 'MA')
AND date_ordered < '2012-03-01';
マネージメントコンソールの実行計画
21
GraphViz
– 「BASE QUERY PLAN (GraphVizフォーマット)」データを新規の GraphViz ドキュメントにコピー
– 下記ページからGraphVizをダウンロード
www.graphviz.org
– 有向グラフを svg 形式で出力し、インターネットブラウザで表示
– 有向グラフをズームしたり、左右に回転することが可能
22
実行計画の結果:プロジェクション
23
Access Path:
+-JOIN HASH [Semi] [Cost: 1K, Rows: 75K (625 RLE)] (PATH ID: 1)
| Join Cond: (orders.store_key = VAL(2))
| Materialize at Input: orders.store_key
| Materialize at Output: orders.order_number, orders.date_ordered
| +-- Outer -> JOIN HASH [Anti][NotInAnti] [Cost: 343, Rows: 150K (1K RLE)] (PATH ID: 2)
| | Join Cond: (orders.vendor_key = VAL(3))
| | +-- Outer -> STORAGE ACCESS for orders [Cost: 147, Rows: 300K (2K RLE)] (PATH ID: 3)
| | | Projection: store.store_orders_fact_DBD_13_rep_VMartDesign_node0001
| | | Materialize: orders.vendor_key
| | | Filter: (orders.date_ordered < '2012-03-01'::date)
| | | Runtime Filter: (SIP1(HashJoin): orders.store_key)
| | +-- Inner -> SELECT [Cost: 20, Rows: 3] (PATH ID: 4)
| | | +---> STORAGE ACCESS for vendor_dimension [Cost: 20, Rows: 3] (PATH ID: 5)
| | | | Projection: public.vendor_dimension_DBD_6_rep_VMartDesign_node0001
| | | | Materialize: vendor_dimension.vendor_key
| | | | Filter: (vendor_dimension.vendor_state = 'MA')
| +-- Inner -> SELECT [Cost: 21, Rows: 16] (PATH ID: 6)
| | +---> STORAGE ACCESS for store_dimension [Cost: 21, Rows: 16] (PATH ID: 7)
| | | Projection: store.store_dimension_DBD_11_rep_VMartDesign_node0001
| | | Materialize: store_dimension.store_key
| | | Filter: (store_dimension.store_state = 'MA')
実行計画の結果:オペレーションタイプ
24
Access Path:
+-JOIN HASH [Semi] [Cost: 1K, Rows: 75K (625 RLE)] (PATH ID: 1)
| Join Cond: (orders.store_key = VAL(2))
| Materialize at Input: orders.store_key
| Materialize at Output: orders.order_number, orders.date_ordered
| +-- Outer -> JOIN HASH [Anti][NotInAnti] [Cost: 343, Rows: 150K (1K RLE)] (PATH ID: 2)
| | Join Cond: (orders.vendor_key = VAL(3))
| | +-- Outer -> STORAGE ACCESS for orders [Cost: 147, Rows: 300K (2K RLE)] (PATH ID: 3)
| | | Projection: store.store_orders_fact_DBD_13_rep_VMartDesign_node0001
| | | Materialize: orders.vendor_key
| | | Filter: (orders.date_ordered < '2012-03-01'::date)
| | | Runtime Filter: (SIP1(HashJoin): orders.store_key)
| | +-- Inner -> SELECT [Cost: 20, Rows: 3] (PATH ID: 4)
| | | +---> STORAGE ACCESS for vendor_dimension [Cost: 20, Rows: 3] (PATH ID: 5)
| | | | Projection: public.vendor_dimension_DBD_6_rep_VMartDesign_node0001
| | | | Materialize: vendor_dimension.vendor_key
| | | | Filter: (vendor_dimension.vendor_state = 'MA')
| +-- Inner -> SELECT [Cost: 21, Rows: 16] (PATH ID: 6)
| | +---> STORAGE ACCESS for store_dimension [Cost: 21, Rows: 16] (PATH ID: 7)
| | | Projection: store.store_dimension_DBD_11_rep_VMartDesign_node0001
| | | Materialize: store_dimension.store_key
| | | Filter: (store_dimension.store_state = 'MA')
実行計画の結果:フィルター
25
Access Path:
+-JOIN HASH [Semi] [Cost: 1K, Rows: 75K (625 RLE)] (PATH ID: 1)
| Join Cond: (orders.store_key = VAL(2))
| Materialize at Input: orders.store_key
| Materialize at Output: orders.order_number, orders.date_ordered
| +-- Outer -> JOIN HASH [Anti][NotInAnti] [Cost: 343, Rows: 150K (1K RLE)] (PATH ID: 2)
| | Join Cond: (orders.vendor_key = VAL(3))
| | +-- Outer -> STORAGE ACCESS for orders [Cost: 147, Rows: 300K (2K RLE)] (PATH ID: 3)
| | | Projection: store.store_orders_fact_DBD_13_rep_VMartDesign_node0001
| | | Materialize: orders.vendor_key
| | | Filter: (orders.date_ordered < '2012-03-01'::date)
| | | Runtime Filter: (SIP1(HashJoin): orders.store_key)
| | +-- Inner -> SELECT [Cost: 20, Rows: 3] (PATH ID: 4)
| | | +---> STORAGE ACCESS for vendor_dimension [Cost: 20, Rows: 3] (PATH ID: 5)
| | | | Projection: public.vendor_dimension_DBD_6_rep_VMartDesign_node0001
| | | | Materialize: vendor_dimension.vendor_key
| | | | Filter: (vendor_dimension.vendor_state = 'MA')
| +-- Inner -> SELECT [Cost: 21, Rows: 16] (PATH ID: 6)
| | +---> STORAGE ACCESS for store_dimension [Cost: 21, Rows: 16] (PATH ID: 7)
| | | Projection: store.store_dimension_DBD_11_rep_VMartDesign_node0001
| | | Materialize: store_dimension.store_key
| | | Filter: (store_dimension.store_state = 'MA')
実行計画の結果:コスト
26
Access Path:
+-JOIN HASH [Semi] [Cost: 1K, Rows: 75K (625 RLE)] (PATH ID: 1)
| Join Cond: (orders.store_key = VAL(2))
| Materialize at Input: orders.store_key
| Materialize at Output: orders.order_number, orders.date_ordered
| +-- Outer -> JOIN HASH [Anti][NotInAnti] [Cost: 343, Rows: 150K (1K RLE)] (PATH ID: 2)
| | Join Cond: (orders.vendor_key = VAL(3))
| | +-- Outer -> STORAGE ACCESS for orders [Cost: 147, Rows: 300K (2K RLE)] (PATH ID: 3)
| | | Projection: store.store_orders_fact_DBD_13_rep_VMartDesign_node0001
| | | Materialize: orders.vendor_key
| | | Filter: (orders.date_ordered < '2012-03-01'::date)
| | | Runtime Filter: (SIP1(HashJoin): orders.store_key)
| | +-- Inner -> SELECT [Cost: 20, Rows: 3] (PATH ID: 4)
| | | +---> STORAGE ACCESS for vendor_dimension [Cost: 20, Rows: 3] (PATH ID: 5)
| | | | Projection: public.vendor_dimension_DBD_6_rep_VMartDesign_node0001
| | | | Materialize: vendor_dimension.vendor_key
| | | | Filter: (vendor_dimension.vendor_state = 'MA')
| +-- Inner -> SELECT [Cost: 21, Rows: 16] (PATH ID: 6)
| | +---> STORAGE ACCESS for store_dimension [Cost: 21, Rows: 16] (PATH ID: 7)
| | | Projection: store.store_dimension_DBD_11_rep_VMartDesign_node0001
| | | Materialize: store_dimension.store_key
| | | Filter: (store_dimension.store_state = 'MA')
実行計画の結果:パスID
27
Access Path:
+-JOIN HASH [Semi] [Cost: 1K, Rows: 75K (625 RLE)] (PATH ID: 1)
| Join Cond: (orders.store_key = VAL(2))
| Materialize at Input: orders.store_key
| Materialize at Output: orders.order_number, orders.date_ordered
| +-- Outer -> JOIN HASH [Anti][NotInAnti] [Cost: 343, Rows: 150K (1K RLE)] (PATH ID: 2)
| | Join Cond: (orders.vendor_key = VAL(3))
| | +-- Outer -> STORAGE ACCESS for orders [Cost: 147, Rows: 300K (2K RLE)] (PATH ID: 3)
| | | Projection: store.store_orders_fact_DBD_13_rep_VMartDesign_node0001
| | | Materialize: orders.vendor_key
| | | Filter: (orders.date_ordered < '2012-03-01'::date)
| | | Runtime Filter: (SIP1(HashJoin): orders.store_key)
| | +-- Inner -> SELECT [Cost: 20, Rows: 3] (PATH ID: 4)
| | | +---> STORAGE ACCESS for vendor_dimension [Cost: 20, Rows: 3] (PATH ID: 5)
| | | | Projection: public.vendor_dimension_DBD_6_rep_VMartDesign_node0001
| | | | Materialize: vendor_dimension.vendor_key
| | | | Filter: (vendor_dimension.vendor_state = 'MA')
| +-- Inner -> SELECT [Cost: 21, Rows: 16] (PATH ID: 6)
| | +---> STORAGE ACCESS for store_dimension [Cost: 21, Rows: 16] (PATH ID: 7)
| | | Projection: store.store_dimension_DBD_11_rep_VMartDesign_node0001
| | | Materialize: store_dimension.store_key
| | | Filter: (store_dimension.store_state = 'MA')
データの再配布
– 分散されたプロジェクションのデータだけが、 RESEGMENT あるいは BROADCAST の対象
– 結合がローカルで処理されないため、実行時にデータを再配布しなければならずネットワーク負荷が高くなる
– プロジェクションのデータは、操作されて、クエリのためにデータ編成される必要がある
28
RESEGMENT
– 分散化されたプロジェクションのデータは、クエリ実行中に、 Identically Segmented プロジェクションに再分散さ
れ、全ノードに分散される必要あり
EXPLAIN SELECT CD.annual_income,OSI.sale_date_key
FROM online_sales.online_sales_fact OSI
FULL OUTER JOIN customer_dimension CD
ON CD.customer_key = OSI.customer_key;
Access Path:
+-JOIN HASH [FullOuter] [Cost: 18K, Rows: 5M] (PATH ID: 1) Outer (RESEGMENT) Inner (FILTER)
| Join Cond: (CD.customer_key = OSI.customer_key)
| Execute on: All Nodes
| +-- Outer -> STORAGE ACCESS for OSI [Cost: 3K, Rows: 5M] (PATH ID: 2)
| | projection: online_sales.online_sales_fact_DBD_12_seg_vmartdb_design
| | Materialize: OSI.sale_date_key, OSI.customer_key
| | Execute on: All Nodes
| +-- Inner -> STORAGE ACCESS for CD [Cost: 264, Rows: 50K] (PATH ID: 3)
| | projection: public.customer_dimension_DBD_1_rep_vmartdb_design_node0001
| | Materialize: CD.annual_income, CD.customer_key
| | Execute on: All Nodes
BROADCAST
– 分散化されたプロジェクションのデータは、クエリ実行中に、複製され、全ノードに分散される必要あり
30
EXPLAIN SELECT *
FROM T1 LEFT JOIN T2 ON T1.a > T2.y;
Access Path:
+-JOIN HASH [LeftOuter][Cost:40K,Rows:10K(NO STATISTICS)](PATH ID: 1) Inner (BROADCAST)
| Join Filter: (T1.a > T2.y)
| Materialize at Output: T1.b
| Execute on: All Nodes
| +--Outer->STORAGE ACCESS for T1[Cost:151,Rows:10K(NO STATISTICS)](PATH ID:2)
| | projection: public.T1_b0
| | Materialize: T1.a
| | Execute on: All Nodes
| +--Inner->STORAGE ACCESS for T2[Cost:302,Rows:10K(NO STATISTICS)](PATH ID:3)
| | projection: public.T2_b0
| | Materialize: T2.x, T2.y
| | Execute on: All Nodes
実行計画のプロファイル
31
SELECT path_id, path_line_index, running_time, memory_allocated_bytes, read_from_disk_bytes, path_line FROM
query_plan_profiles
WHERE transaction_id = 45035996273738674 and statement_id = 15 ORDER BY path_id, path_line_index;
-[ RECORD 1 ]----------+--------------------------------------------------------
path_id | 2
path_line_index | 1
running_time | 00:00:00.316575
memory_allocated_bytes | 46802096
read_from_disk_bytes |
path_line | +-GROUPBY HASH (SORT OUTPUT) (LOCAL RESEGMENT GROUPS)
[Cost: 81K, Rows: 2M (NO STATISTICS)] (PATH ID: 2)
-[ RECORD 2 ]----------+---------------------------------------------------------
path_id | 8
path_line_index | 1
running_time | 00:00:00.000461
memory_allocated_bytes | 570104
read_from_disk_bytes | 0
path_line | +---> STORAGE ACCESS for store_dimension [Cost: 35,
Rows: 249 (NO STATISTICS)] (PATH ID: 8)
プロジェクションの DDL の出力
– セグメンテーション句を決定するために、 JOIN 句に使われているプロジェクションの DDL を確認
– ファイルへの出力方法
SELECT EXPORT_OBJECTS
('[destination]','[schema.projectionName]');
– 画面上での表示方法
SELECT EXPORT_OBJECTS ('','[schema.projectionName]');
– 最適なセグメンテーションを提供するために、結合キーによって複製もしくは分散された新規プロジェクションを作
成
32
分散化されたデータサイズ
–PROJECTION_STORAGE は、分散化されたデータサイズを表示
– 全ノード間で 均一に分散されていることを確認
– 最適なセグメンテーションを提供するために、結合キーによって複製もしくは分散された新規プロジェクションを作
成
33
SELECT node_name, projection_name, used_bytes
FROM projection_storage
WHERE projection_name ilike 'customer_dimension_DBD_1%'
ORDER BY node_name;
node_name | projection_name | used_bytes
----------------+-----------------------------------------+-----------
vmartdb_node0001| customer_dimension_DBD_1_rep_PT_b0 | 5312725
vmartdb_node0002| customer_dimension_DBD_1_rep_PT_b0 | 1681571
vmartdb_node0003| customer_dimension_DBD_1_rep_PT_b0 | 1929766
統計情報
34
クエリの解析方法
35
クエリの
プロファイル
• トランザクションID
• ステートメントID
• リソース使用率
実行計画
• プロジェクション
• パスID
• データの再配布
統計情報
カウンター
• 実行時間
• ファイルのハンドル数、
生成された行、等
• 統計情報が無い、
もしくは、古いこと
をトリガ
イベントタイプ追加の
テーブル
• ユーザー情報
• クエリの実行時間
• チューニングの推奨
事項
• 統計情報がない
• Join や Group By
のスピル
統計情報
• データベース上全体あるいはテーブル毎に統計情報を更新することが、解析に時間がかかってプロジェクション
の修正が必要となる前に、簡単な解決策となりうる
– NO STATISTICS は、クエリの述語のヒストグラムが使用不可であることを示す
– PREDICATE VALUE OUT-OF-RANGE は、クエリの述語がヒストグラムの範囲外であることを示す
36
| | +-- Outer -> STORAGE ACCESS for fact [Cost: 604, Rows: 10K (NO
STATISTICS)]
| | +-- Outer -> STORAGE ACCESS for fact [Cost: 35, Rows: 1 (PREDICATE VALUE
OUT-OF-RANGE)]
統計情報の更新:ANALYZE_STATISTICS
– 大量データが追加あるいは変更された、もしくは、新規テーブルが追加された場合、手動で統計情報を生成
– データベース上の全テーブルに対して実行する場合
SELECT ANALYZE_STATISTICS('');
– 特定のデータベースオブジェクトに対して実行する場合
SELECT ANALYZE_STATISTICS
('[[db-name.]schema.] table [.column-name]');
– データの 10%(固定)を読み込み
– 0 は成功の意
– エラーが返ってきた場合は、 Vertica.log を参照
37
統計情報の更新:ANALYZE_HISTOGRAM
– 可変量のデータを読み込み可能
– サンプルに含まれるデータの比率を指定
– データベース上の全テーブルに対して実行する場合
SELECT ANALYZE_HISTOGRAM(''[,(percent)]);
– 特定のデータベースオブジェクトに対して実行する場合
SELECT ANALYZE_HISTOGRAM('[[db-name.]schema.]table
[.column-name]' [,(percent)]);
38
プロジェクションの統計情報の確認
– システムテーブル PROJECTIONS により、各プロジェクションで統計情報が取得されているかどうかが確認可能
39
SELECT projection_name, has_statistics FROM projections;
-[ RECORD 1 ]---------+------------------------------------
projection_name | call_center_dimension_DBD
_8_rep_VMartDesign_node0001
has_statistics | t
-[ RECORD 2 ]---------+------------------------------------
projection_name | online_page_dimension_DBD
_7_rep_VMartDesign_node0001
has_statistics | f
列の統計情報の確認
– システムテーブル PROJECTION_COLUMNS により、各列において統計情報更新が実行された最終時刻を確認可
能
40
SELECT projection_name, projection_column_name,
statistics_type, statistics_updated_timestamp
FROM projection_columns;
-[ RECORD 1 ]-----------------+---------------------------
projection_name | allsales_DBD_16_rep_
VMartDesign_node0001
projection_column_name | state
statistics_type | FULL
statistics_updated_timestamp | 2013-08-13 11:12:37.025161-04
カウンター
41
クエリの解析方法
42
クエリの
プロファイル
• トランザクションID
• ステートメントID
• リソース使用率
実行計画
• プロジェクション
• パスID
• データの再配布
統計情報
カウンター
• 実行時間
• ファイルのハンドル数、
生成された行、等
• 統計情報が無い、
もしくは、古いこと
をトリガ
イベントタイプ追加の
テーブル
• ユーザー情報
• クエリの実行時間
• チューニングの推奨
事項
• 統計情報がない
• Join や Group By
のスピル
実行エンジン
– クエリを実行
– クエリ実行に関するプロファイリング情報を提供
– クエリプランの品質問題
– プロジェクション設計上の問題
– データの再分散もしくはブロードキャスト
– 各オペレーターに割り当てられるメモリ量
– 各オペレーターで実行するスレッド数
– クエリの実行期間にわたって、それぞれのポイントで、データが各オペレーターにどのようにして流れていったのか
43
最も時間がかかっているオペレーターの特定
44
SELECT * FROM execution_engine_profiles
WHERE transaction_id = 45035996273738674 and statement_id = 15 and counter_name
ilike '%execution%'
ORDER BY counter_value DESC;
-[ RECORD 1 ]------+-------------------------------
node_name | v_vmartdb_node0001
user_id | 45035996273704962
user_name | dbadmin
session_id | verticaTraining64bi-3853:0xfc6
transaction_id | 45035996273738674
statement_id | 15
plan_id | 408577251772803
operator_name | Scan
operator_id | 6
baseplan_id | 6
path_id | 3
localplan_id | 6
activity_id | 1000
resource_id | -1
counter_name | execution time (us)
counter_tag |
counter_value | 11824
is_executing | f
実行エンジンでよく使われるカウンター
– execution time (us)
– CPU の処理時間(マイクロ秒)
– file handles
– rows produced
– total merge phases
– 完全にソートされたデータを作成するために実行完了されなければならないソートのマージフェーズ数の合計
– completed merge phases
– ソートが既に完了されたマージフェーズ数
– current size of temp files (bytes)
– エンコード・圧縮された一時データのサイズ
45
カウンターの集計(1/2)
46
SELECT node_name, operator_name, operator_id,
sum(DECODE(counter_name, 'memory allocated (bytes)',
counter_value, NULL)) AS 'memory allocated (bytes)',
sum(DECODE(counter_name, 'memory reserved (bytes)',
counter_value, NULL)) AS 'memory reserved (bytes)'
FROM execution_engine_profiles
WHERE transaction_id = 45035996273706504 and statement_id = 4
GROUP BY node_name, operator_name, operator_id
ORDER BY operator_id desc, node_name, operator_name;
カウンターの集計(2/2)
47
node_name | operator_name | operator_id | memory allocated (bytes)| memory reserved (bytes)
------------------------------+----------------------+------------------+-----------------------------------+-----------------------------------
v_vmartdb_node0001 | Scan | 10 | 529528 | 0
v_vmartdb_node0001 | StorageUnion | 9 | 140104 | 2424832
v_vmartdb_node0001 | Scan | 8 | 537544 | 0
v_vmartdb_node0001 | StorageUnion | 7 | 139976 | 2424832
v_vmartdb_node0001 | Scan | 6 | 1031224 | 0
v_vmartdb_node0001 | Join | 5 | 2535264 | 1097728
v_vmartdb_node0001 | Join | 4 | 2949144 | 1097728
v_vmartdb_node0001 | ExprEval | 3 | 3520 | 196608
v_vmartdb_node0001 | StorageUnion | 2 | 74992 | 4784128
v_vmartdb_node0001 | NewEENode | 1 | 65904 | 196608
v_vmartdb_node0001 | Root | 0 | 0 | 0
(10 rows)
MC で見る実行エンジンのプロファイルデータ(1/3)
– MC の Explain タブでプロファイルを実行した後、 View Execution Events をクリック
48
MC で見る実行エンジンのプロファイルデータ(2/3)
49
MC で見る実行エンジンのプロファイルデータ(3/3)
50
イベントタイプ
51
クエリの解析方法
52
クエリの
プロファイル
• トランザクションID
• ステートメントID
• リソース使用率
実行計画
• プロジェクション
• パスID
• データの再配布
統計情報
カウンター
• 実行時間
• ファイルのハンドル数、
生成された行、等
• 統計情報が無い、
もしくは、古いこと
をトリガ
イベントタイプ追加の
テーブル
• ユーザー情報
• クエリの実行時間
• チューニングの推奨
事項
• 統計情報がない
• Join や Group By
のスピル
QUERY_EVENTS – 最適化
– クエリのプランや、最適化、実行イベントに関する情報を返す
–QUERY_EVENTS の列 event_type から次の値を探す
– PREDICATE OUTSIDE HISTOGRAM: オプティマイザが、ヒストグラム全体に対して不正確な述語を
検出
– NO HISTOGRAM: オプティマイザが、ヒストグラムを持たない列が述語に指定されていることを
検出
– MEMORY LIMIT HIT: オプティマイザが実行計画作成中に割り当てられたメモリを全て使用
– 特定されたトランザクションに対して、解決のために、列 event_description と列
suggested_action を確認
53
オプティマイザの詳細情報
54
SELECT * FROM query_events
WHERE transaction_id = 45035996273705062 AND statement_id = 2
and event_category = 'optimization';
-[ RECORD 1 ]------------+----------------------------------------------
event_timestamp | 2012-01-25 12:33:04.352453-05
node_name | v_vmart_schema_node0001
user_id | 45035996273704962
user_name | dbadmin
session_id | verticaTraining64bi-7886:0x22
request_id | 30
transaction_id | 45035996273705062
statement_id | 2
event_category | OPTIMIZATION
event_type | NO HISTOGRAM
event_description | The optimizer encountered a predicate on a column
for which it does not have a histogram
object_id | 45035996273719954
event_details | No histogram for
store.store_dimension.store_state
suggested_action |
analyze_statistics('store.store_dimension.store_state');
QUERY_EVENTS – 実行
–QUERY_EVENTS の列 event_type で、次の値を探す
– GROUP_BY_SPILLED
– JOIN_SPILLED
– RESEGMENTED_MANY_ROWS
– 特定したトランザクションで、列 event_description と列 suggested_action の内容を解決
のために確認
55
イベントの詳細情報
56
SELECT * FROM query_events
WHERE transaction_id = 45035996273705062 AND statement_id = 2
and event_category = 'execution';
-[ RECORD 1 ]------------+----------------------------------------------
event_timestamp | 2012-01-25 12:33:04.352453-05
node_name | v_vmart_schema_node0001
user_id | 45035996273704962
user_name | dbadmin
session_id | verticaTraining64bi-7886:0x22
request_id | 30
transaction_id | 45035996273705062
statement_id | 2
event_category | EXECUTION
event_type | GROUP_BY_SPILLED
event_description | GROUP BY key set did not fit in memory, using
external sort grouping.
object_id |
event_details |
suggested_action | Consider a sorted projection. Increase memory
available to the plan
追加のシステムテーブル
57
クエリの解析方法
58
クエリの
プロファイル
• トランザクションID
• ステートメントID
• リソース使用率
実行計画
• プロジェクション
• パスID
• データの再配布
統計情報
カウンター
• 実行時間
• ファイルのハンドル数、
生成された行、等
• 統計情報が無い、
もしくは、古いこと
をトリガ
イベントタイプ追加の
テーブル
• ユーザー情報
• クエリの実行時間
• チューニングの推奨
事項
• 統計情報がない
• Join や Group By
のスピル
追加でおさえておくべきシステムテーブル
– QUERY_PROFILES
– QUERY_METRICS
– QUERY_REQUESTS
59
QUERY_PROFILES
– クエリの実行ユーザー、実行時間、使用された追加メモリを確認
60
SELECT * FROM query_profiles
WHERE transaction_id = 45035996273705062 AND statement_id = 2;
-[ RECORD 1 ]------------+------------------------------
session_id | raster-s1-17956:0x1d
transaction_id | 45035996273705062
statement_id | 2
node_name | v_vmartdb_node0001
query | SELECT * FROM store.store_dimension;
query_search_path | "$user",public,v_catalog,v_monitor,v_internal
projections_used | store_dimension_node0001
query_duration_us | 9647.000000
query_start_epoch | 429
query_start | 2010-10-07 12:46:24.370044-04
query_type | SELECT
error_code | 0
user_name | accounts
processed_row_count | 2023
reserved_extra_memory | 0
is_executing | f
QUERY_METRICS
– 各ノード上のセッション数、実行クエリ数をリスト
61
SELECT * FROM query_metrics;
-[ RECORD 1 ]---------------+-------------------
node_name | v_vmartdb_node01
active_user_session_count | 1
active_system_session_count | 2
total_user_session_count | 146
total_system_session_count | 6248
total_active_session_count | 3
total_session_count | 6250
running_query_count | 1
executed_query_count | 2319
QUERY_REQUESTS
– クエリの実行時刻と状態
62
SELECT * FROM query_requests;
-[ RECORD 1 ]-------+-------------------
node_name | v_vmart_a_node0001
user_name | dbadmin
session_id | verticaTraining64bi-3183:0x1b67
request_id | 13
transaction_id | 45035996273735942
statement_id | 11
request_type | QUERY
request | SELECT customer_region, customer_state, COUNT(customer_state) FROM customer_dimension
GROUP BY customer_region, customer_state;
request_label |
search_path | "$user", public, v_catalog, v_monitor, v_internal
memory_acquired_mb | 100
success | t
error_count |
start_timestamp | 2013-09-18 15:49:41.206783-04
end_timestamp | 2013-09-18 15:49:41.206869-04
request_duration_ms | 86
is_executing | f
本章のまとめ
– クエリの解析方法の概要
– クエリのプロファイル
– 実行計画
– 統計情報
– カウンター
– イベントタイプ
– 追加のシステムテーブル

More Related Content

Similar to 03 kueripahuomansuchiyuninguno shou_fa_

CAメインフレーム システムリソース削減に貢献する製品について
CAメインフレーム システムリソース削減に貢献する製品についてCAメインフレーム システムリソース削減に貢献する製品について
CAメインフレーム システムリソース削減に貢献する製品についてKaneko Izumi
 
第29回 SQL Server 勉強会 (JSSUG) - Azure Synapse Analytics 概要
第29回 SQL Server 勉強会 (JSSUG) - Azure Synapse Analytics 概要 第29回 SQL Server 勉強会 (JSSUG) - Azure Synapse Analytics 概要
第29回 SQL Server 勉強会 (JSSUG) - Azure Synapse Analytics 概要 Daiyu Hatakeyama
 
Dat009 クラウドでビック
Dat009 クラウドでビックDat009 クラウドでビック
Dat009 クラウドでビックTech Summit 2016
 
20181110 fok2018-pg-extension
20181110 fok2018-pg-extension20181110 fok2018-pg-extension
20181110 fok2018-pg-extensionToshi Harada
 
20190119 aws-study-pg-extension
20190119 aws-study-pg-extension20190119 aws-study-pg-extension
20190119 aws-study-pg-extensionToshi Harada
 
Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識shigeya
 
Develop Web Application with Node.js + Express
Develop Web Application with Node.js + ExpressDevelop Web Application with Node.js + Express
Develop Web Application with Node.js + ExpressAkinari Tsugo
 
DTraceによるMySQL解析ことはじめ
DTraceによるMySQL解析ことはじめDTraceによるMySQL解析ことはじめ
DTraceによるMySQL解析ことはじめMikiya Okuno
 
Vertica 7.2.2 新機能
Vertica 7.2.2 新機能Vertica 7.2.2 新機能
Vertica 7.2.2 新機能Kaito Tono
 
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database AnalyticsPL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database AnalyticsKohei KaiGai
 
初めての Data api
初めての Data api初めての Data api
初めての Data apiYuji Takayama
 
企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624Yusuke Suzuki
 
PostgreSQL 10 新機能 @オープンセミナー香川 2017
PostgreSQL 10 新機能 @オープンセミナー香川 2017PostgreSQL 10 新機能 @オープンセミナー香川 2017
PostgreSQL 10 新機能 @オープンセミナー香川 2017Shigeru Hanada
 
Maatkit で MySQL チューニング
Maatkit で MySQL チューニングMaatkit で MySQL チューニング
Maatkit で MySQL チューニングKensuke Nagae
 
ZabbixによるAWS監視のコツ
ZabbixによるAWS監視のコツZabbixによるAWS監視のコツ
ZabbixによるAWS監視のコツShinsukeYokota
 
PHPフレームワーク入門
PHPフレームワーク入門PHPフレームワーク入門
PHPフレームワーク入門Sho A
 
ふくよかなモデル
ふくよかなモデルふくよかなモデル
ふくよかなモデルyukaina
 
C11,12 SQL Server 2012 Performance Tuning by Yukio Kumazawa
C11,12 SQL Server 2012 Performance Tuning by Yukio KumazawaC11,12 SQL Server 2012 Performance Tuning by Yukio Kumazawa
C11,12 SQL Server 2012 Performance Tuning by Yukio KumazawaInsight Technology, Inc.
 
Preview: 世界中のゲーム分析をしてきたPlayFabが大進化!一緒に裏側の最新データ探索の仕組みを覗いてみよう
Preview: 世界中のゲーム分析をしてきたPlayFabが大進化!一緒に裏側の最新データ探索の仕組みを覗いてみようPreview: 世界中のゲーム分析をしてきたPlayFabが大進化!一緒に裏側の最新データ探索の仕組みを覗いてみよう
Preview: 世界中のゲーム分析をしてきたPlayFabが大進化!一緒に裏側の最新データ探索の仕組みを覗いてみようDaisuke Masubuchi
 
Introduction of Oracle Database Architecture
Introduction of Oracle Database ArchitectureIntroduction of Oracle Database Architecture
Introduction of Oracle Database ArchitectureRyota Watabe
 

Similar to 03 kueripahuomansuchiyuninguno shou_fa_ (20)

CAメインフレーム システムリソース削減に貢献する製品について
CAメインフレーム システムリソース削減に貢献する製品についてCAメインフレーム システムリソース削減に貢献する製品について
CAメインフレーム システムリソース削減に貢献する製品について
 
第29回 SQL Server 勉強会 (JSSUG) - Azure Synapse Analytics 概要
第29回 SQL Server 勉強会 (JSSUG) - Azure Synapse Analytics 概要 第29回 SQL Server 勉強会 (JSSUG) - Azure Synapse Analytics 概要
第29回 SQL Server 勉強会 (JSSUG) - Azure Synapse Analytics 概要
 
Dat009 クラウドでビック
Dat009 クラウドでビックDat009 クラウドでビック
Dat009 クラウドでビック
 
20181110 fok2018-pg-extension
20181110 fok2018-pg-extension20181110 fok2018-pg-extension
20181110 fok2018-pg-extension
 
20190119 aws-study-pg-extension
20190119 aws-study-pg-extension20190119 aws-study-pg-extension
20190119 aws-study-pg-extension
 
Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識
 
Develop Web Application with Node.js + Express
Develop Web Application with Node.js + ExpressDevelop Web Application with Node.js + Express
Develop Web Application with Node.js + Express
 
DTraceによるMySQL解析ことはじめ
DTraceによるMySQL解析ことはじめDTraceによるMySQL解析ことはじめ
DTraceによるMySQL解析ことはじめ
 
Vertica 7.2.2 新機能
Vertica 7.2.2 新機能Vertica 7.2.2 新機能
Vertica 7.2.2 新機能
 
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database AnalyticsPL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
 
初めての Data api
初めての Data api初めての Data api
初めての Data api
 
企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624
 
PostgreSQL 10 新機能 @オープンセミナー香川 2017
PostgreSQL 10 新機能 @オープンセミナー香川 2017PostgreSQL 10 新機能 @オープンセミナー香川 2017
PostgreSQL 10 新機能 @オープンセミナー香川 2017
 
Maatkit で MySQL チューニング
Maatkit で MySQL チューニングMaatkit で MySQL チューニング
Maatkit で MySQL チューニング
 
ZabbixによるAWS監視のコツ
ZabbixによるAWS監視のコツZabbixによるAWS監視のコツ
ZabbixによるAWS監視のコツ
 
PHPフレームワーク入門
PHPフレームワーク入門PHPフレームワーク入門
PHPフレームワーク入門
 
ふくよかなモデル
ふくよかなモデルふくよかなモデル
ふくよかなモデル
 
C11,12 SQL Server 2012 Performance Tuning by Yukio Kumazawa
C11,12 SQL Server 2012 Performance Tuning by Yukio KumazawaC11,12 SQL Server 2012 Performance Tuning by Yukio Kumazawa
C11,12 SQL Server 2012 Performance Tuning by Yukio Kumazawa
 
Preview: 世界中のゲーム分析をしてきたPlayFabが大進化!一緒に裏側の最新データ探索の仕組みを覗いてみよう
Preview: 世界中のゲーム分析をしてきたPlayFabが大進化!一緒に裏側の最新データ探索の仕組みを覗いてみようPreview: 世界中のゲーム分析をしてきたPlayFabが大進化!一緒に裏側の最新データ探索の仕組みを覗いてみよう
Preview: 世界中のゲーム分析をしてきたPlayFabが大進化!一緒に裏側の最新データ探索の仕組みを覗いてみよう
 
Introduction of Oracle Database Architecture
Introduction of Oracle Database ArchitectureIntroduction of Oracle Database Architecture
Introduction of Oracle Database Architecture
 

More from Kaito Tonooka

SCSK_Vertica_MotionBoard.pdf
SCSK_Vertica_MotionBoard.pdfSCSK_Vertica_MotionBoard.pdf
SCSK_Vertica_MotionBoard.pdfKaito Tonooka
 
Vertica Brochure_2022April1_v4.pdf
Vertica Brochure_2022April1_v4.pdfVertica Brochure_2022April1_v4.pdf
Vertica Brochure_2022April1_v4.pdfKaito Tonooka
 
Azure ベンチマーク 2021_june19
Azure ベンチマーク 2021_june19Azure ベンチマーク 2021_june19
Azure ベンチマーク 2021_june19Kaito Tonooka
 
01 shang ji_puroziekushiyon_she_ji_
01 shang ji_puroziekushiyon_she_ji_01 shang ji_puroziekushiyon_she_ji_
01 shang ji_puroziekushiyon_she_ji_Kaito Tonooka
 
Apuri she ji_gaido_teburushe_ji__v1.0
Apuri she ji_gaido_teburushe_ji__v1.0Apuri she ji_gaido_teburushe_ji__v1.0
Apuri she ji_gaido_teburushe_ji__v1.0Kaito Tonooka
 
Apuri she ji_gaido_detarodoshe_ji__v1.1
Apuri she ji_gaido_detarodoshe_ji__v1.1Apuri she ji_gaido_detarodoshe_ji__v1.1
Apuri she ji_gaido_detarodoshe_ji__v1.1Kaito Tonooka
 
Apuri she ji_gaido_d_bmentenansushe_ji__v1.0
Apuri she ji_gaido_d_bmentenansushe_ji__v1.0Apuri she ji_gaido_d_bmentenansushe_ji__v1.0
Apuri she ji_gaido_d_bmentenansushe_ji__v1.0Kaito Tonooka
 
Apuri she ji_gaido_kuraiantojie_sok_she_ji__v1.0
Apuri she ji_gaido_kuraiantojie_sok_she_ji__v1.0Apuri she ji_gaido_kuraiantojie_sok_she_ji__v1.0
Apuri she ji_gaido_kuraiantojie_sok_she_ji__v1.0Kaito Tonooka
 
Apuri she ji_gaido_puroziekushiyonshe_ji__v1.0
Apuri she ji_gaido_puroziekushiyonshe_ji__v1.0Apuri she ji_gaido_puroziekushiyonshe_ji__v1.0
Apuri she ji_gaido_puroziekushiyonshe_ji__v1.0Kaito Tonooka
 
Apuri she ji_gaido_detaxue_chu_she_ji__v1.2
Apuri she ji_gaido_detaxue_chu_she_ji__v1.2Apuri she ji_gaido_detaxue_chu_she_ji__v1.2
Apuri she ji_gaido_detaxue_chu_she_ji__v1.2Kaito Tonooka
 
Risosu guan li_noshi_zu_mitobesutopurakuteisu_v1
Risosu guan li_noshi_zu_mitobesutopurakuteisu_v1Risosu guan li_noshi_zu_mitobesutopurakuteisu_v1
Risosu guan li_noshi_zu_mitobesutopurakuteisu_v1Kaito Tonooka
 
Apuri she ji_gaido_detaekusupotoshe_ji__v1.0
Apuri she ji_gaido_detaekusupotoshe_ji__v1.0Apuri she ji_gaido_detaekusupotoshe_ji__v1.0
Apuri she ji_gaido_detaekusupotoshe_ji__v1.0Kaito Tonooka
 
02 kueri zui_shi_hua_notamenopuroziekushiyonshe_ji_
02 kueri zui_shi_hua_notamenopuroziekushiyonshe_ji_02 kueri zui_shi_hua_notamenopuroziekushiyonshe_ji_
02 kueri zui_shi_hua_notamenopuroziekushiyonshe_ji_Kaito Tonooka
 
Vertica 10 カタログ 2020年版
Vertica 10 カタログ 2020年版Vertica 10 カタログ 2020年版
Vertica 10 カタログ 2020年版Kaito Tonooka
 
Vertica eonモードの活用シーン
Vertica eonモードの活用シーンVertica eonモードの活用シーン
Vertica eonモードの活用シーンKaito Tonooka
 

More from Kaito Tonooka (15)

SCSK_Vertica_MotionBoard.pdf
SCSK_Vertica_MotionBoard.pdfSCSK_Vertica_MotionBoard.pdf
SCSK_Vertica_MotionBoard.pdf
 
Vertica Brochure_2022April1_v4.pdf
Vertica Brochure_2022April1_v4.pdfVertica Brochure_2022April1_v4.pdf
Vertica Brochure_2022April1_v4.pdf
 
Azure ベンチマーク 2021_june19
Azure ベンチマーク 2021_june19Azure ベンチマーク 2021_june19
Azure ベンチマーク 2021_june19
 
01 shang ji_puroziekushiyon_she_ji_
01 shang ji_puroziekushiyon_she_ji_01 shang ji_puroziekushiyon_she_ji_
01 shang ji_puroziekushiyon_she_ji_
 
Apuri she ji_gaido_teburushe_ji__v1.0
Apuri she ji_gaido_teburushe_ji__v1.0Apuri she ji_gaido_teburushe_ji__v1.0
Apuri she ji_gaido_teburushe_ji__v1.0
 
Apuri she ji_gaido_detarodoshe_ji__v1.1
Apuri she ji_gaido_detarodoshe_ji__v1.1Apuri she ji_gaido_detarodoshe_ji__v1.1
Apuri she ji_gaido_detarodoshe_ji__v1.1
 
Apuri she ji_gaido_d_bmentenansushe_ji__v1.0
Apuri she ji_gaido_d_bmentenansushe_ji__v1.0Apuri she ji_gaido_d_bmentenansushe_ji__v1.0
Apuri she ji_gaido_d_bmentenansushe_ji__v1.0
 
Apuri she ji_gaido_kuraiantojie_sok_she_ji__v1.0
Apuri she ji_gaido_kuraiantojie_sok_she_ji__v1.0Apuri she ji_gaido_kuraiantojie_sok_she_ji__v1.0
Apuri she ji_gaido_kuraiantojie_sok_she_ji__v1.0
 
Apuri she ji_gaido_puroziekushiyonshe_ji__v1.0
Apuri she ji_gaido_puroziekushiyonshe_ji__v1.0Apuri she ji_gaido_puroziekushiyonshe_ji__v1.0
Apuri she ji_gaido_puroziekushiyonshe_ji__v1.0
 
Apuri she ji_gaido_detaxue_chu_she_ji__v1.2
Apuri she ji_gaido_detaxue_chu_she_ji__v1.2Apuri she ji_gaido_detaxue_chu_she_ji__v1.2
Apuri she ji_gaido_detaxue_chu_she_ji__v1.2
 
Risosu guan li_noshi_zu_mitobesutopurakuteisu_v1
Risosu guan li_noshi_zu_mitobesutopurakuteisu_v1Risosu guan li_noshi_zu_mitobesutopurakuteisu_v1
Risosu guan li_noshi_zu_mitobesutopurakuteisu_v1
 
Apuri she ji_gaido_detaekusupotoshe_ji__v1.0
Apuri she ji_gaido_detaekusupotoshe_ji__v1.0Apuri she ji_gaido_detaekusupotoshe_ji__v1.0
Apuri she ji_gaido_detaekusupotoshe_ji__v1.0
 
02 kueri zui_shi_hua_notamenopuroziekushiyonshe_ji_
02 kueri zui_shi_hua_notamenopuroziekushiyonshe_ji_02 kueri zui_shi_hua_notamenopuroziekushiyonshe_ji_
02 kueri zui_shi_hua_notamenopuroziekushiyonshe_ji_
 
Vertica 10 カタログ 2020年版
Vertica 10 カタログ 2020年版Vertica 10 カタログ 2020年版
Vertica 10 カタログ 2020年版
 
Vertica eonモードの活用シーン
Vertica eonモードの活用シーンVertica eonモードの活用シーン
Vertica eonモードの活用シーン
 

03 kueripahuomansuchiyuninguno shou_fa_

  • 2. 本章の概要 – クエリの解析方法の概要 – クエリのプロファイル – 実行計画 – 統計情報 – カウンター – イベントタイプ – 追加のシステムテーブル
  • 4. クエリの解析方法 4 クエリの プロファイル • トランザクションID • ステートメントID • リソース使用率 実行計画 • プロジェクション • パスID • データの再配布 統計情報 カウンター • 実行時間 • ファイルのハンドル数、 生成された行、等 • 統計情報が無い、 もしくは、古いこと をトリガ イベントタイプ追加の テーブル • ユーザー情報 • クエリの実行時間 • チューニングの推奨 事項 • 統計情報がない • Join や Group By のスピル
  • 5. システムテーブル – 標準システムテーブルは、データベース内の様々な特徴と機能を監視 SELECT table_name, table_description FROM system_tables ORDER BY table_name; – 追加のデータコレクターテーブルは、データベースの構成要素の様々な特徴を監視 SELECT table_name, component, description FROM data_collector ORDER BY table_name; – ユーザーは、システムテーブルと内容に対する SELECT 権限を持つ必要あり – dbadmin 権限の一部 5
  • 6. データ保持ポリシーの確認 – 関数 GET_DATA_COLLECTOR_POLICY() を使って、設定を確認 SELECT GET_DATA_COLLECTOR_POLICY('QueryExecutions'); GET_DATA_COLLECTOR_POLICY ---------------------------------------------- 1000KB kept in memory, 20000KB kept on disk. (1 row) 6
  • 7. データ保持ポリシーの変更 – 関数 SET_DATA_COLLECTOR_POLICY() を使って、全ノード上のコンポーネントの保持ポリシーを設定 SELECT SET_DATA_COLLECTOR_POLICY('QueryExecutions', 2000, 40000); SET_DATA_COLLECTOR_POLICY ---------------------------------------------- SET (1 row) SELECT GET_DATA_COLLECTOR_POLICY('QueryExecutions'); GET_DATA_COLLECTOR_POLICY ---------------------------------------------- 2000KB kept in memory, 40000KB kept on disk. (1 row) 7
  • 8. データコレクターテーブルの消去 – 関数 CLEAR_DATA_COLLECTOR() を使って、データコレクターテーブルのメモリ、ディスク上のレコードを消去 SELECT CLEAR_DATA_COLLECTOR('QueryExecutions'); CLEAR_DATA_COLLECTOR ---------------------------------------------- CLEAR (1 row) SELECT CLEAR_DATA_COLLECTOR(); CLEAR_DATA_COLLECTOR ---------------------------------------------- CLEAR (1 row) 8
  • 10. クエリの解析方法 10 クエリの プロファイル • トランザクションID • ステートメントID • リソース使用率 実行計画 • プロジェクション • パスID • データの再配布 統計情報 カウンター • 実行時間 • ファイルのハンドル数、 生成された行、等 • 統計情報が無い、 もしくは、古いこと をトリガ イベントタイプ追加の テーブル • ユーザー情報 • クエリの実行時間 • チューニングの推奨 事項 • 統計情報がない • Join や Group By のスピル
  • 11. クエリプロファイルの生成 – クエリの前に PROFILE をつけることにより、クエリパフォーマンス分析のために使える情報が得られる 11 PROFILE SELECT order_number,date_ordered FROM store.store_orders_fact orders WHERE orders.store_key IN ( SELECT store_key FROM store.store_dimension WHERE store_state = 'MA') AND orders.vendor_key NOT IN ( SELECT vendor_key FROM public.vendor_dimension WHERE vendor_state = 'MA') AND date_ordered < '2012-03-01';
  • 12. プロファイルの結果 12 NOTICE 4788: Statement is being profiled. HINT: SELECT * FROM v_monitor.execution_engine_profiles WHERE transaction_id = 45035996273738674 AND statement_id = 15; NOTICE 3557: Initiator memory for query: [on pool general: 732615 KB, minimum: 147104 KB] NOTICE 5077: Total memory required by query: [732615 KB] order_number | date_ordered --------------+-------------- 292437 | 2012-01-01 240145 | 2012-01-01 234175 | 2012-01-02 27987 | 2012-01-02 47916 | 2012-01-02 8588 | 2012-01-01 252130 | 2012-01-02 213721 | 2012-01-02 265128 | 2012-01-02
  • 13. クエリの出力をリダイレクト 13 => o /dev/null => PROFILE SELECT order_number,date_ordered FROM store.store_orders_fact; NOTICE 4788: Statement is being profiled HINT: Select * from v_monitor.execution_engine_profiles where transaction_id=45035996273710140 and statement_id=28; NOTICE 3557: Initiator memory for query: [on pool general: 6816 KB, minimum: 6816 KB] NOTICE 5077: Total memory required by query: [6816 KB] => o
  • 16. プロファイリングの管理 – 全ノードにおいて、全セッションに対するプロファイリングを有効化/無効化 SELECT SET_CONFIG_PARAMETER('[global_profiling_type]',[1/0]); – プロファイリングのタイプ – session—基本的なセッションのパラメーターとロックタイムアウトのデータのプロファイリング – ee—各クエリの実行に関する情報をプロファイリング – query—クエリ文やクエリ実行時間のような実行したクエリに関する一般的な情報のプロファイリング – プロファイリングのデータを消去 SELECT CLEAR_PROFILING('[type_of_profiling]'); 16
  • 17. プロファイル結果に対する対応 プロファイルで、過度のメモリが使われていることが判明した場合 – データセットのサイズを最小化するために述語を使用 –フィルタ、サブクエリの使用、 RLE エンコーディングの使用の検討 – メモリのスピルの回避 –データセットの最小化 –サブクエリの使用 –実行計画でソートを遅らせる –ノードあるいは使用されているリソースプールへのメモリ追加 17
  • 19. クエリの解析方法 19 クエリの プロファイル • トランザクションID • ステートメントID • リソース使用率 実行計画 • プロジェクション • パスID • データの再配布 統計情報 カウンター • 実行時間 • ファイルのハンドル数、 生成された行、等 • 統計情報が無い、 もしくは、古いこと をトリガ イベントタイプ追加の テーブル • ユーザー情報 • クエリの実行時間 • チューニングの推奨 事項 • 統計情報がない • Join や Group By のスピル
  • 20. 実行計画の生成 – クエリの前に EXPLAIN をつけることにより、オプティマイザのクエリプランの実行ストラテジーが得られる – オプティマイザが実行可能なプランを評価し、コストに基づいて最良な選択肢を返す 20 EXPLAIN SELECT order_number,date_ordered FROM store.store_orders_fact orders WHERE orders.store_key IN ( SELECT store_key FROM store.store_dimension WHERE store_state = 'MA') AND orders.vendor_key NOT IN ( SELECT vendor_key FROM public.vendor_dimension WHERE vendor_state = 'MA') AND date_ordered < '2012-03-01';
  • 22. GraphViz – 「BASE QUERY PLAN (GraphVizフォーマット)」データを新規の GraphViz ドキュメントにコピー – 下記ページからGraphVizをダウンロード www.graphviz.org – 有向グラフを svg 形式で出力し、インターネットブラウザで表示 – 有向グラフをズームしたり、左右に回転することが可能 22
  • 23. 実行計画の結果:プロジェクション 23 Access Path: +-JOIN HASH [Semi] [Cost: 1K, Rows: 75K (625 RLE)] (PATH ID: 1) | Join Cond: (orders.store_key = VAL(2)) | Materialize at Input: orders.store_key | Materialize at Output: orders.order_number, orders.date_ordered | +-- Outer -> JOIN HASH [Anti][NotInAnti] [Cost: 343, Rows: 150K (1K RLE)] (PATH ID: 2) | | Join Cond: (orders.vendor_key = VAL(3)) | | +-- Outer -> STORAGE ACCESS for orders [Cost: 147, Rows: 300K (2K RLE)] (PATH ID: 3) | | | Projection: store.store_orders_fact_DBD_13_rep_VMartDesign_node0001 | | | Materialize: orders.vendor_key | | | Filter: (orders.date_ordered < '2012-03-01'::date) | | | Runtime Filter: (SIP1(HashJoin): orders.store_key) | | +-- Inner -> SELECT [Cost: 20, Rows: 3] (PATH ID: 4) | | | +---> STORAGE ACCESS for vendor_dimension [Cost: 20, Rows: 3] (PATH ID: 5) | | | | Projection: public.vendor_dimension_DBD_6_rep_VMartDesign_node0001 | | | | Materialize: vendor_dimension.vendor_key | | | | Filter: (vendor_dimension.vendor_state = 'MA') | +-- Inner -> SELECT [Cost: 21, Rows: 16] (PATH ID: 6) | | +---> STORAGE ACCESS for store_dimension [Cost: 21, Rows: 16] (PATH ID: 7) | | | Projection: store.store_dimension_DBD_11_rep_VMartDesign_node0001 | | | Materialize: store_dimension.store_key | | | Filter: (store_dimension.store_state = 'MA')
  • 24. 実行計画の結果:オペレーションタイプ 24 Access Path: +-JOIN HASH [Semi] [Cost: 1K, Rows: 75K (625 RLE)] (PATH ID: 1) | Join Cond: (orders.store_key = VAL(2)) | Materialize at Input: orders.store_key | Materialize at Output: orders.order_number, orders.date_ordered | +-- Outer -> JOIN HASH [Anti][NotInAnti] [Cost: 343, Rows: 150K (1K RLE)] (PATH ID: 2) | | Join Cond: (orders.vendor_key = VAL(3)) | | +-- Outer -> STORAGE ACCESS for orders [Cost: 147, Rows: 300K (2K RLE)] (PATH ID: 3) | | | Projection: store.store_orders_fact_DBD_13_rep_VMartDesign_node0001 | | | Materialize: orders.vendor_key | | | Filter: (orders.date_ordered < '2012-03-01'::date) | | | Runtime Filter: (SIP1(HashJoin): orders.store_key) | | +-- Inner -> SELECT [Cost: 20, Rows: 3] (PATH ID: 4) | | | +---> STORAGE ACCESS for vendor_dimension [Cost: 20, Rows: 3] (PATH ID: 5) | | | | Projection: public.vendor_dimension_DBD_6_rep_VMartDesign_node0001 | | | | Materialize: vendor_dimension.vendor_key | | | | Filter: (vendor_dimension.vendor_state = 'MA') | +-- Inner -> SELECT [Cost: 21, Rows: 16] (PATH ID: 6) | | +---> STORAGE ACCESS for store_dimension [Cost: 21, Rows: 16] (PATH ID: 7) | | | Projection: store.store_dimension_DBD_11_rep_VMartDesign_node0001 | | | Materialize: store_dimension.store_key | | | Filter: (store_dimension.store_state = 'MA')
  • 25. 実行計画の結果:フィルター 25 Access Path: +-JOIN HASH [Semi] [Cost: 1K, Rows: 75K (625 RLE)] (PATH ID: 1) | Join Cond: (orders.store_key = VAL(2)) | Materialize at Input: orders.store_key | Materialize at Output: orders.order_number, orders.date_ordered | +-- Outer -> JOIN HASH [Anti][NotInAnti] [Cost: 343, Rows: 150K (1K RLE)] (PATH ID: 2) | | Join Cond: (orders.vendor_key = VAL(3)) | | +-- Outer -> STORAGE ACCESS for orders [Cost: 147, Rows: 300K (2K RLE)] (PATH ID: 3) | | | Projection: store.store_orders_fact_DBD_13_rep_VMartDesign_node0001 | | | Materialize: orders.vendor_key | | | Filter: (orders.date_ordered < '2012-03-01'::date) | | | Runtime Filter: (SIP1(HashJoin): orders.store_key) | | +-- Inner -> SELECT [Cost: 20, Rows: 3] (PATH ID: 4) | | | +---> STORAGE ACCESS for vendor_dimension [Cost: 20, Rows: 3] (PATH ID: 5) | | | | Projection: public.vendor_dimension_DBD_6_rep_VMartDesign_node0001 | | | | Materialize: vendor_dimension.vendor_key | | | | Filter: (vendor_dimension.vendor_state = 'MA') | +-- Inner -> SELECT [Cost: 21, Rows: 16] (PATH ID: 6) | | +---> STORAGE ACCESS for store_dimension [Cost: 21, Rows: 16] (PATH ID: 7) | | | Projection: store.store_dimension_DBD_11_rep_VMartDesign_node0001 | | | Materialize: store_dimension.store_key | | | Filter: (store_dimension.store_state = 'MA')
  • 26. 実行計画の結果:コスト 26 Access Path: +-JOIN HASH [Semi] [Cost: 1K, Rows: 75K (625 RLE)] (PATH ID: 1) | Join Cond: (orders.store_key = VAL(2)) | Materialize at Input: orders.store_key | Materialize at Output: orders.order_number, orders.date_ordered | +-- Outer -> JOIN HASH [Anti][NotInAnti] [Cost: 343, Rows: 150K (1K RLE)] (PATH ID: 2) | | Join Cond: (orders.vendor_key = VAL(3)) | | +-- Outer -> STORAGE ACCESS for orders [Cost: 147, Rows: 300K (2K RLE)] (PATH ID: 3) | | | Projection: store.store_orders_fact_DBD_13_rep_VMartDesign_node0001 | | | Materialize: orders.vendor_key | | | Filter: (orders.date_ordered < '2012-03-01'::date) | | | Runtime Filter: (SIP1(HashJoin): orders.store_key) | | +-- Inner -> SELECT [Cost: 20, Rows: 3] (PATH ID: 4) | | | +---> STORAGE ACCESS for vendor_dimension [Cost: 20, Rows: 3] (PATH ID: 5) | | | | Projection: public.vendor_dimension_DBD_6_rep_VMartDesign_node0001 | | | | Materialize: vendor_dimension.vendor_key | | | | Filter: (vendor_dimension.vendor_state = 'MA') | +-- Inner -> SELECT [Cost: 21, Rows: 16] (PATH ID: 6) | | +---> STORAGE ACCESS for store_dimension [Cost: 21, Rows: 16] (PATH ID: 7) | | | Projection: store.store_dimension_DBD_11_rep_VMartDesign_node0001 | | | Materialize: store_dimension.store_key | | | Filter: (store_dimension.store_state = 'MA')
  • 27. 実行計画の結果:パスID 27 Access Path: +-JOIN HASH [Semi] [Cost: 1K, Rows: 75K (625 RLE)] (PATH ID: 1) | Join Cond: (orders.store_key = VAL(2)) | Materialize at Input: orders.store_key | Materialize at Output: orders.order_number, orders.date_ordered | +-- Outer -> JOIN HASH [Anti][NotInAnti] [Cost: 343, Rows: 150K (1K RLE)] (PATH ID: 2) | | Join Cond: (orders.vendor_key = VAL(3)) | | +-- Outer -> STORAGE ACCESS for orders [Cost: 147, Rows: 300K (2K RLE)] (PATH ID: 3) | | | Projection: store.store_orders_fact_DBD_13_rep_VMartDesign_node0001 | | | Materialize: orders.vendor_key | | | Filter: (orders.date_ordered < '2012-03-01'::date) | | | Runtime Filter: (SIP1(HashJoin): orders.store_key) | | +-- Inner -> SELECT [Cost: 20, Rows: 3] (PATH ID: 4) | | | +---> STORAGE ACCESS for vendor_dimension [Cost: 20, Rows: 3] (PATH ID: 5) | | | | Projection: public.vendor_dimension_DBD_6_rep_VMartDesign_node0001 | | | | Materialize: vendor_dimension.vendor_key | | | | Filter: (vendor_dimension.vendor_state = 'MA') | +-- Inner -> SELECT [Cost: 21, Rows: 16] (PATH ID: 6) | | +---> STORAGE ACCESS for store_dimension [Cost: 21, Rows: 16] (PATH ID: 7) | | | Projection: store.store_dimension_DBD_11_rep_VMartDesign_node0001 | | | Materialize: store_dimension.store_key | | | Filter: (store_dimension.store_state = 'MA')
  • 28. データの再配布 – 分散されたプロジェクションのデータだけが、 RESEGMENT あるいは BROADCAST の対象 – 結合がローカルで処理されないため、実行時にデータを再配布しなければならずネットワーク負荷が高くなる – プロジェクションのデータは、操作されて、クエリのためにデータ編成される必要がある 28
  • 29. RESEGMENT – 分散化されたプロジェクションのデータは、クエリ実行中に、 Identically Segmented プロジェクションに再分散さ れ、全ノードに分散される必要あり EXPLAIN SELECT CD.annual_income,OSI.sale_date_key FROM online_sales.online_sales_fact OSI FULL OUTER JOIN customer_dimension CD ON CD.customer_key = OSI.customer_key; Access Path: +-JOIN HASH [FullOuter] [Cost: 18K, Rows: 5M] (PATH ID: 1) Outer (RESEGMENT) Inner (FILTER) | Join Cond: (CD.customer_key = OSI.customer_key) | Execute on: All Nodes | +-- Outer -> STORAGE ACCESS for OSI [Cost: 3K, Rows: 5M] (PATH ID: 2) | | projection: online_sales.online_sales_fact_DBD_12_seg_vmartdb_design | | Materialize: OSI.sale_date_key, OSI.customer_key | | Execute on: All Nodes | +-- Inner -> STORAGE ACCESS for CD [Cost: 264, Rows: 50K] (PATH ID: 3) | | projection: public.customer_dimension_DBD_1_rep_vmartdb_design_node0001 | | Materialize: CD.annual_income, CD.customer_key | | Execute on: All Nodes
  • 30. BROADCAST – 分散化されたプロジェクションのデータは、クエリ実行中に、複製され、全ノードに分散される必要あり 30 EXPLAIN SELECT * FROM T1 LEFT JOIN T2 ON T1.a > T2.y; Access Path: +-JOIN HASH [LeftOuter][Cost:40K,Rows:10K(NO STATISTICS)](PATH ID: 1) Inner (BROADCAST) | Join Filter: (T1.a > T2.y) | Materialize at Output: T1.b | Execute on: All Nodes | +--Outer->STORAGE ACCESS for T1[Cost:151,Rows:10K(NO STATISTICS)](PATH ID:2) | | projection: public.T1_b0 | | Materialize: T1.a | | Execute on: All Nodes | +--Inner->STORAGE ACCESS for T2[Cost:302,Rows:10K(NO STATISTICS)](PATH ID:3) | | projection: public.T2_b0 | | Materialize: T2.x, T2.y | | Execute on: All Nodes
  • 31. 実行計画のプロファイル 31 SELECT path_id, path_line_index, running_time, memory_allocated_bytes, read_from_disk_bytes, path_line FROM query_plan_profiles WHERE transaction_id = 45035996273738674 and statement_id = 15 ORDER BY path_id, path_line_index; -[ RECORD 1 ]----------+-------------------------------------------------------- path_id | 2 path_line_index | 1 running_time | 00:00:00.316575 memory_allocated_bytes | 46802096 read_from_disk_bytes | path_line | +-GROUPBY HASH (SORT OUTPUT) (LOCAL RESEGMENT GROUPS) [Cost: 81K, Rows: 2M (NO STATISTICS)] (PATH ID: 2) -[ RECORD 2 ]----------+--------------------------------------------------------- path_id | 8 path_line_index | 1 running_time | 00:00:00.000461 memory_allocated_bytes | 570104 read_from_disk_bytes | 0 path_line | +---> STORAGE ACCESS for store_dimension [Cost: 35, Rows: 249 (NO STATISTICS)] (PATH ID: 8)
  • 32. プロジェクションの DDL の出力 – セグメンテーション句を決定するために、 JOIN 句に使われているプロジェクションの DDL を確認 – ファイルへの出力方法 SELECT EXPORT_OBJECTS ('[destination]','[schema.projectionName]'); – 画面上での表示方法 SELECT EXPORT_OBJECTS ('','[schema.projectionName]'); – 最適なセグメンテーションを提供するために、結合キーによって複製もしくは分散された新規プロジェクションを作 成 32
  • 33. 分散化されたデータサイズ –PROJECTION_STORAGE は、分散化されたデータサイズを表示 – 全ノード間で 均一に分散されていることを確認 – 最適なセグメンテーションを提供するために、結合キーによって複製もしくは分散された新規プロジェクションを作 成 33 SELECT node_name, projection_name, used_bytes FROM projection_storage WHERE projection_name ilike 'customer_dimension_DBD_1%' ORDER BY node_name; node_name | projection_name | used_bytes ----------------+-----------------------------------------+----------- vmartdb_node0001| customer_dimension_DBD_1_rep_PT_b0 | 5312725 vmartdb_node0002| customer_dimension_DBD_1_rep_PT_b0 | 1681571 vmartdb_node0003| customer_dimension_DBD_1_rep_PT_b0 | 1929766
  • 35. クエリの解析方法 35 クエリの プロファイル • トランザクションID • ステートメントID • リソース使用率 実行計画 • プロジェクション • パスID • データの再配布 統計情報 カウンター • 実行時間 • ファイルのハンドル数、 生成された行、等 • 統計情報が無い、 もしくは、古いこと をトリガ イベントタイプ追加の テーブル • ユーザー情報 • クエリの実行時間 • チューニングの推奨 事項 • 統計情報がない • Join や Group By のスピル
  • 36. 統計情報 • データベース上全体あるいはテーブル毎に統計情報を更新することが、解析に時間がかかってプロジェクション の修正が必要となる前に、簡単な解決策となりうる – NO STATISTICS は、クエリの述語のヒストグラムが使用不可であることを示す – PREDICATE VALUE OUT-OF-RANGE は、クエリの述語がヒストグラムの範囲外であることを示す 36 | | +-- Outer -> STORAGE ACCESS for fact [Cost: 604, Rows: 10K (NO STATISTICS)] | | +-- Outer -> STORAGE ACCESS for fact [Cost: 35, Rows: 1 (PREDICATE VALUE OUT-OF-RANGE)]
  • 37. 統計情報の更新:ANALYZE_STATISTICS – 大量データが追加あるいは変更された、もしくは、新規テーブルが追加された場合、手動で統計情報を生成 – データベース上の全テーブルに対して実行する場合 SELECT ANALYZE_STATISTICS(''); – 特定のデータベースオブジェクトに対して実行する場合 SELECT ANALYZE_STATISTICS ('[[db-name.]schema.] table [.column-name]'); – データの 10%(固定)を読み込み – 0 は成功の意 – エラーが返ってきた場合は、 Vertica.log を参照 37
  • 38. 統計情報の更新:ANALYZE_HISTOGRAM – 可変量のデータを読み込み可能 – サンプルに含まれるデータの比率を指定 – データベース上の全テーブルに対して実行する場合 SELECT ANALYZE_HISTOGRAM(''[,(percent)]); – 特定のデータベースオブジェクトに対して実行する場合 SELECT ANALYZE_HISTOGRAM('[[db-name.]schema.]table [.column-name]' [,(percent)]); 38
  • 39. プロジェクションの統計情報の確認 – システムテーブル PROJECTIONS により、各プロジェクションで統計情報が取得されているかどうかが確認可能 39 SELECT projection_name, has_statistics FROM projections; -[ RECORD 1 ]---------+------------------------------------ projection_name | call_center_dimension_DBD _8_rep_VMartDesign_node0001 has_statistics | t -[ RECORD 2 ]---------+------------------------------------ projection_name | online_page_dimension_DBD _7_rep_VMartDesign_node0001 has_statistics | f
  • 40. 列の統計情報の確認 – システムテーブル PROJECTION_COLUMNS により、各列において統計情報更新が実行された最終時刻を確認可 能 40 SELECT projection_name, projection_column_name, statistics_type, statistics_updated_timestamp FROM projection_columns; -[ RECORD 1 ]-----------------+--------------------------- projection_name | allsales_DBD_16_rep_ VMartDesign_node0001 projection_column_name | state statistics_type | FULL statistics_updated_timestamp | 2013-08-13 11:12:37.025161-04
  • 42. クエリの解析方法 42 クエリの プロファイル • トランザクションID • ステートメントID • リソース使用率 実行計画 • プロジェクション • パスID • データの再配布 統計情報 カウンター • 実行時間 • ファイルのハンドル数、 生成された行、等 • 統計情報が無い、 もしくは、古いこと をトリガ イベントタイプ追加の テーブル • ユーザー情報 • クエリの実行時間 • チューニングの推奨 事項 • 統計情報がない • Join や Group By のスピル
  • 43. 実行エンジン – クエリを実行 – クエリ実行に関するプロファイリング情報を提供 – クエリプランの品質問題 – プロジェクション設計上の問題 – データの再分散もしくはブロードキャスト – 各オペレーターに割り当てられるメモリ量 – 各オペレーターで実行するスレッド数 – クエリの実行期間にわたって、それぞれのポイントで、データが各オペレーターにどのようにして流れていったのか 43
  • 44. 最も時間がかかっているオペレーターの特定 44 SELECT * FROM execution_engine_profiles WHERE transaction_id = 45035996273738674 and statement_id = 15 and counter_name ilike '%execution%' ORDER BY counter_value DESC; -[ RECORD 1 ]------+------------------------------- node_name | v_vmartdb_node0001 user_id | 45035996273704962 user_name | dbadmin session_id | verticaTraining64bi-3853:0xfc6 transaction_id | 45035996273738674 statement_id | 15 plan_id | 408577251772803 operator_name | Scan operator_id | 6 baseplan_id | 6 path_id | 3 localplan_id | 6 activity_id | 1000 resource_id | -1 counter_name | execution time (us) counter_tag | counter_value | 11824 is_executing | f
  • 45. 実行エンジンでよく使われるカウンター – execution time (us) – CPU の処理時間(マイクロ秒) – file handles – rows produced – total merge phases – 完全にソートされたデータを作成するために実行完了されなければならないソートのマージフェーズ数の合計 – completed merge phases – ソートが既に完了されたマージフェーズ数 – current size of temp files (bytes) – エンコード・圧縮された一時データのサイズ 45
  • 46. カウンターの集計(1/2) 46 SELECT node_name, operator_name, operator_id, sum(DECODE(counter_name, 'memory allocated (bytes)', counter_value, NULL)) AS 'memory allocated (bytes)', sum(DECODE(counter_name, 'memory reserved (bytes)', counter_value, NULL)) AS 'memory reserved (bytes)' FROM execution_engine_profiles WHERE transaction_id = 45035996273706504 and statement_id = 4 GROUP BY node_name, operator_name, operator_id ORDER BY operator_id desc, node_name, operator_name;
  • 47. カウンターの集計(2/2) 47 node_name | operator_name | operator_id | memory allocated (bytes)| memory reserved (bytes) ------------------------------+----------------------+------------------+-----------------------------------+----------------------------------- v_vmartdb_node0001 | Scan | 10 | 529528 | 0 v_vmartdb_node0001 | StorageUnion | 9 | 140104 | 2424832 v_vmartdb_node0001 | Scan | 8 | 537544 | 0 v_vmartdb_node0001 | StorageUnion | 7 | 139976 | 2424832 v_vmartdb_node0001 | Scan | 6 | 1031224 | 0 v_vmartdb_node0001 | Join | 5 | 2535264 | 1097728 v_vmartdb_node0001 | Join | 4 | 2949144 | 1097728 v_vmartdb_node0001 | ExprEval | 3 | 3520 | 196608 v_vmartdb_node0001 | StorageUnion | 2 | 74992 | 4784128 v_vmartdb_node0001 | NewEENode | 1 | 65904 | 196608 v_vmartdb_node0001 | Root | 0 | 0 | 0 (10 rows)
  • 48. MC で見る実行エンジンのプロファイルデータ(1/3) – MC の Explain タブでプロファイルを実行した後、 View Execution Events をクリック 48
  • 52. クエリの解析方法 52 クエリの プロファイル • トランザクションID • ステートメントID • リソース使用率 実行計画 • プロジェクション • パスID • データの再配布 統計情報 カウンター • 実行時間 • ファイルのハンドル数、 生成された行、等 • 統計情報が無い、 もしくは、古いこと をトリガ イベントタイプ追加の テーブル • ユーザー情報 • クエリの実行時間 • チューニングの推奨 事項 • 統計情報がない • Join や Group By のスピル
  • 53. QUERY_EVENTS – 最適化 – クエリのプランや、最適化、実行イベントに関する情報を返す –QUERY_EVENTS の列 event_type から次の値を探す – PREDICATE OUTSIDE HISTOGRAM: オプティマイザが、ヒストグラム全体に対して不正確な述語を 検出 – NO HISTOGRAM: オプティマイザが、ヒストグラムを持たない列が述語に指定されていることを 検出 – MEMORY LIMIT HIT: オプティマイザが実行計画作成中に割り当てられたメモリを全て使用 – 特定されたトランザクションに対して、解決のために、列 event_description と列 suggested_action を確認 53
  • 54. オプティマイザの詳細情報 54 SELECT * FROM query_events WHERE transaction_id = 45035996273705062 AND statement_id = 2 and event_category = 'optimization'; -[ RECORD 1 ]------------+---------------------------------------------- event_timestamp | 2012-01-25 12:33:04.352453-05 node_name | v_vmart_schema_node0001 user_id | 45035996273704962 user_name | dbadmin session_id | verticaTraining64bi-7886:0x22 request_id | 30 transaction_id | 45035996273705062 statement_id | 2 event_category | OPTIMIZATION event_type | NO HISTOGRAM event_description | The optimizer encountered a predicate on a column for which it does not have a histogram object_id | 45035996273719954 event_details | No histogram for store.store_dimension.store_state suggested_action | analyze_statistics('store.store_dimension.store_state');
  • 55. QUERY_EVENTS – 実行 –QUERY_EVENTS の列 event_type で、次の値を探す – GROUP_BY_SPILLED – JOIN_SPILLED – RESEGMENTED_MANY_ROWS – 特定したトランザクションで、列 event_description と列 suggested_action の内容を解決 のために確認 55
  • 56. イベントの詳細情報 56 SELECT * FROM query_events WHERE transaction_id = 45035996273705062 AND statement_id = 2 and event_category = 'execution'; -[ RECORD 1 ]------------+---------------------------------------------- event_timestamp | 2012-01-25 12:33:04.352453-05 node_name | v_vmart_schema_node0001 user_id | 45035996273704962 user_name | dbadmin session_id | verticaTraining64bi-7886:0x22 request_id | 30 transaction_id | 45035996273705062 statement_id | 2 event_category | EXECUTION event_type | GROUP_BY_SPILLED event_description | GROUP BY key set did not fit in memory, using external sort grouping. object_id | event_details | suggested_action | Consider a sorted projection. Increase memory available to the plan
  • 58. クエリの解析方法 58 クエリの プロファイル • トランザクションID • ステートメントID • リソース使用率 実行計画 • プロジェクション • パスID • データの再配布 統計情報 カウンター • 実行時間 • ファイルのハンドル数、 生成された行、等 • 統計情報が無い、 もしくは、古いこと をトリガ イベントタイプ追加の テーブル • ユーザー情報 • クエリの実行時間 • チューニングの推奨 事項 • 統計情報がない • Join や Group By のスピル
  • 60. QUERY_PROFILES – クエリの実行ユーザー、実行時間、使用された追加メモリを確認 60 SELECT * FROM query_profiles WHERE transaction_id = 45035996273705062 AND statement_id = 2; -[ RECORD 1 ]------------+------------------------------ session_id | raster-s1-17956:0x1d transaction_id | 45035996273705062 statement_id | 2 node_name | v_vmartdb_node0001 query | SELECT * FROM store.store_dimension; query_search_path | "$user",public,v_catalog,v_monitor,v_internal projections_used | store_dimension_node0001 query_duration_us | 9647.000000 query_start_epoch | 429 query_start | 2010-10-07 12:46:24.370044-04 query_type | SELECT error_code | 0 user_name | accounts processed_row_count | 2023 reserved_extra_memory | 0 is_executing | f
  • 61. QUERY_METRICS – 各ノード上のセッション数、実行クエリ数をリスト 61 SELECT * FROM query_metrics; -[ RECORD 1 ]---------------+------------------- node_name | v_vmartdb_node01 active_user_session_count | 1 active_system_session_count | 2 total_user_session_count | 146 total_system_session_count | 6248 total_active_session_count | 3 total_session_count | 6250 running_query_count | 1 executed_query_count | 2319
  • 62. QUERY_REQUESTS – クエリの実行時刻と状態 62 SELECT * FROM query_requests; -[ RECORD 1 ]-------+------------------- node_name | v_vmart_a_node0001 user_name | dbadmin session_id | verticaTraining64bi-3183:0x1b67 request_id | 13 transaction_id | 45035996273735942 statement_id | 11 request_type | QUERY request | SELECT customer_region, customer_state, COUNT(customer_state) FROM customer_dimension GROUP BY customer_region, customer_state; request_label | search_path | "$user", public, v_catalog, v_monitor, v_internal memory_acquired_mb | 100 success | t error_count | start_timestamp | 2013-09-18 15:49:41.206783-04 end_timestamp | 2013-09-18 15:49:41.206869-04 request_duration_ms | 86 is_executing | f
  • 63. 本章のまとめ – クエリの解析方法の概要 – クエリのプロファイル – 実行計画 – 統計情報 – カウンター – イベントタイプ – 追加のシステムテーブル