• 検索結果がありません。

はじめに < 本 日 のテーマ> 超 高 速 データベース Hitachi Advanced Data Binder での SQLチューニング 方 法 を 情 報 の 取 得 から 問 題 点 を 見 つけて 対 策 するまでの 流 れと チューニング 事 例 をご 紹 介 いたします 本 資 料

N/A
N/A
Protected

Academic year: 2021

シェア "はじめに < 本 日 のテーマ> 超 高 速 データベース Hitachi Advanced Data Binder での SQLチューニング 方 法 を 情 報 の 取 得 から 問 題 点 を 見 つけて 対 策 するまでの 流 れと チューニング 事 例 をご 紹 介 いたします 本 資 料"

Copied!
32
0
0

読み込み中.... (全文を見る)

全文

(1)

db tech showcase 2015

株式会社 日立製作所 情報・通信システム社

ITプラットフォーム事業本部 サービスイノベーション統括本部 IT基盤ソリューション本部 DB部

2015/06/12

Hitachi Advanced Data Binder

実践SQLチューニング方法

(2)

はじめに

<本日のテーマ>

超高速データベース「Hitachi Advanced Data Binder」での

SQLチューニング方法を、情報の取得から問題点を見つけて対策 するまでの流れと、チューニング事例をご紹介いたします。

(3)

1. Hitachi Advanced Data Binderの概要

2. SQLチューニング方法の概要

3. チューニング事例

Contents

(4)

1. Hitachi Advanced Data Binderの概要

2. SQLチューニング方法の概要

3. チューニング事例

Contents

(5)

1.1 Hitachi Advanced Data Binderの概要

Hitachi Advanced Data Binder プラットフォーム

Hitachi Advanced Data Binder プラットフォーム

日立ラックサーバ 日立ストレージ

超高速データベースエンジン

□自社従来比100倍(*3)の検索性能を誇る、超高速データベースエンジン

Hitachi Advanced Data Binderを搭載。

□可用性の高い日立のサーバと高速ストレージをセット化。 (*1) 世界のトップを目指した先端的研究を推進することで、産業、安全保障等の分野における我が国の中長期的な国際的競争力、底力の強化を図るとともに、研究開発成果の 国民および社会への確かな還元を図ることを目的として創設された国の研究開発プログラム。 最先端研究開発支援プログラム(*1)において、国立大学法人東京大学が 推進している超高速データベースエンジンの研究開発(*2)の成果を利用して 日立が製品化したリレーショナルデータベースシステム。

(6)

1.2 Hitachi Advanced Data Binderプラットフォーム

高速データアクセス基盤

Hitachi Advanced Data Binder プラットフォーム

超高速データベースエンジン Hitachi Advanced Data Binder

(RDBMS) 日立サーバ 日立ストレージ BI ツール 業務 アプリケーション センサー 稼働ログ 売上 SNS 受発注 契約 データ ソース 収集 / 加工 多種データ 高速検索 価値を創造 大量データ DWH

Hitachi Advanced Data Binder PFはDWHの中核を支えるDBサーバです □ 大量データのローディング処理を高速化

□ 多種多様なデータ結合処理(JOIN)を高速化

JDBC/ODBC/CLI (SQLインタフェース)

(7)

1.2 Hitachi Advanced Data Binderの高速化技術

サーバ、ストレージの能力を最大限に使いきるソフトウェア技術。 DB検索(SQL)処理を並列実行単位(I/O単位)に自動分割し高多重で実行。 タスク割当 検索処理 I/O完了待ち ディスクI/O サーバ ストレージ 【従来方式】 :順序実行方式 【新方式】:非順序型実行原理(*2) 検索処理(μs) 同期I/O処理(ms) 【従来方式でのストレージアクセストレース】 【新方式でのストレージアクセストレース】 処理時間を大幅短縮 東京大学との超高速データベースエンジンの共同研究開発成果の製品化。 自社従来比約100倍(*1)のデータ検索性能。 顧客情報 注文情報 明細履歴情報 検索処理(μs) 同期I/O処理(ms) サーバ ストレージ

