SlideShare a Scribd company logo
JPOUG in 15 minutes #8
三原 健一
自己紹介
• フリーランス
• 現在:大手SIerの性能問題解決チームに従事
• 過去1年数ヶ月は主にSQLチューニングの日々
• ブログ:「サイクル&オラクル」
http://onefact.jp/wp/
• DB Online記事執筆:「Oracle技術者から見た、SAP HANA」
https://enterprisezine.jp/article/corner/440
アジェンダ
• 実行計画ツリーとその見方
• 実行計画を見やすくするTips
• チューニングの実際
SELECT /*+ ONLINE_SQL04S
INDEX(T004 I_TABLE004_8) INDEX(T001 I_TABLE001_2)
USE_NL(T002)
LEADING(T001 T004 T002) */
COUNT(*) AS COUNTNUM
FROM
TABLE_004 T004
INNER JOIN
TABLE_001 T001
ON (T004.COL3091 = T001.COL3091
AND T004.COLA269 = T001.COLA269)
LEFT OUTER JOIN
TABLE_002 T002
ON (T002.COLA215 = T001.COLA215
AND T002.COL3091 = T004.COL3091)
WHERE
..... 以下省略 ..........
COUNTNUM
----------
1
経過: 00:03:27.35
チューニング前SQLと実行結果
← オンラインSQLなので目標レスポンス時間は3秒以内
Plan hash value: 239732999
----------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts || A-Rows | A-Time ||
----------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 || 1 |00:03:27.34 ||
| 1 | SORT AGGREGATE | | 1 || 1 |00:03:27.34 ||
|* 2 | COUNT STOPKEY | | 1 || 1 |00:03:27.34 ||
|* 3 | FILTER | | 1 || 1 |00:03:27.34 ||
|* 4 | FILTER | | 1 || 1 |00:03:27.34 ||
| 5 | NESTED LOOPS OUTER | | 1 || 1 |00:03:27.34 ||
| 6 | NESTED LOOPS | | 1 || 1 |00:03:27.33 ||
|* 7 | TABLE ACCESS BY INDEX ROWID BATCHED | TABLE_001 | 1 || 3060 |00:00:03.12 ||
|* 8 | INDEX SKIP SCAN | I_TABLE001_2 | 1 || 3060 |00:00:02.96 ||
| 9 | PARTITION RANGE ITERATOR | | 3060 || 1 |00:03:24.20 ||
|* 10 | TABLE ACCESS BY LOCAL INDEX ROWID BATCHED| TABLE_004 | 3060 || 1 |00:03:24.19 ||
|* 11 | INDEX RANGE SCAN | I_TABLE004_8 | 3060 || 1 |00:03:24.17 ||
|* 12 | INDEX RANGE SCAN | I_TABLE002PK | 1 || 0 |00:00:00.01 ||
----------------------------------------------------------------------------------------------------------
参考:「SQLチューニングに必要な考え方と最新テクニック」by 日本オラクル 柴田 歩氏
https://www.oracle.com/webfolder/technetwork/jp/ondemand/ddd2013/A-1.pdf
実行統計を併記した実行計画の表示方法と読み方のおさらい
Starts: 当該ステップの実行回数 A-Rows: 処理行数 A-Time: 実行時間
実行順:11 -> 10 -> 9 -> 8 -> 7 -> 6 -> 12 -> 5 -> 4 -> 3 -> 2 -> 1 -> 0
⑥ NESTED LOOPS
Rows=1 Time=204.20s
TABLE_001
駆動表(外部表)
TABLE_004
内部表
Starts=1
続く
⑧ INDEX SKIP SCAN
A-Rows=3,060 Time=2.96s
⑦ TABLE ACCESS BY INDEX ROWID BATCHED
A-Rows=3,060 Time=3.12s
+0.16s
⑪ INDEX RANGE SCAN
Rows=1 Time=204.17s
+0.02s
⑩ TABLE ACCESS BY INDEX ROWID BATCHED
Rows=1 Time=204.19s
⑨ PARTITION RANGE ITERATOR
Rows=1 Time=204.20s
+0.01s
Starts=3,060
Nested Loops Joinの動作
ID Operation Name Starts A-Rows A-Time
-- ------------------------------------------------- -------------- ------ ------ ------
8 INDEX SKIP SCAN I_TABLE001_2 1 3,060 2.96
7 TABLE ACCESS BY INDEX ROWID BATCHED TABLE_001 1 3,060 3.12
11 INDEX RANGE SCAN I_TABLE004_8 3,060 1 204.17
10 TABLE ACCESS BY LOCAL INDEX ROWID BATCHED TABLE_004 3,060 1 204.19
9 PARTITION RANGE ITERATOR 3,060 1 204.20
6 NESTED LOOPS 1 1 207.33
12 INDEX RANGE SCAN I_TABLE002PK 1 0 0.00
5 NESTED LOOPS OUTER 1 1 207.34
4 FILTER 1 1 207.34
3 FILTER 1 1 207.34
2 COUNT STOPKEY 1 1 207.34
1 SORT AGGREGATE 1 1 207.34
0 SELECT STATEMENT 1 1 207.34
13行が選択されました。
実行順実行計画の表示
• 上から下に向かって単純にたどっていく
• ID=0のA-Timeが全体の実行時間(< 経過時間)
• A-Timeが最も急激に増加しているステップがボトルネック(ID=11)
• ボトルネックの手前にも問題点がないか確認(ID=8)
⇨ チューニング・ポイント:2つのインデックスを見直す
01 select
02 ID,"Operation","Name","Starts","E-Rows","A-Rows","A-Time","Buffers","Reads","Writes","Srch Cols","Pstart","Pstop","PartID"
03 from
04 (select
05 rownum NO
06 ,ID
07 ,lpad(' ',DEPTH) || OPERATION ||' '|| OPTIONS "Operation"
08 ,OBJECT_NAME "Name" ,LAST_STARTS "Starts"
09 ,nvl(CARDINALITY,1) * LAST_STARTS "E-Rows" -- 1回の操作で処理される見積行数 * 見積処理回数 = 見積処理行数
10 ,LAST_OUTPUT_ROWS "A-Rows" -- 実際の処理行数
11 ,LAST_ELAPSED_TIME/1000000 "A-Time"
12 ,LAST_CR_BUFFER_GETS "Buffers",LAST_DISK_READS "Reads",LAST_DISK_WRITES "Writes"
13 ,SEARCH_COLUMNS "Srch Cols"
14 --,COST
15 ,PARTITION_START "Pstart",PARTITION_STOP "Pstop",PARTITION_ID "PartID"
16 from
17 (select a.* from
18 V$SQL_PLAN_STATISTICS_ALL a
19 where a.SQL_ID = '&1'
20 and a.TIMESTAMP = (select max(b.TIMESTAMP) from V$SQL_PLAN_STATISTICS_ALL b where b.SQL_ID = a.SQL_ID)
21 )
22 start with PARENT_ID is null
23 connect by prior ID = PARENT_ID
24 order siblings by ID desc
25 )
26 order by NO desc
27 ;
「実行順実行計画」表示スクリプト(全体)
15 ,PARTITION_START "Pstart",PARTITION_STOP "Pstop",PARTITION_ID "PartID"
16 from
17 (select a.* from
18 V$SQL_PLAN_STATISTICS_ALL a
19 where a.SQL_ID = '&1'
20 and a.TIMESTAMP = (select max(b.TIMESTAMP) from
V$SQL_PLAN_STATISTICS_ALL b where b.SQL_ID = a.SQL_ID)
21 )
22 start with PARENT_ID is null
23 connect by prior ID = PARENT_ID
24 order siblings by ID desc
25 )
「実行順実行計画」表示スクリプト(詳細1)
• 18行目:DBMS_XPLAN.DISPLAY_CURSORの参照元
• 22〜23行目:階層問い合わせで親IDから順にたどる
• 24行目:SIBLINGS(きょうだい) f.e. sibling node きょうだいノード
• 20行目:(念のため)直近の実行計画に絞る
01 select
02 ID,"Operation","Name","Starts","E-Rows","A-Rows","A-Time","Buffers","Reads","Writes","Srch
Cols","Pstart","Pstop","PartID"
03 from
04 (select
05 rownum NO
06 ,ID
07 ,lpad(' ',DEPTH) || OPERATION ||' '|| OPTIONS "Operation"
08 ,OBJECT_NAME "Name" ,LAST_STARTS "Starts"
09 ,nvl(CARDINALITY,1) * LAST_STARTS "E-Rows" -- 1回の操作で処理される見積行数 * 見積処理回
数 = 見積処理行数
10 ,LAST_OUTPUT_ROWS "A-Rows" -- 実際の処理行数
11 ,LAST_ELAPSED_TIME/1000000 "A-Time"
.............................................................................
25 )
26 order by NO desc
27 ;
「実行順実行計画」表示スクリプト(詳細2)
• 05および26行目:実行順を上から順に表示させるため
• 09行目:(念のため)E-Rowsを使いやすい値に加工する
SELECT /*+ ONLINE_SQL04S
INDEX(T004 I_TABLE004_TEST2) INDEX(T001 I_TABLE001_TEST1)
USE_NL(T002) LEADING(T001 T004 T002) */
COUNT(*) AS COUNTNUM
FROM
TABLE_004 T004
INNER JOIN
TABLE_001 T001
ON (T004.COL3091 = T001.COL3091
AND T004.COLA269 = T001.COLA269)
LEFT OUTER JOIN
TABLE_002 T002
ON (T002.COLA215 = T001.COLA215
AND T002.COL3091 = T004.COL3091)
WHERE
..... 以下省略 ..........
COUNTNUM
----------
1
経過: 00:00:01.04
チューニング後SQLと実行結果
2つの複合インデックスのカラム順を見直し
3:27.35 ⇨ 1.04 に改善
Plan hash value: 1704335308
----------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts || A-Rows | A-Time ||
----------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 || 1 |00:00:00.09 ||
| 1 | SORT AGGREGATE | | 1 || 1 |00:00:00.09 ||
|* 2 | COUNT STOPKEY | | 1 || 1 |00:00:00.09 ||
|* 3 | FILTER | | 1 || 1 |00:00:00.09 ||
|* 4 | FILTER | | 1 || 1 |00:00:00.09 ||
| 5 | NESTED LOOPS OUTER | | 1 || 1 |00:00:00.09 ||
| 6 | MERGE JOIN | | 1 || 1 |00:00:00.09 ||
|* 7 | TABLE ACCESS BY INDEX ROWID | TABLE_001 | 1 || 3060 |00:00:00.09 ||
|* 8 | INDEX RANGE SCAN | I_TABLE001_TEST1 | 1 || 3060 |00:00:00.01 ||
|* 9 | FILTER | | 3060 || 1 |00:00:00.01 ||
|* 10 | SORT JOIN | | 3060 || 1 |00:00:00.01 ||
| 11 | TABLE ACCESS BY GLOBAL INDEX ROWID BATCHED| TABLE_004 | 1 || 1 |00:00:00.01 ||
|* 12 | INDEX RANGE SCAN | I_TABLE004_TEST2 | 1 || 1 |00:00:00.01 ||
|* 13 | INDEX RANGE SCAN | I_TABLE002PK | 1 || 0 |00:00:00.01 ||
----------------------------------------------------------------------------------------------------------------
ID Operation Name Starts E-Rows A-Rows A-Time
-- --------------------------------------------------- ---------------- ------ ------ ------ ------
8 INDEX RANGE SCAN I_TABLE001_TEST1 1 38,050 3,060 0.01
7 TABLE ACCESS BY INDEX ROWID TABLE_001 1 38,046 3,060 0.09
12 INDEX RANGE SCAN I_TABLE004_TEST2 1 1 1 0.00
11 TABLE ACCESS BY GLOBAL INDEX ROWID BATCHED TABLE_004 1 1 1 0.00
10 SORT JOIN 3,060 3,060 1 0.00
9 FILTER 3,060 3,060 1 0.01
6 MERGE JOIN 1 1 1 0.09
13 INDEX RANGE SCAN I_TABLE002PK 1 1 0 0.00
5 NESTED LOOPS OUTER 1 1 1 0.09
4 FILTER 1 1 1 0.09
3 FILTER 1 1 1 0.09
2 COUNT STOPKEY 1 1 1 0.09
1 SORT AGGREGATE 1 1 1 0.09
0 SELECT STATEMENT 1 1 1 0.09
チューニング後実行計画
まとめ
• 実行統計(10gR2〜)はOracle技術者にとっての大きな飛躍
• 実行順表示でボトルネックはさらにわかりやすく
• ボトルネック解消策
• SCAN / ACCESS : インデックス等I/O負荷削減検討
• JOIN : 結合方式検討(USE_HASHヒント等)、結合順序検
討(LEADINGヒント等)
• 詳しくはブログで。。。

