January 2007
Sun Mon Tue Wed Thu Fri Sat
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Search


Sections
Oracle Article Summary
Categories
Apple   [2 items]
Cinema   [82 items]
Lambda   [2 items]
Oracle   [12 items]
Podcasting   [1 items]
Archives
February 2006
January 2006
December 2005
November 2005
October 2005
September 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
Links
robios.org -annex-
鮎の詰め合わせ
ぞうパラ
Jasi's Blog
ぱんでもにぅむ・ぶろぐ
へべれけ
Recent Entries
ミュンヘン - Munich
博士の愛した数式
プルーフ・オブ・マイ・ライフ - Proof
ディック&ジェーン 復讐は最高! - Fun with Dick and Jane
恋の門
Mr. & Mrs. スミス - Mr. & Mrs. Smith
SAYURI - Memoirs of Geisha
ハリー・ポッターと炎のゴブレット - Harry Potter and the Goblet of Fire
エリザベスタウン - Elizabethtown
ALWAYS 三丁目の夕日
Recent TrackBacks
business
(business, Aug 5)

make some extra money
(make some extra money , Jun 25)

tamiflu
(tamiflu, Jun 13)

xanax online
(xanax online, Jun 1)

valium
(valium, Jun 1)

buy viagra online
(buy viagra online, May 31)

buy vicodin online
(buy vicodin online, May 31)

rape porn
(gang rape, May 23)

Carol Garcia
(Edward Martinez, May 7)

Carol Garcia
(Edward Martinez, May 7)

Syndicate
Syndicate this site (XML)

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
Carol Garcia
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
Carol Garcia
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
Carol Garcia
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
Carol Garcia
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
Carol Garcia
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
buy viagra online
Excerpt:
Weblog: buy viagra online
Tracked: May 31, 2006 03:34 PM
valium
Excerpt:
Weblog: valium
Tracked: June 1, 2006 10:52 AM
xanax online
Excerpt:
Weblog: xanax online
Tracked: June 1, 2006 12:36 PM
tamiflu
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
business
Excerpt: business
Weblog: business
Tracked: August 5, 2006 03:20 PM
TrackBack URL for this entry:
http://www.robios.org/x/mt/mt-tb.cgi/22
Comments

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 AM

Good site. Thank you.
http://www.pharmcentral.org/product_nexium.htm generic nexium

Posted by: cheap nexium at January 27, 2007 01:33 PM

Nice site. Thanks.
http://www.pharmcentral.org/product_zithromax.htm discount zithromax

Posted by: generic zithromax at January 27, 2007 04:54 AM

Nice site. Thanks!
http://shrinkurl.us/0Pz your enlarge penis size

Posted by: your enlarge penis size at January 20, 2007 08:36 PM

hrxuiqzt oxjr cwaprvt kqxeanrlz gkxcfjzuq xmklejyd jyvhucdfe http://www.vltbi.mgjuteov.com

Posted by: kbysnuif emktnhvac at December 30, 2006 05:45 PM

udarg qfza ahnszqef ptqbahixy ejtpsc cwndf fzxlba

Posted by: uzitnra rvytlg at December 30, 2006 05:44 PM

If you laugh before breakfast you'll cry before supper... Dionisius

Posted by: Dionisius at November 30, 2006 05:45 AM

latina 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 AM

Little thieves are hanged, but great ones escape... William

Posted by: William at November 25, 2006 05:45 AM

He is lifeless that is faultless... Ferdinand

Posted by: Ferdinand at November 25, 2006 05:39 AM

He is lifeless that is faultless... Ferdinand

Posted by: Ferdinand at November 25, 2006 05:38 AM

Great barkers are no biters... Joshua

Posted by: Joshua at November 25, 2006 05:21 AM

More haste, less speed... Elizabeth

Posted by: Elizabeth at November 22, 2006 07:01 PM

A good beginning makes a good ending... Elias

Posted by: Elias at November 22, 2006 06:53 PM

A good beginning makes a good ending... Elias

Posted by: Elias at November 22, 2006 06:53 PM

All work and no play makes Jack a dull boy... Gabriel

Posted by: Gabriel at November 22, 2006 06:46 PM

Fine feathers make fine birds... Joseph

Posted by: Joseph at November 22, 2006 06:14 PM

Cross the stream where it is shallowest... Denton

Posted by: Denton at November 22, 2006 06:06 PM

Very 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 PM

Mike Furir Mike 127

Posted by: Mike Furir 35 at April 12, 2006 10:44 PM

Mike Furir Mike 826

Posted by: Mike Furir 739 at March 8, 2006 06:29 AM

Mike Furir Mike 826

Posted by: Mike Furir 739 at March 8, 2006 06:28 AM

Mike Furir Mike 170

Posted by: Mike Furir 462 at March 8, 2006 06:28 AM

Oracle関連もっと増やして〜

Posted by: NomA at July 30, 2004 10:05 PM
Post a comment









Remember personal info?






Creative Commons License This weblog is licensed under a Creative Commons License.