(8)

1.2 Hitachi Advanced Data Binderの高速化技術

非順序実行原理では、発行したI/Oを待たずに、次々にレコード処理を行うた め、並列度を高めやすい。レコード処理順序に依存しない集合演算や結合処 理が得意。

(9)

1. Hitachi Advanced Data Binderの概要

2. SQLチューニング方法の概要

3. チューニング事例

Contents

(10)

2.1 SQLチューニングの前に

画面のレスポンスが遅い・・・、こんな時にどうしますか? データベース BIサーバ 利用者: 画面のレスポンスが遅いなあ インデクスが効いていない? 検索量が多すぎる? etc・・・ DB管理者

(11)

2.1 SQLチューニングの前に

問題箇所の切り分け データベース BIサーバ 利用者: 画面のレスポンスが遅いなあ インデクスが効いていない? 検索量が多すぎる? etc・・・ DB管理者

まずは、

端末・BIサーバ・DBサーバのどこで処理時間が

かかっているかを切り分けます

⇒ BIサーバ、DBサーバのログからSQL発行時刻、処理時間、 要求元へのリタン時刻等をもとに時間のかかっている箇所 を調査します ⇒ DBサーバで処理時間がかかっていることを確認してから チューニングに着手します

(12)

SQLチューニングの基本的な流れ

2.2 SQLチューニングの流れ

対象SQLのアクセスパス(※)取得と アクセスパス観点の問題点の調査 チューニング対象SQLの特定 対策案の検討と検証 対象SQLの統計情報の取得と 統計情報観点の問題点の調査 要件クリア? Y N ※SQLの実行計画・実行プランを

(13)

タイムスタンプ AP_name SQL# SQL_type SQL時間[μ秒] フェッチ行数 DBエリア名 バッファ名 要求回数 バッファヒット率 read回数 write回数

2015/06/01 06:35:12 adbsql 1 SELECT 266,948 1 ADBDIC ##ADBOTHER#0000004096 8 100 0 0

2015/06/01 06:35:12 adbsql 1 SELECT ADBUIDX01 ADBUIDX01BUF 120,202 100 0 0

2015/06/01 06:35:25 adbsql 2 SELECT 112,899 1 ADBDIC ##ADBOTHER#0000004096 8 100 0 0

2015/06/01 06:35:25 adbsql 2 SELECT ADBUTBL01 ADBUTBL01BUF 75 100 0 0

2015/06/01 06:37:55 adbsql 3 SELECT 23,822,936 1 ADBDIC ##ADBOTHER#0000004096 16 100 0 0

2015/06/01 06:37:55 adbsql 3 SELECT ADBUIDX01 ADBUIDX01BUF 14,760,202 100 0 0

2015/06/01 06:37:55 adbsql 3 SELECT ADBUTBL01 ADBUTBL01BUF 14,520,000 100 0 0

チューニング対象SQLの特定 ⇒SQL処理時間を調査し、画面レスポンスとSQL処理時間を比較して、 レスポンスに影響しているSQLを特定します

2.2 SQLチューニングの流れ

<SQL処理時間の取得方法> HADBの統計解析コマンド(adbstat)でSQL文の統計情報を取得します HADBサーバ データベース adbstat -c sql -m '開始時刻','終了時刻' > log_adbstat_sql.csv DB管理者 ・・・ ・・・ ・・・ ・・・ ・・・ ・・・ ・・・

(14)

対象SQLのアクセスパスの取得と調査 ⇒対象SQLのアクセスパスを取得して、適切なインデクスが使われているか といった、アクセスパス観点の問題点を調査します

2.2 SQLチューニングの流れ

<ポイント> 以下のような点を調査します ・適切なインデクスが使用されているか HADBサーバ データベース adbsql -u ユーザID -p パスワード < SQL文テキスト.txt > log_adbsql.txt DB管理者 <アクセスパスの取得方法>

SQL実行コマンド(adbsql)のサブコマンド「#set opt report on type=all」で、 対象SQLのアクセスパスを取得します