More Related Content

What's hot

SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するか
Shogo Wakayama
 
Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)
Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)
Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)
Noritaka Sekiyama
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
Miki Shimogai
 
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
Satoshi Yamada
 
平成最後の1月ですし、Databricksでもやってみましょうか
平成最後の1月ですし、Databricksでもやってみましょうか平成最後の1月ですし、Databricksでもやってみましょうか
平成最後の1月ですし、Databricksでもやってみましょうか
Ryuichi Tokugami
 
とにかく分かりづらいTwelve-Factor Appの解説を試みる
とにかく分かりづらいTwelve-Factor Appの解説を試みるとにかく分かりづらいTwelve-Factor Appの解説を試みる
とにかく分かりづらいTwelve-Factor Appの解説を試みる
Masatoshi Tada
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
 
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
Soudai Sone
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
 
SolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみようSolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみよう
Shinsuke Sugaya
 
[B23] PostgreSQLのインデックス・チューニング by Tomonari Katsumata
[B23] PostgreSQLのインデックス・チューニング by Tomonari Katsumata[B23] PostgreSQLのインデックス・チューニング by Tomonari Katsumata
[B23] PostgreSQLのインデックス・チューニング by Tomonari KatsumataInsight Technology, Inc.
 
はじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタはじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタ
Satoyuki Tsukano
 
MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法
yoku0825
 
ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本
kazuki kumagai
 
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
MySQL・PostgreSQLだけで作る高速あいまい全文検索システムMySQL・PostgreSQLだけで作る高速あいまい全文検索システム
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
Kouhei Sutou
 
Snowflake Architecture and Performance
Snowflake Architecture and PerformanceSnowflake Architecture and Performance
Snowflake Architecture and Performance
Mineaki Motohashi
 
IAM Roles Anywhereのない世界とある世界(2022年のAWSアップデートを振り返ろう ~Season 4~ 発表資料)
IAM Roles Anywhereのない世界とある世界(2022年のAWSアップデートを振り返ろう ~Season 4~ 発表資料)IAM Roles Anywhereのない世界とある世界(2022年のAWSアップデートを振り返ろう ~Season 4~ 発表資料)
IAM Roles Anywhereのない世界とある世界(2022年のAWSアップデートを振り返ろう ~Season 4~ 発表資料)
NTT DATA Technology & Innovation
 
データ活用を加速するAWS分析サービスのご紹介
データ活用を加速するAWS分析サービスのご紹介データ活用を加速するAWS分析サービスのご紹介
データ活用を加速するAWS分析サービスのご紹介
Amazon Web Services Japan
 
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
Amazon Web Services Japan
 

