« 述語 ;) | トップページ | 述語のつづきの続き。 »

2012年4月27日 (金)

述語 ;) のつづき

さて、前回のつづきです。

以下のようにtable full scanになっちゃってるのをもうちょっといい感じにチューニングするには? ってとこまででした。

わかっちゃったもんね〜〜〜〜〜〜の方〜〜〜〜〜〜〜っ。 沢山いるようですね。頼もしいです:)

赤字で示した部分が重要なんですよーーーー。TO_CHAR()関数が使われていて述語プッシュでうまく索引が利用できないのが原因なんですよ。

22:52:28 SCOTT> set autot trace exp stat
22:52:34 SCOTT>
22:52:35 SCOTT>
22:52:35 SCOTT> l
1 select
2 t1.id
3 ,t1.data
4 ,t1.ctr
5 from
6 (
7 select
8 to_char(t0.id) as id
9 ,data
10 ,count(1) as ctr
11 from
12 push_pred_tab1 t0
13 group by
14 t0.id
15 ,t0.data
16 ) t1
17 where
18 t1.id between 1 and 20
19 order by
20* t1.id
22:52:38 SCOTT> /

20行が選択されました。

経過: 00:00:00.07

実行計画
----------------------------------------------------------
Plan hash value: 62726154

--------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU) | Time |
--------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 250 | 123K| 1950 (1)| 00:00:24 |
| 1 | SORT ORDER BY | | 250 | 123K| 1950 (1)| 00:00:24 |
| 2 | HASH GROUP BY | | 250 | 123K| 1950 (1)| 00:00:24 |
|* 3 | TABLE ACCESS FULL| PUSH_PRED_TAB1 | 250 | 123K| 1948 (1)| 00:00:24 |
--------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

3 - filter(TO_NUMBER(TO_CHAR("T0"."ID"))>=1 AND
TO_NUMBER(TO_CHAR("T0"."ID"))<=20)


統計
----------------------------------------------------------
1 recursive calls
0 db block gets
7184 consistent gets
0 physical reads
0 redo size
11132 bytes sent via SQL*Net to client
530 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
20 rows processed

改善後、述語が副問合せにプッシュされて索引レンジスキャンになってます :) めでたしめでたしなんですが 例があれなんで、次回はもう少し本物っぽいのでやってみますね。

 22:54:14 SCOTT> 
22:54:15 SCOTT> l
1 select
2 to_char(t1.id) as id
3 ,t1.data
4 ,t1.ctr
5 from
6 (
7 select
8 t0.id
9 ,data
10 ,count(1) as ctr
11 from
12 push_pred_tab1 t0
13 group by
14 t0.id
15 ,t0.data
16 ) t1
17 where
18 t1.id between 1 and 20
19 order by
20* t1.id
22:54:15 SCOTT> /

20行が選択されました。

経過: 00:00:00.00

実行計画
----------------------------------------------------------
Plan hash value: 1209889820

--------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 20 | 10120 | 5 (20)| 00:00:01 |
| 1 | SORT GROUP BY | | 20 | 10120 | 5 (20)| 00:00:01 |
| 2 | TABLE ACCESS BY INDEX ROWID| PUSH_PRED_TAB1 | 20 | 10120 | 4 (0)| 00:00:01 |
|* 3 | INDEX RANGE SCAN | PK_PUSH_PRED_TAB1 | 20 | | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

3 - access("T0"."ID">=1 AND "T0"."ID"<=20)



統計
----------------------------------------------------------
1 recursive calls
0 db block gets
4 consistent gets
0 physical reads
0 redo size
11132 bytes sent via SQL*Net to client
530 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
20 rows processed

22:54:17 SCOTT>

ということで次回へつづく。


ここまでのあらすじ

述語 ;)

|

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/106341/54568478

この記事へのトラックバック一覧です: 述語 ;) のつづき:

コメント

コメントを書く