#set opt report on type=all; select count(*) from T1 where C6='01'; SQL文テキスト.txt <<Tree View>> 1 QUERY : 1 2 SELECT STATEMENT 3 |-KEY SCAN(USER01.T1) 4 +-GROUPING <<Detail >> QUERY : 1 3 KEY SCAN(USER01.T1) INDEX NAME : T1_IDX03 INDEX TYPE : B-TREE

(15)

対象SQLの統計情報の取得と調査 ⇒対象SQLの統計情報を取得して、バッファへのアクセス要求回数や I/O回数といった、統計情報観点の問題点を調査します

2.2 SQLチューニングの流れ

<ポイント> <統計情報の取得方法(SQL処理時間の取得と同じ)> HADBの統計解析コマンド(adbstat)でSQL文の統計情報を取得します

タイムスタンプ AP_name SQL# SQL_type SQL時間[μ秒] フェッチ行数 DBエリア名 バッファ名 要求回数 バッファヒット率 read回数 write回数

2015/06/01 06:40:29 adbsql 4 SELECT 266,948 1 ADBDIC ##ADBOTHER#0000004096 8 100 0 0

2015/06/01 06:40:29 adbsql 4 SELECT ADBUIDX01 ADBUIDX01BUF 120,202 100 0 0

2015/06/01 06:41:07 adbsql 5 SELECT 112,899 1 ADBDIC ##ADBOTHER#0000004096 8 100 0 0

2015/06/01 06:41:07 adbsql 5 SELECT ADBUTBL01 ADBUTBL01BUF 75 100 0 0

2015/06/01 06:42:31 adbsql 6 SELECT 23,822,936 1 ADBDIC ##ADBOTHER#0000004096 16 100 0 0

2015/06/01 06:42:31 adbsql 6 SELECT ADBUIDX01 ADBUIDX01BUF 14,760,202 100 0 0

2015/06/01 06:42:31 adbsql 6 SELECT ADBUTBL01 ADBUTBL01BUF 14,520,000 100 0 0

HADBサーバ データベース adbstat -c sql -m '開始時刻','終了時刻' > log_adbstat_sql.csv DB管理者 ・・・ ・・・ ・・・

(16)

対策案の検討と検証 ⇒見つけた問題点の対策案を検討し、効果を検証します

2.2 SQLチューニングの流れ

<対策案の検討> 問題点によって対策方法は様々ですが、例えば以下のような方法があります。 ■ パラメタ設定の変更 ・バッファ面数の割当の変更・拡張 ・1SQLを処理する多重度の拡張 ■ 定義の変更 ・インデクスの構成列の追加、並び順の変更 ・インデクスの追加 ■ SQL文の書換え ・ジョインする順番の変更、ジョイン方式の変更 ・副問合せの書換え(ジョイン化) ・グループ化処理のタイミングの変更 対策したSQLを実行して、再度統計情報を取得・変更前と比較して 対策の効果を検証します。

(17)

1. Hitachi Advanced Data Binderの概要

2. SQLチューニング方法の概要

3. チューニング事例

Contents

(18)

3.1 事例1 -グループ化処理のタイミングー

4月分の売上集計するSQLで、名称を付加するためにマスタ表をジョインして いるが、処理時間がかかっている。改善するポイントがありますか? 1対1ジョインのはずなのに ずいぶん時間がかかるなあ? select U.大分類 , U.商品コード , SUM(U.金額) , max(S.商品名)

from 売上TBL U LEFT JOIN 商品TBL S on U.大分類=S.大分類

and U.商品コード=S.商品コード