What's hot (20)

SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するか
 
Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)
Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)
Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
 
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
 
平成最後の1月ですし、Databricksでもやってみましょうか
平成最後の1月ですし、Databricksでもやってみましょうか平成最後の1月ですし、Databricksでもやってみましょうか
平成最後の1月ですし、Databricksでもやってみましょうか
 
とにかく分かりづらいTwelve-Factor Appの解説を試みる
とにかく分かりづらいTwelve-Factor Appの解説を試みるとにかく分かりづらいTwelve-Factor Appの解説を試みる
とにかく分かりづらいTwelve-Factor Appの解説を試みる
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 
SolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみようSolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみよう
 
[B23] PostgreSQLのインデックス・チューニング by Tomonari Katsumata
[B23] PostgreSQLのインデックス・チューニング by Tomonari Katsumata[B23] PostgreSQLのインデックス・チューニング by Tomonari Katsumata
[B23] PostgreSQLのインデックス・チューニング by Tomonari Katsumata
 
はじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタはじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタ
 
MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法
 
ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本
 
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
MySQL・PostgreSQLだけで作る高速あいまい全文検索システムMySQL・PostgreSQLだけで作る高速あいまい全文検索システム
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
 
Snowflake Architecture and Performance
Snowflake Architecture and PerformanceSnowflake Architecture and Performance
Snowflake Architecture and Performance
 
IAM Roles Anywhereのない世界とある世界(2022年のAWSアップデートを振り返ろう ~Season 4~ 発表資料)
IAM Roles Anywhereのない世界とある世界(2022年のAWSアップデートを振り返ろう ~Season 4~ 発表資料)IAM Roles Anywhereのない世界とある世界(2022年のAWSアップデートを振り返ろう ~Season 4~ 発表資料)
IAM Roles Anywhereのない世界とある世界(2022年のAWSアップデートを振り返ろう ~Season 4~ 発表資料)
 
データ活用を加速するAWS分析サービスのご紹介
データ活用を加速するAWS分析サービスのご紹介データ活用を加速するAWS分析サービスのご紹介
データ活用を加速するAWS分析サービスのご紹介
 
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
 

Similar to 実行統計による実践的SQLチューニング

まだ統計固定で消耗してるの? - Bind Peek をもっと使おうぜ! 2015 Edition -
まだ統計固定で消耗してるの? - Bind Peek をもっと使おうぜ! 2015 Edition -まだ統計固定で消耗してるの? - Bind Peek をもっと使おうぜ! 2015 Edition -
まだ統計固定で消耗してるの? - Bind Peek をもっと使おうぜ! 2015 Edition -
歩 柴田
 
2016/12/15 SQLチューニングと対戦格闘ゲームの類似性について語る。 JPOUG Advent Calendar 2016 Day 15
2016/12/15 SQLチューニングと対戦格闘ゲームの類似性について語る。 JPOUG Advent Calendar 2016 Day 152016/12/15 SQLチューニングと対戦格闘ゲームの類似性について語る。 JPOUG Advent Calendar 2016 Day 15
2016/12/15 SQLチューニングと対戦格闘ゲームの類似性について語る。 JPOUG Advent Calendar 2016 Day 15
歩 柴田
 
Let's scale-out PostgreSQL using Citus (Japanese)
Let's scale-out PostgreSQL using Citus (Japanese)Let's scale-out PostgreSQL using Citus (Japanese)
Let's scale-out PostgreSQL using Citus (Japanese)
Noriyoshi Shinoda
 
Maatkit で MySQL チューニング
Maatkit で MySQL チューニングMaatkit で MySQL チューニング
Maatkit で MySQL チューニングKensuke Nagae
 
MySQL勉強会 インデックス編.2013 08-02
MySQL勉強会 インデックス編.2013 08-02MySQL勉強会 インデックス編.2013 08-02
MySQL勉強会 インデックス編.2013 08-02CROOZ, inc.
 
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
Insight Technology, Inc.
 
Index shotgun on mysql5.6
Index shotgun on mysql5.6Index shotgun on mysql5.6
Index shotgun on mysql5.6
yoku0825
 
[db tech showcase Tokyo 2015] A14:Amazon Redshiftの元となったスケールアウト型カラムナーDB徹底解説 その...
[db tech showcase Tokyo 2015] A14:Amazon Redshiftの元となったスケールアウト型カラムナーDB徹底解説 その...[db tech showcase Tokyo 2015] A14:Amazon Redshiftの元となったスケールアウト型カラムナーDB徹底解説 その...
[db tech showcase Tokyo 2015] A14:Amazon Redshiftの元となったスケールアウト型カラムナーDB徹底解説 その...
Insight Technology, Inc.
 
20160929 inno db_fts_jp
20160929 inno db_fts_jp20160929 inno db_fts_jp
20160929 inno db_fts_jp
yoyamasaki
 
データベースシステム論13 - データベースの運用
データベースシステム論13 - データベースの運用データベースシステム論13 - データベースの運用
データベースシステム論13 - データベースの運用
Shohei Yokoyama
 
