Stored Outlineの活用 実践編
July 28, 2004
前述した、Stored OutlineのHackを実践してみる。
まずは実験用テーブルを作る。
ora817@robios.org> create table hoge_transactions 2 as 3 select rownum as transaction_id, 'HOGE' as data, 4 4 as status_code 5 from all_objects 6 where rownum <= 100000; 表が作成されました。 経過: 00:00:20.04 ora817@robios.org> create index hoge_transactions_n1 2 on hoge_transactions (status_code); 索引が作成されました。 経過: 00:00:00.08 ora817@robios.org> update hoge_transactions 2 set status_code = 1 3 where transaction_id between 99000 and 99099; 100行が更新されました。 経過: 00:00:00.01 ora817@robios.org> commit; コミットが完了しました。 経過: 00:00:00.01 ora817@robios.org> analyze table hoge_transactions 2 compute statistics 3 for table 4 for all indexes 5 for all indexed columns; 表が分析されました。 経過: 00:00:02.02
これで、Cardinalityが非常に低いコラムを索引対象したテーブルが作成された。ヒストグラムが作成されているため、STATUS_CODE = 1で検索すると、索引検索が行われる。
ora817@robios.org> select *
2 from hoge_transactions
3 where status_code = 1;
TRANSACTION_ID DATA STATUS_CODE
-------------- ---- -----------
99000 HOGE 1
99001 HOGE 1
99002 HOGE 1
- 途中省略 -
99097 HOGE 1
99098 HOGE 1
99099 HOGE 1
100行が選択されました。
経過: 00:00:03.02
実行計画
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=100 Bytes=160
0)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'HOGE_TRANSACTIONS' (Cost
=2 Card=100 Bytes=1600)
2 1 INDEX (RANGE SCAN) OF 'HOGE_TRANSACTIONS_N1' (NON-UNIQUE
) (Cost=1 Card=100)
統計
----------------------------------------------------------
0 recursive calls
0 db block gets
17 consistent gets
5 physical reads
0 redo size
2759 bytes sent via SQL*Net to client
384 bytes received via SQL*Net from client
9 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
100 rows processed
しかし、バインド変数を使うと、索引は使用されなくなる。(→理由についてはCBOにおける索引の使用判断 - コストの計算例を参照)
ora817@robios.org> variable status number;
ora817@robios.org> exec :status := 1;
PL/SQLプロシージャが正常に完了しました。
経過: 00:00:00.00
ora817@robios.org> select *
2 from hoge_transactions
3 where status_code = :status;
TRANSACTION_ID DATA STATUS_CODE
-------------- ---- -----------
99000 HOGE 1
99001 HOGE 1
99002 HOGE 1
- 途中省略 -
99097 HOGE 1
99098 HOGE 1
99099 HOGE 1
100行が選択されました。
経過: 00:00:03.02
実行計画
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=39 Card=50000 Bytes=
800000)
1 0 TABLE ACCESS (FULL) OF 'HOGE_TRANSACTIONS' (Cost=39 Card=5
0000 Bytes=800000)
統計
----------------------------------------------------------
0 recursive calls
12 db block gets
257 consistent gets
247 physical reads
0 redo size
2759 bytes sent via SQL*Net to client
407 bytes received via SQL*Net from client
9 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
100 rows processed
さて、このようなSQLがOracle ApplicationのProcedureの中にあり、手が出せないとする(実際にこのようなSQLはよくある)。先のOutline Hackでパフォーマンス改善を行う。
まずはProcedureを作る。
ora817@robios.org> create or replace procedure process_hoge_transactions is 2 unprocessed_status constant number := 1; 3 begin 4 for cur in (select * 5 from hoge_transactions 6 where status_code = unprocessed_status) 7 loop 8 dbms_output.put_line(cur.transaction_id || ', ' || cur.data); 9 end loop; 10 end; 11 / プロシージャが作成されました。 経過: 00:00:00.01 ora817@robios.org> alter session set sql_trace=true; セッションが変更されました。 経過: 00:00:00.01 ora817@robios.org> exec process_hoge_transactions; 99000, HOGE 99001, HOGE 99002, HOGE - 途中省略 - 99097, HOGE 99098, HOGE 99099, HOGE PL/SQLプロシージャが正常に完了しました。 経過: 00:00:00.08 ora817@robios.org> alter session set sql_trace=false; セッションが変更されました。 経過: 00:00:00.01
トレースの結果を示す。
******************************************************************************** SELECT * FROM HOGE_TRANSACTIONS WHERE STATUS_CODE = :b1 call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.00 0.00 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 101 0.06 0.07 247 350 12 100 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 103 0.06 0.07 247 350 12 100 Misses in library cache during parse: 0 Optimizer goal: CHOOSE Parsing user id: 183 (recursive depth: 1) ********************************************************************************
まず、ターゲットSQLのOutlineを作る。CREATE_STORED_OUTLINESフラグを立てて、Procedureを実行する。
ora817@robios.org> alter session set create_stored_outlines=true;
セッションが変更されました。
経過: 00:00:00.00
ora817@robios.org> exec process_hoge_transactions;
99000, HOGE
99001, HOGE
99002, HOGE
- 途中省略 -
99097, HOGE
99098, HOGE
99099, HOGE
PL/SQLプロシージャが正常に完了しました。
経過: 00:00:00.09
ora817@robios.org> alter session set create_stored_outlines=false;
セッションが変更されました。
経過: 00:00:00.00
ora817@robios.org> select ol_name, sql_text
2 from outln.ol$;
OL_NAME SQL_TEXT
------------------------------ ----------------------------------------
SYS_OUTLINE_040729043824572 SELECT * FROM HOGE_TRANSACTIONS
WHERE STATUS_CODE = :b1
経過: 00:00:00.02
次に、ターゲットSQLにヒントを埋め込み、索引が正しく使われるようにする。そしてそのSQLのOutlineを作成する。
ora817@robios.org> select /*+ RULE */ *
2 from hoge_transactions
3 where status_code = 1;
TRANSACTION_ID DATA STATUS_CODE
-------------- ---- -----------
99000 HOGE 1
99001 HOGE 1
99002 HOGE 1
- 途中省略 -
99097 HOGE 1
99098 HOGE 1
99099 HOGE 1
100行が選択されました。
経過: 00:00:03.03
実行計画
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=HINT: RULE
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'HOGE_TRANSACTIONS'
2 1 INDEX (RANGE SCAN) OF 'HOGE_TRANSACTIONS_N1' (NON-UNIQUE
)
統計
----------------------------------------------------------
0 recursive calls
0 db block gets
17 consistent gets
3 physical reads
0 redo size
2680 bytes sent via SQL*Net to client
396 bytes received via SQL*Net from client
9 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
100 rows processed
ora817@robios.org> create outline temp on
2 select /*+ RULE */ *
3 from hoge_transactions
4 where status_code = 1;
アウトラインが作成されました。
経過: 00:00:00.01
先ほどのOutlineと、今作成したOutlineを入れ替える。OL$のHINTCOUNTも忘れずに(値は前もって確認)。
ora817@robios.org> update outln.ol$hints
2 set ol_name = decode(ol_name, 'SYS_OUTLINE_040729043824572', 'TEMP',
3 'TEMP', 'SYS_OUTLINE_040729043824572')
4 where ol_name in ('SYS_OUTLINE_040729043824572', 'TEMP');
13行が更新されました。
経過: 00:00:00.01
ora817@robios.org> update outln.ol$
2 set hintcount = decode(ol_name, 'SYS_OUTLINE_040729043824572', 7,
3 'TEMP', 6)
4 where ol_name in ('SYS_OUTLINE_040729043824572', 'TEMP');
2行が更新されました。
経過: 00:00:00.01
ora817@robios.org> commit;
コミットが完了しました。
経過: 00:00:00.00
これで完了である。試しに、USE_STORED_OUTLINESフラグをオンにし、ヒント埋め込みバージョンを実行してみる。うまくいっていれば、全スキャンが行われるはずである。
ora817@robios.org> alter session set use_stored_outlines=true;
セッションが変更されました。
経過: 00:00:00.00
ora817@robios.org> select /*+ RULE */ *
2 from hoge_transactions
3 where status_code = 1;
TRANSACTION_ID DATA STATUS_CODE
-------------- ---- -----------
99000 HOGE 1
99001 HOGE 1
99002 HOGE 1
- 途中省略 -
99097 HOGE 1
99098 HOGE 1
99099 HOGE 1
100行が選択されました。
経過: 00:00:03.04
実行計画
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=HINT: RULE (Cost=39 Card=100 Byte
s=1600)
1 0 TABLE ACCESS (FULL) OF 'HOGE_TRANSACTIONS' (Cost=39 Card=1
00 Bytes=1600)
統計
----------------------------------------------------------
48 recursive calls
20 db block gets
264 consistent gets
252 physical reads
600 redo size
2727 bytes sent via SQL*Net to client
292 bytes received via SQL*Net from client
8 SQL*Net roundtrips to/from client
3 sorts (memory)
0 sorts (disk)
100 rows processed
全スキャンが行われている。次に本題のProcedureを実行し、トレースを取ってみる。
******************************************************************************** SELECT * FROM HOGE_TRANSACTIONS WHERE STATUS_CODE = :b1 call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.00 0.01 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 101 0.01 0.00 3 202 0 100 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 103 0.01 0.01 3 202 0 100 Misses in library cache during parse: 0 Optimizer goal: CHOOSE Parsing user id: 183 (recursive depth: 1) ********************************************************************************
索引が使用され、Disk IOが大幅に減ったのが分かっていただけると思う。
その他:
- PL/SQLで、定数として変数を宣言し、それを検索のキーとして使うのは避けるべきである。定数と宣言してもバインド変数となり、せっかくのヒストグラムが使用されない。上記Procedureで、STAUTS_CODE = 1と素直に書けば、ヒストグラムが使用され、索引検索が行われる。
- ヒント埋め込みバージョンSQLの作成は、今回の場合はヒストグラムがある為あえてRULEヒントを加える必要はない。
- 今回作成した表の、STATUS_CODEのようなCardinalityが非常に低い項目に索引を作成する場合、通常の索引ではなくビットマップ索引を作成すると効果的である。しかし、ビットマップ索引の場合、近いレコードへの同時更新が発生すると、ロックが発生するため注意が必要。
- USE_STORED_OUTLINESフラグを立てた場合、ハード解析時に、そのSQLのOutlineがOL$に定義されているかどうかを調べるため、OL$をHash Valueで検索する。そのため、多少のオーバーヘッドが生じることになる。オーバーヘッドはRecursive Callという形で現れる。このオーバーヘッドについての検証はいずれ。
TrackBack
Carol Garcia
Excerpt: New interesting theme
Weblog: Edward Martinez
Tracked: April 13, 2006 04:46 PM
Excerpt: New interesting theme
Weblog: Edward Martinez
Tracked: April 13, 2006 04:46 PM
Carol Garcia
Excerpt: Russian rape
Weblog: Edward Martinez
Tracked: April 20, 2006 02:55 AM
Excerpt: Russian rape
Weblog: Edward Martinez
Tracked: April 20, 2006 02:55 AM
Carol Garcia
Excerpt: Large girl
Weblog: Edward Martinez
Tracked: April 23, 2006 02:15 PM
Excerpt: Large girl
Weblog: Edward Martinez
Tracked: April 23, 2006 02:15 PM
Carol Garcia
Excerpt: Sex on web
Weblog: Edward Martinez
Tracked: April 26, 2006 05:15 PM
Excerpt: Sex on web
Weblog: Edward Martinez
Tracked: April 26, 2006 05:15 PM
Carol Garcia
Excerpt: Relagen
Weblog: Edward Martinez
Tracked: April 27, 2006 06:14 PM
Excerpt: Relagen
Weblog: Edward Martinez
Tracked: April 27, 2006 06:14 PM
Carol Garcia
Excerpt: Shemale stories
Weblog: Edward Martinez
Tracked: April 30, 2006 12:54 PM
Excerpt: Shemale stories
Weblog: Edward Martinez
Tracked: April 30, 2006 12:54 PM
Carol Garcia
Excerpt: Steroids
Weblog: Edward Martinez
Tracked: May 5, 2006 09:48 AM
Excerpt: Steroids
Weblog: Edward Martinez
Tracked: May 5, 2006 09:48 AM
Carol Garcia
Excerpt: Tramadol
Weblog: Edward Martinez
Tracked: May 5, 2006 06:08 PM
Excerpt: Tramadol
Weblog: Edward Martinez
Tracked: May 5, 2006 06:08 PM
Carol Garcia
Excerpt: Tramadol
Weblog: Edward Martinez
Tracked: May 7, 2006 03:28 AM
Excerpt: Tramadol
Weblog: Edward Martinez
Tracked: May 7, 2006 03:28 AM
Carol Garcia
Excerpt: Soma
Weblog: Edward Martinez
Tracked: May 7, 2006 11:48 AM
Excerpt: Soma
Weblog: Edward Martinez
Tracked: May 7, 2006 11:48 AM
buy vicodin online
Excerpt:
Weblog: buy vicodin online
Tracked: May 31, 2006 11:29 AM
Excerpt:
Weblog: buy vicodin online
Tracked: May 31, 2006 11:29 AM
buy viagra online
Excerpt:
Weblog: buy viagra online
Tracked: May 31, 2006 03:34 PM
Excerpt:
Weblog: buy viagra online
Tracked: May 31, 2006 03:34 PM
valium
Excerpt:
Weblog: valium
Tracked: June 1, 2006 10:52 AM
Excerpt:
Weblog: valium
Tracked: June 1, 2006 10:52 AM
xanax online
Excerpt:
Weblog: xanax online
Tracked: June 1, 2006 12:36 PM
Excerpt:
Weblog: xanax online
Tracked: June 1, 2006 12:36 PM
tamiflu
Excerpt:
Weblog: tamiflu
Tracked: June 13, 2006 04:35 PM
Excerpt:
Weblog: tamiflu
Tracked: June 13, 2006 04:35 PM
make some extra money
Excerpt: I don't really exist therefore I sing.
Weblog: make some extra money
Tracked: June 25, 2006 12:21 PM
Excerpt: I don't really exist therefore I sing.
Weblog: make some extra money
Tracked: June 25, 2006 12:21 PM
TrackBack URL for this entry:
http://www.robios.org/x/mt/mt-tb.cgi/22
http://www.robios.org/x/mt/mt-tb.cgi/22
Why at full validity of harm them and continue to apply in many areas of medicine and sports? WBR LeoP
Posted by: Kevin pharmacy at January 28, 2007 02:59 AMGood site. Thank you.
Posted by: cheap nexium at January 27, 2007 01:33 PMhttp://www.pharmcentral.org/product_nexium.htm generic nexium
Nice site. Thanks.
Posted by: generic zithromax at January 27, 2007 04:54 AMhttp://www.pharmcentral.org/product_zithromax.htm discount zithromax
Nice site. Thanks!
Posted by: your enlarge penis size at January 20, 2007 08:36 PMhttp://shrinkurl.us/0Pz your enlarge penis size
hrxuiqzt oxjr cwaprvt kqxeanrlz gkxcfjzuq xmklejyd jyvhucdfe http://www.vltbi.mgjuteov.com
Posted by: kbysnuif emktnhvac at December 30, 2006 05:45 PMudarg qfza ahnszqef ptqbahixy ejtpsc cwndf fzxlba
Posted by: uzitnra rvytlg at December 30, 2006 05:44 PMIf you laugh before breakfast you'll cry before supper... Dionisius
Posted by: Dionisius at November 30, 2006 05:45 AMlatina models lesbian licking free female masturbation videos fuck machines famous brunettes close up fucking black girls with big asses nude wrestling sex anime horny cheerleaders mother and son incest women rape shaved testicles teen cumshots sucking dick black girls with big asses gay male blowjobs bang bros britney spears boobs curves for women hidden girls shower cams sex in pantyhose breasts celebrities teen lesbians amateurs free brittany spears naked free sex movie free videos good sex gay black videos breast in teens sex pictures fat lesbians horny redheads hidden upskirt russian porn sexy swimsuit models hardcore mom sex moms xxx farm animal sex free adult pics women pissing blonde anal drunk girls micro bikinis naked babes latex fetish scat girl free pornstar videos mature mom indian pussy asian models pictures shemale free pics interracial breeding cuckold disney sex blonde lesbians free project voyeur
Posted by: porn search engines at November 25, 2006 09:34 AMLittle thieves are hanged, but great ones escape... William
Posted by: William at November 25, 2006 05:45 AMHe is lifeless that is faultless... Ferdinand
Posted by: Ferdinand at November 25, 2006 05:39 AMHe is lifeless that is faultless... Ferdinand
Posted by: Ferdinand at November 25, 2006 05:38 AMGreat barkers are no biters... Joshua
Posted by: Joshua at November 25, 2006 05:21 AMMore haste, less speed... Elizabeth
Posted by: Elizabeth at November 22, 2006 07:01 PMA good beginning makes a good ending... Elias
Posted by: Elias at November 22, 2006 06:53 PMA good beginning makes a good ending... Elias
Posted by: Elias at November 22, 2006 06:53 PMAll work and no play makes Jack a dull boy... Gabriel
Posted by: Gabriel at November 22, 2006 06:46 PMFine feathers make fine birds... Joseph
Posted by: Joseph at November 22, 2006 06:14 PMCross the stream where it is shallowest... Denton
Posted by: Denton at November 22, 2006 06:06 PMVery soon the Rabbit say to itself, I shall fall right THROUGH the earth! How funny it'll seem to dry me at all.' In that case, said in aout.
Posted by: instant credit card approval at April 29, 2006 07:24 PMMike Furir Mike 127
Posted by: Mike Furir 35 at April 12, 2006 10:44 PMMike Furir Mike 826
Posted by: Mike Furir 739 at March 8, 2006 06:29 AMMike Furir Mike 826
Posted by: Mike Furir 739 at March 8, 2006 06:28 AMMike Furir Mike 170
Posted by: Mike Furir 462 at March 8, 2006 06:28 AMOracle関連もっと増やして〜
Posted by: NomA at July 30, 2004 10:05 PM