where U.日付 between '2014/04/01' and '2014/04/30' and U.大分類 in ('01', '02', '03', '04)

(19)

3.1 事例1 -グループ化処理のタイミングー

<ポイント1>

検索の対象行数がどのくらいあるか、ざっくりと求めて、統計情報の DBアクセス量(バッファ要求回数)と比べてみましょう。

SQL# SQL_type SQL時間[μ秒] フェッチ行数 DBエリア名 バッファ名 要求回数 バッファヒット率 read回数 write回数 1 SELECT 20,398,931 39,996 ADBDIC ##ADBOTHER#0000004096 14 100 0 0

1 SELECT ADBUIDX01 ADBUIDX01BUF 16,450,491 100 0 0

1 SELECT ADBUTBL01 ADBUTBL01BUF 8,219,200 100 0 0

2 SELECT 7,355,184 39,996 ADBDIC ##ADBOTHER#0000004096 14 100 0 0

2 SELECT ADBUIDX01 ADBUIDX01BUF 4,241,679 100 0 0

2 SELECT ADBUTBL01 ADBUTBL01BUF 4,149,596 100 0 0

4月分の売上データは410万件あります。 それに対して、統計情報のインデクス要求回数は1645万回。約4倍です。 →ネストジョインの内側である商品TBLを検索する際、インデクス段数が 3段として、売上データ1件当たり商品TBLのインデクスを3回参照。 売上データ001 売上データ002 売上データ003 ・・・ 売上TBL 商品001 商品002 410万件+410万件×3段≒1600万回 売上TBL 商品TBL 商品INDEX (3段) ・・・

(20)

3.1 事例1 -グループ化処理のタイミングー

<改善策>

集計前の売上データには商品コードが重複するので、集計後に商品TBLを ジョインするように変更します(グループ化処理を先に実施)

SQL# SQL_type SQL時間[μ秒] フェッチ行数 DBエリア名 バッファ名 要求回数 バッファヒット率 read回数 write回数 1 SELECT 20,398,931 39,996 ADBDIC ##ADBOTHER#0000004096 14 100 0 0

1 SELECT ADBUIDX01 ADBUIDX01BUF 16,450,491 100 0 0

1 SELECT ADBUTBL01 ADBUTBL01BUF 8,219,200 100 0 0

2 SELECT 7,355,184 39,996 ADBDIC ##ADBOTHER#0000004096 14 100 0 0

2 SELECT ADBUIDX01 ADBUIDX01BUF 4,241,679 100 0 0

2 SELECT ADBUTBL01 ADBUTBL01BUF 4,149,596 100 0 0

本改善でインデクスへの要求回数が1645万回→424万回に削減できました。

select U.大分類, U.商品コード, U.金額, S.商品名 from (select 大分類, 商品コード, SUM(金額)

from 売上TBL

where 日付 between '2014/04/01' and '2014/04/30' and 大分類 in ('01', '02', '03', '04')

group by 大分類, 商品コード ) U

left join 商品TBL S

on U.大分類=S.大分類 and U.商品コード=S.商品コード

書換えたSQL の統計情報

・・・

(21)

SQL# SQL_type SQL時間[μ秒] フェッチ行数 DBエリア名 バッファ名 要求回数 バッファヒット率 read回数 write回数 1 SELECT 20,398,931 39,996 ADBDIC ##ADBOTHER#0000004096 14 100 0 0

1 SELECT ADBUIDX01 ADBUIDX01BUF 16,450,491 100 0 0

1 SELECT ADBUTBL01 ADBUTBL01BUF 8,219,200 100 0 0

2 SELECT 8,823,041 39,996 ADBDIC ##ADBOTHER#0000004096 14 100 0 0

2 SELECT ADBUIDX01 ADBUIDX01BUF 4,332,134 100 0 0

2 SELECT ADBUTBL01 ADBUTBL01BUF 4,149,596 100 0 0

3.2 事例2 -ジョインの順序ー

<ポイント2> 事例1の改善策として、ジョイン順序を変更する方法もあります。 事例1は売上TBLを起点にしていましたが、商品TBLの方が件数が少ない ため、商品TBLを起点としたジョインに変更します。 本改善でインデクスへの要求回数が1645万回→433万回に削減できました。

select U.大分類, U.商品コード, U.金額, S.商品名

from 商品TBL S

INNER JOIN 売上TBL U

on U.大分類=S.大分類 and U.商品コード=S.商品コード where U.日付 between '2014/04/01' and '2014/04/30' and S.大分類 in ('01', '02', '03', '04')

group by U.大分類, U.商品コード

書換えたSQL の統計情報

・・・

(22)

3.3 事例3 -ジョイン方式の変更ー

商品TBL 売上データ001 売上データ002 売上データ003 売上データ004 売上データ005 ・・・ 商品001 商品002 商品003 商品004 商品005 ・・・ 売上TBL 適切なインデクスを使っているけど ジョインがなんだか遅いなあ? 商品TBLと売上TBLの突き合わせをしたいが、両方とも件数が多くて 処理時間がかかってしまう。改善するポイントがありますか?

(23)

3.3 事例3 -ジョイン方式の変更ー

内側表・外側表の件数に 応じて結合回数が増加 <ネストジョイン方式> 商品TBL 売上データ001 売上データ002 売上データ003 売上データ004 売上データ005 ・・・ 商品001 商品002 商品003 商品004 商品005 ・・・ 売上TBL <ハッシュジョイン方式> ハッシュテーブル 商品TBLを1回スキャン してハッシュテーブルに 登録 売上TBLを1回スキャン してハッシュテーブルで突き 合わせ 商品TBL 売上データ001 売上データ002 売上データ003 売上データ004 売上データ005 ・・・ 商品001 商品002 商品003 商品004 商品005 ・・・ 売上TBL <ポイント3> 大量データを対象とする場合、内側表・外側表の件数に応じて、繰り返し 処理の回数が増えるネストジョイン方式よりも、両表を1回ずつスキャン するハッシュジョイン方式が優位となる場合があります。

(24)

3.4 事例4 -演算を含むIN(副問合せ)の書換えー

select 大分類 , 商品コード , SUM(金額) from 売上TBL

where 日付 between '2014/04/01' and '2014/04/30' and 大分類 || 商品コード in (select 大分類 || 商品コード from 商品TBL where メーカーコード='000456' ) group by 大分類 IN(副問合せ)を使うと なんか遅い気がするなあ? あるメーカーの商品の4月1日分の売上集計をしたいが、IN副問合せを使うと 処理時間がかかってしまう。改善ポイントはありますか?

(25)

<ポイント4>

演算を含むIN(副問合せ)はインデクスで評価できずに、思わぬ処理時間 がかかってしまうことがあります。

SQL# SQL_type SQL時間[μ秒] フェッチ行数 DBエリア名 バッファ名 要求回数 バッファヒット率 read回数 write回数 1 SELECT 58,134,960 400 ADBDIC ##ADBOTHER#0000004096 14 100 0 0

1 SELECT ADBWRK ADBWRK 54,657,604 100 0 0

1 SELECT ADBUIDX01 ADBUIDX01BUF 137,394 100 0 0

1 SELECT ADBUTBL01 ADBUTBL01BUF 137,185 100 1 0

2 SELECT 1,417,099 400 ADBDIC ##ADBOTHER#0000004096 14 100 0 0

2 SELECT ADBUIDX01 ADBUIDX01BUF 548,355 100 0 0

2 SELECT ADBUTBL01 ADBUTBL01BUF 273,974 100 0 0

演算を含むIN(副問合せ)は、副問合せの結果を作業表に格納して、 主問合せの1件ごとに、作業表と突き合わせて評価します。 →副問合せ結果(あるメーカの商品数)は400件あり、4/1の売上データは 136000件あります。 →400件×136000件=5400万回の突き合わせが行われます。 統計情報からも、作業表のバッファに5465万回の要求回数をだしており、 この突き合わせに時間がかかっていることがわかります。

3.4 事例4 -演算を含むIN(副問合せ)の書換えー

・・・

(26)

<改善策> 演算を含むIN(副問合せ)は、外への参照を使ったEXISTS述語で書き換えると 効率的に検索できるケースが多いです。 select 大分類 , 商品コード , SUM(金額) from 売上TBL U where 日付 = '2014/04/01' and EXISTS( select * from 商品TBL where メーカーコード='000456'

and 大分類=U.大分類 and 商品コード=U.商品コード )

group by 大分類 , 商品コード

SQL# SQL_type SQL時間[μ秒] フェッチ行数 DBエリア名 バッファ名 要求回数 バッファヒット率 read回数 write回数 1 SELECT 58,134,960 400 ADBDIC ##ADBOTHER#0000004096 14 100 0 0

1 SELECT ADBWRK ADBWRK 54,657,604 100 0 0

1 SELECT ADBUIDX01 ADBUIDX01BUF 137,394 100 0 0

1 SELECT ADBUTBL01 ADBUTBL01BUF 137,185 100 1 0

2 SELECT 1,417,099 400 ADBDIC ##ADBOTHER#0000004096 14 100 0 0

2 SELECT ADBUIDX01 ADBUIDX01BUF 548,355 100 0 0

2 SELECT ADBUTBL01 ADBUTBL01BUF 273,974 100 0 0

書換えたSQL の統計情報 本改善で、作業表(ADBWRK)へのアクセスそのものがなくなり、5467万回

3.4 事例4 -演算を含むIN(副問合せ)の書換えー

・・・ ・・・

(27)

3.5 事例5 -テーブルスキャンの活用ー

インデクスはちゃんと 使っているんだけどなあ?

B-Treeインデクスはちゃんと使っていて、絞り込みも期待できるはずだけど なんとなく遅い気がします。改善ポイントはありますか?

(28)

3.5 事例5 -テーブルスキャンの活用ー

データ部 B-treeインデクス 売上TBL B-treeインデクス で絞り込み ランダムI/O SQL検索 データ部 売上TBL SQL検索 <インデクス経由の検索> <テーブルスキャン> <ポイント5> ビッグデータの場合、B-Treeインデクスを適切に使用して、条件も絞り込める (母体全体に対する比率として)場合でも、件数そのものが膨大なため、 インデクス経由のランダムI/Oよりも、テーブルスキャンが優位な場合が あります。 ヒント句でテーブル スキャン指定

(29)

1. Hitachi Advanced Data Binderの概要

2. SQLチューニング方法の概要

3. チューニング事例

Contents

(30)

4.おわりに

1.超高速データベースエンジンとは

Hitachi Advanced Data Binderプラットフォームと高速化の技術について 概要をご説明しました。 2.SQLチューニング方法の概要 SQLチューニング方法を、問題のSQLの特定から問題点の調査、対策案の 効果の検証までをご説明しました。 3.チューニング事例 実際に現場で適用した際のチューニング事例をいくつかご紹介 統計情報の結果も併せて、定量的に効果を検証しました。

(31)

株式会社 日立製作所 情報・通信システム社

ITプラットフォーム事業本部 サービスイノベーション統括本部 IT基盤ソリューション本部 DB部

Hitachi Advanced Data Binder 実践SQLチューニング方法

2015/06/12

山口 健一

(32)

参照

関連したドキュメント

また,文献 [7] ではGDPの70%を占めるサービス業に おけるIT化を重点的に支援することについて提言して

事業セグメントごとの資本コスト(WACC)を算定するためには、BS を作成後、まず株

Nintendo Switchでは引き続きハードウェア・ソフトウェアの魅力をお伝えし、これまでの販売の勢いを高い水準

それでは資料 2 ご覧いただきまして、1 の要旨でございます。前回皆様にお集まりいただ きました、昨年 11

「新老人運動」 の趣旨を韓国に紹介し, 日本の 「新老人 の会」 会員と, 韓国の高齢者が協力して活動を進めるこ とは, 日韓両国民の友好親善に寄与するところがきわめ

手動のレバーを押して津波がどのようにして起きるかを観察 することができます。シミュレーターの前には、 「地図で見る日本

荒天の際に係留する場合は、1つのビットに 2 本(可能であれば 3

燃料デブリを周到な準備と 技術によって速やかに 取り出し、安定保管する 燃料デブリを 安全に取り出す 冷却取り出しまでの間の