db tech showcase 2019 D10 Oracle Database New Features
db tech showcase 2019 D10 Oracle Database New Featuresdb tech showcase 2019 D10 Oracle Database New Features
db tech showcase 2019 D10 Oracle Database New Features
Noriyoshi Shinoda
 
MySQL 5.7 InnoDB 日本語全文検索(その2)
MySQL 5.7 InnoDB 日本語全文検索(その2)MySQL 5.7 InnoDB 日本語全文検索(その2)
MySQL 5.7 InnoDB 日本語全文検索(その2)
yoyamasaki
 
Oracle Database Connect 2017 / JPOUG#1
Oracle Database Connect 2017 / JPOUG#1Oracle Database Connect 2017 / JPOUG#1
Oracle Database Connect 2017 / JPOUG#1
Noriyoshi Shinoda
 
Introduction of Oracle Database Architecture
Introduction of Oracle Database ArchitectureIntroduction of Oracle Database Architecture
Introduction of Oracle Database Architecture
Ryota Watabe
 
固定化か?最新化か?オプティマイザ統計の運用をもう一度考える。 -JPOUG Tech Talk Night #6-
固定化か?最新化か?オプティマイザ統計の運用をもう一度考える。 -JPOUG Tech Talk Night #6-固定化か?最新化か?オプティマイザ統計の運用をもう一度考える。 -JPOUG Tech Talk Night #6-
固定化か?最新化か?オプティマイザ統計の運用をもう一度考える。 -JPOUG Tech Talk Night #6-
歩 柴田
 
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
Introduction of Oracle Database Architecture(抜粋版) - JPOUG Oracle Database入学式 ...
Introduction of Oracle Database Architecture(抜粋版) - JPOUG Oracle Database入学式 ...Introduction of Oracle Database Architecture(抜粋版) - JPOUG Oracle Database入学式 ...
Introduction of Oracle Database Architecture(抜粋版) - JPOUG Oracle Database入学式 ...
Ryota Watabe
 
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
Akinari Tsugo
 
道具を磨くことのススメ
道具を磨くことのススメ道具を磨くことのススメ
道具を磨くことのススメ
Kenichi Masuda
 
PostgreSQL Unconference #5 ICU Collation
PostgreSQL Unconference #5 ICU CollationPostgreSQL Unconference #5 ICU Collation
PostgreSQL Unconference #5 ICU Collation
Noriyoshi Shinoda
 

Similar to 実行統計による実践的SQLチューニング (20)

まだ統計固定で消耗してるの? - Bind Peek をもっと使おうぜ! 2015 Edition -
まだ統計固定で消耗してるの? - Bind Peek をもっと使おうぜ! 2015 Edition -まだ統計固定で消耗してるの? - Bind Peek をもっと使おうぜ! 2015 Edition -
まだ統計固定で消耗してるの? - Bind Peek をもっと使おうぜ! 2015 Edition -
 
2016/12/15 SQLチューニングと対戦格闘ゲームの類似性について語る。 JPOUG Advent Calendar 2016 Day 15
2016/12/15 SQLチューニングと対戦格闘ゲームの類似性について語る。 JPOUG Advent Calendar 2016 Day 152016/12/15 SQLチューニングと対戦格闘ゲームの類似性について語る。 JPOUG Advent Calendar 2016 Day 15
2016/12/15 SQLチューニングと対戦格闘ゲームの類似性について語る。 JPOUG Advent Calendar 2016 Day 15
 
Let's scale-out PostgreSQL using Citus (Japanese)
Let's scale-out PostgreSQL using Citus (Japanese)Let's scale-out PostgreSQL using Citus (Japanese)
Let's scale-out PostgreSQL using Citus (Japanese)
 
Maatkit で MySQL チューニング
Maatkit で MySQL チューニングMaatkit で MySQL チューニング
Maatkit で MySQL チューニング
 
MySQL勉強会 インデックス編.2013 08-02
MySQL勉強会 インデックス編.2013 08-02MySQL勉強会 インデックス編.2013 08-02
MySQL勉強会 インデックス編.2013 08-02
 
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
 
Index shotgun on mysql5.6
Index shotgun on mysql5.6Index shotgun on mysql5.6
Index shotgun on mysql5.6
 
[db tech showcase Tokyo 2015] A14:Amazon Redshiftの元となったスケールアウト型カラムナーDB徹底解説 その...
[db tech showcase Tokyo 2015] A14:Amazon Redshiftの元となったスケールアウト型カラムナーDB徹底解説 その...[db tech showcase Tokyo 2015] A14:Amazon Redshiftの元となったスケールアウト型カラムナーDB徹底解説 その...
[db tech showcase Tokyo 2015] A14:Amazon Redshiftの元となったスケールアウト型カラムナーDB徹底解説 その...
 
20160929 inno db_fts_jp
20160929 inno db_fts_jp20160929 inno db_fts_jp
20160929 inno db_fts_jp
 
データベースシステム論13 - データベースの運用
データベースシステム論13 - データベースの運用データベースシステム論13 - データベースの運用
データベースシステム論13 - データベースの運用
 
db tech showcase 2019 D10 Oracle Database New Features
db tech showcase 2019 D10 Oracle Database New Featuresdb tech showcase 2019 D10 Oracle Database New Features
db tech showcase 2019 D10 Oracle Database New Features
 
MySQL 5.7 InnoDB 日本語全文検索(その2)
MySQL 5.7 InnoDB 日本語全文検索(その2)MySQL 5.7 InnoDB 日本語全文検索(その2)
MySQL 5.7 InnoDB 日本語全文検索(その2)
 
Oracle Database Connect 2017 / JPOUG#1
Oracle Database Connect 2017 / JPOUG#1Oracle Database Connect 2017 / JPOUG#1
Oracle Database Connect 2017 / JPOUG#1
 
Introduction of Oracle Database Architecture
Introduction of Oracle Database ArchitectureIntroduction of Oracle Database Architecture
Introduction of Oracle Database Architecture
 
固定化か?最新化か?オプティマイザ統計の運用をもう一度考える。 -JPOUG Tech Talk Night #6-
固定化か?最新化か?オプティマイザ統計の運用をもう一度考える。 -JPOUG Tech Talk Night #6-固定化か?最新化か?オプティマイザ統計の運用をもう一度考える。 -JPOUG Tech Talk Night #6-
固定化か?最新化か?オプティマイザ統計の運用をもう一度考える。 -JPOUG Tech Talk Night #6-
 
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
Introduction of Oracle Database Architecture(抜粋版) - JPOUG Oracle Database入学式 ...
Introduction of Oracle Database Architecture(抜粋版) - JPOUG Oracle Database入学式 ...Introduction of Oracle Database Architecture(抜粋版) - JPOUG Oracle Database入学式 ...
Introduction of Oracle Database Architecture(抜粋版) - JPOUG Oracle Database入学式 ...
 
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
 
道具を磨くことのススメ
道具を磨くことのススメ道具を磨くことのススメ
道具を磨くことのススメ
 
PostgreSQL Unconference #5 ICU Collation
PostgreSQL Unconference #5 ICU CollationPostgreSQL Unconference #5 ICU Collation
PostgreSQL Unconference #5 ICU Collation
 

Recently uploaded

Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
harmonylab
 
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
嶋 是一 (Yoshikazu SHIMA)
 
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライドHumanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
tazaki1
 
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobodyロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
azuma satoshi
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
Toru Tamaki
 
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
Osaka University
 
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMMハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
osamut
 

Recently uploaded (7)

Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
 
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
 
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライドHumanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
 
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobodyロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
 
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
 
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMMハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
 

実行統計による実践的SQLチューニング

  • 1. JPOUG in 15 minutes #8 三原 健一
  • 2. 自己紹介 • フリーランス • 現在:大手SIerの性能問題解決チームに従事 • 過去1年数ヶ月は主にSQLチューニングの日々 • ブログ:「サイクル&オラクル」 http://onefact.jp/wp/ • DB Online記事執筆:「Oracle技術者から見た、SAP HANA」 https://enterprisezine.jp/article/corner/440
  • 4. SELECT /*+ ONLINE_SQL04S INDEX(T004 I_TABLE004_8) INDEX(T001 I_TABLE001_2) USE_NL(T002) LEADING(T001 T004 T002) */ COUNT(*) AS COUNTNUM FROM TABLE_004 T004 INNER JOIN TABLE_001 T001 ON (T004.COL3091 = T001.COL3091 AND T004.COLA269 = T001.COLA269) LEFT OUTER JOIN TABLE_002 T002 ON (T002.COLA215 = T001.COLA215 AND T002.COL3091 = T004.COL3091) WHERE ..... 以下省略 .......... COUNTNUM ---------- 1 経過: 00:03:27.35 チューニング前SQLと実行結果 ← オンラインSQLなので目標レスポンス時間は3秒以内
  • 5. Plan hash value: 239732999 ---------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts || A-Rows | A-Time || ---------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 || 1 |00:03:27.34 || | 1 | SORT AGGREGATE | | 1 || 1 |00:03:27.34 || |* 2 | COUNT STOPKEY | | 1 || 1 |00:03:27.34 || |* 3 | FILTER | | 1 || 1 |00:03:27.34 || |* 4 | FILTER | | 1 || 1 |00:03:27.34 || | 5 | NESTED LOOPS OUTER | | 1 || 1 |00:03:27.34 || | 6 | NESTED LOOPS | | 1 || 1 |00:03:27.33 || |* 7 | TABLE ACCESS BY INDEX ROWID BATCHED | TABLE_001 | 1 || 3060 |00:00:03.12 || |* 8 | INDEX SKIP SCAN | I_TABLE001_2 | 1 || 3060 |00:00:02.96 || | 9 | PARTITION RANGE ITERATOR | | 3060 || 1 |00:03:24.20 || |* 10 | TABLE ACCESS BY LOCAL INDEX ROWID BATCHED| TABLE_004 | 3060 || 1 |00:03:24.19 || |* 11 | INDEX RANGE SCAN | I_TABLE004_8 | 3060 || 1 |00:03:24.17 || |* 12 | INDEX RANGE SCAN | I_TABLE002PK | 1 || 0 |00:00:00.01 || ---------------------------------------------------------------------------------------------------------- 参考:「SQLチューニングに必要な考え方と最新テクニック」by 日本オラクル 柴田 歩氏 https://www.oracle.com/webfolder/technetwork/jp/ondemand/ddd2013/A-1.pdf 実行統計を併記した実行計画の表示方法と読み方のおさらい Starts: 当該ステップの実行回数 A-Rows: 処理行数 A-Time: 実行時間 実行順:11 -> 10 -> 9 -> 8 -> 7 -> 6 -> 12 -> 5 -> 4 -> 3 -> 2 -> 1 -> 0
  • 6. ⑥ NESTED LOOPS Rows=1 Time=204.20s TABLE_001 駆動表(外部表) TABLE_004 内部表 Starts=1 続く ⑧ INDEX SKIP SCAN A-Rows=3,060 Time=2.96s ⑦ TABLE ACCESS BY INDEX ROWID BATCHED A-Rows=3,060 Time=3.12s +0.16s ⑪ INDEX RANGE SCAN Rows=1 Time=204.17s +0.02s ⑩ TABLE ACCESS BY INDEX ROWID BATCHED Rows=1 Time=204.19s ⑨ PARTITION RANGE ITERATOR Rows=1 Time=204.20s +0.01s Starts=3,060 Nested Loops Joinの動作
  • 7. ID Operation Name Starts A-Rows A-Time -- ------------------------------------------------- -------------- ------ ------ ------ 8 INDEX SKIP SCAN I_TABLE001_2 1 3,060 2.96 7 TABLE ACCESS BY INDEX ROWID BATCHED TABLE_001 1 3,060 3.12 11 INDEX RANGE SCAN I_TABLE004_8 3,060 1 204.17 10 TABLE ACCESS BY LOCAL INDEX ROWID BATCHED TABLE_004 3,060 1 204.19 9 PARTITION RANGE ITERATOR 3,060 1 204.20 6 NESTED LOOPS 1 1 207.33 12 INDEX RANGE SCAN I_TABLE002PK 1 0 0.00 5 NESTED LOOPS OUTER 1 1 207.34 4 FILTER 1 1 207.34 3 FILTER 1 1 207.34 2 COUNT STOPKEY 1 1 207.34 1 SORT AGGREGATE 1 1 207.34 0 SELECT STATEMENT 1 1 207.34 13行が選択されました。 実行順実行計画の表示 • 上から下に向かって単純にたどっていく • ID=0のA-Timeが全体の実行時間(< 経過時間) • A-Timeが最も急激に増加しているステップがボトルネック(ID=11) • ボトルネックの手前にも問題点がないか確認(ID=8) ⇨ チューニング・ポイント:2つのインデックスを見直す
  • 8. 01 select 02 ID,"Operation","Name","Starts","E-Rows","A-Rows","A-Time","Buffers","Reads","Writes","Srch Cols","Pstart","Pstop","PartID" 03 from 04 (select 05 rownum NO 06 ,ID 07 ,lpad(' ',DEPTH) || OPERATION ||' '|| OPTIONS "Operation" 08 ,OBJECT_NAME "Name" ,LAST_STARTS "Starts" 09 ,nvl(CARDINALITY,1) * LAST_STARTS "E-Rows" -- 1回の操作で処理される見積行数 * 見積処理回数 = 見積処理行数 10 ,LAST_OUTPUT_ROWS "A-Rows" -- 実際の処理行数 11 ,LAST_ELAPSED_TIME/1000000 "A-Time" 12 ,LAST_CR_BUFFER_GETS "Buffers",LAST_DISK_READS "Reads",LAST_DISK_WRITES "Writes" 13 ,SEARCH_COLUMNS "Srch Cols" 14 --,COST 15 ,PARTITION_START "Pstart",PARTITION_STOP "Pstop",PARTITION_ID "PartID" 16 from 17 (select a.* from 18 V$SQL_PLAN_STATISTICS_ALL a 19 where a.SQL_ID = '&1' 20 and a.TIMESTAMP = (select max(b.TIMESTAMP) from V$SQL_PLAN_STATISTICS_ALL b where b.SQL_ID = a.SQL_ID) 21 ) 22 start with PARENT_ID is null 23 connect by prior ID = PARENT_ID 24 order siblings by ID desc 25 ) 26 order by NO desc 27 ; 「実行順実行計画」表示スクリプト(全体)
  • 9. 15 ,PARTITION_START "Pstart",PARTITION_STOP "Pstop",PARTITION_ID "PartID" 16 from 17 (select a.* from 18 V$SQL_PLAN_STATISTICS_ALL a 19 where a.SQL_ID = '&1' 20 and a.TIMESTAMP = (select max(b.TIMESTAMP) from V$SQL_PLAN_STATISTICS_ALL b where b.SQL_ID = a.SQL_ID) 21 ) 22 start with PARENT_ID is null 23 connect by prior ID = PARENT_ID 24 order siblings by ID desc 25 ) 「実行順実行計画」表示スクリプト(詳細1) • 18行目:DBMS_XPLAN.DISPLAY_CURSORの参照元 • 22〜23行目:階層問い合わせで親IDから順にたどる • 24行目:SIBLINGS(きょうだい) f.e. sibling node きょうだいノード • 20行目:(念のため)直近の実行計画に絞る
  • 10. 01 select 02 ID,"Operation","Name","Starts","E-Rows","A-Rows","A-Time","Buffers","Reads","Writes","Srch Cols","Pstart","Pstop","PartID" 03 from 04 (select 05 rownum NO 06 ,ID 07 ,lpad(' ',DEPTH) || OPERATION ||' '|| OPTIONS "Operation" 08 ,OBJECT_NAME "Name" ,LAST_STARTS "Starts" 09 ,nvl(CARDINALITY,1) * LAST_STARTS "E-Rows" -- 1回の操作で処理される見積行数 * 見積処理回 数 = 見積処理行数 10 ,LAST_OUTPUT_ROWS "A-Rows" -- 実際の処理行数 11 ,LAST_ELAPSED_TIME/1000000 "A-Time" ............................................................................. 25 ) 26 order by NO desc 27 ; 「実行順実行計画」表示スクリプト(詳細2) • 05および26行目:実行順を上から順に表示させるため • 09行目:(念のため)E-Rowsを使いやすい値に加工する
  • 11. SELECT /*+ ONLINE_SQL04S INDEX(T004 I_TABLE004_TEST2) INDEX(T001 I_TABLE001_TEST1) USE_NL(T002) LEADING(T001 T004 T002) */ COUNT(*) AS COUNTNUM FROM TABLE_004 T004 INNER JOIN TABLE_001 T001 ON (T004.COL3091 = T001.COL3091 AND T004.COLA269 = T001.COLA269) LEFT OUTER JOIN TABLE_002 T002 ON (T002.COLA215 = T001.COLA215 AND T002.COL3091 = T004.COL3091) WHERE ..... 以下省略 .......... COUNTNUM ---------- 1 経過: 00:00:01.04 チューニング後SQLと実行結果 2つの複合インデックスのカラム順を見直し 3:27.35 ⇨ 1.04 に改善
  • 12. Plan hash value: 1704335308 ---------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts || A-Rows | A-Time || ---------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 || 1 |00:00:00.09 || | 1 | SORT AGGREGATE | | 1 || 1 |00:00:00.09 || |* 2 | COUNT STOPKEY | | 1 || 1 |00:00:00.09 || |* 3 | FILTER | | 1 || 1 |00:00:00.09 || |* 4 | FILTER | | 1 || 1 |00:00:00.09 || | 5 | NESTED LOOPS OUTER | | 1 || 1 |00:00:00.09 || | 6 | MERGE JOIN | | 1 || 1 |00:00:00.09 || |* 7 | TABLE ACCESS BY INDEX ROWID | TABLE_001 | 1 || 3060 |00:00:00.09 || |* 8 | INDEX RANGE SCAN | I_TABLE001_TEST1 | 1 || 3060 |00:00:00.01 || |* 9 | FILTER | | 3060 || 1 |00:00:00.01 || |* 10 | SORT JOIN | | 3060 || 1 |00:00:00.01 || | 11 | TABLE ACCESS BY GLOBAL INDEX ROWID BATCHED| TABLE_004 | 1 || 1 |00:00:00.01 || |* 12 | INDEX RANGE SCAN | I_TABLE004_TEST2 | 1 || 1 |00:00:00.01 || |* 13 | INDEX RANGE SCAN | I_TABLE002PK | 1 || 0 |00:00:00.01 || ---------------------------------------------------------------------------------------------------------------- ID Operation Name Starts E-Rows A-Rows A-Time -- --------------------------------------------------- ---------------- ------ ------ ------ ------ 8 INDEX RANGE SCAN I_TABLE001_TEST1 1 38,050 3,060 0.01 7 TABLE ACCESS BY INDEX ROWID TABLE_001 1 38,046 3,060 0.09 12 INDEX RANGE SCAN I_TABLE004_TEST2 1 1 1 0.00 11 TABLE ACCESS BY GLOBAL INDEX ROWID BATCHED TABLE_004 1 1 1 0.00 10 SORT JOIN 3,060 3,060 1 0.00 9 FILTER 3,060 3,060 1 0.01 6 MERGE JOIN 1 1 1 0.09 13 INDEX RANGE SCAN I_TABLE002PK 1 1 0 0.00 5 NESTED LOOPS OUTER 1 1 1 0.09 4 FILTER 1 1 1 0.09 3 FILTER 1 1 1 0.09 2 COUNT STOPKEY 1 1 1 0.09 1 SORT AGGREGATE 1 1 1 0.09 0 SELECT STATEMENT 1 1 1 0.09 チューニング後実行計画
  • 13. まとめ • 実行統計(10gR2〜)はOracle技術者にとっての大きな飛躍 • 実行順表示でボトルネックはさらにわかりやすく • ボトルネック解消策 • SCAN / ACCESS : インデックス等I/O負荷削減検討 • JOIN : 結合方式検討(USE_HASHヒント等)、結合順序検 討(LEADINGヒント等) • 詳しくはブログで。。。