Beacon Ora Perf Class 5

51
 2007-11-25 1 Beacon infotech Corporation www.oracleact.com Oracle Performance Tuning Tamilselvan G    B   e   a   c   o   n    I   n    f   o    t   e   c    h     C   o   r   p   o   r   a    t    i   o   n   C    l   a   s   s   -   5

description

Ora Perf Class 5

Transcript of Beacon Ora Perf Class 5

  • 2007-11-251

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning

    Tamilselvan G

    B

    e

    a

    c

    o

    n

    I

    n

    f

    o

    t

    e

    c

    h

    C

    o

    r

    p

    o

    r

    a

    t

    i

    o

    n

    C

    l

    a

    s

    s

    -

    5

  • 2007-11-252

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning

    Major Types of Indexes

    1. B*Tree Index it has subtype also.

    2. Index Organized Table

    3. Index Cluster

    4. Function Based Index

    5. Reverse Key Index

    6. Descending Index

    7. Bit Map Index

    8. Application Domain Index

    9. Intermedia Text Index

    10.R*Tree Index

    Major Types of Indexes

    1. B*Tree Index it has subtype also.

    2. Index Organized Table

    3. Index Cluster

    4. Function Based Index

    5. Reverse Key Index

    6. Descending Index

    7. Bit Map Index

    8. Application Domain Index

    9. Intermedia Text Index

    10.R*Tree Index

  • 2007-11-253

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning 1. B-Tree Index

    Index Block Structure

    Root Block

    Branch Block

    Leaf Block

    One column Index

    Three columns Index

    Low Level Processing

    Myths about Index

    Index Block Structure

    Root Block

    Branch Block

    Leaf Block

    One column Index

    Three columns Index

    Low Level Processing

    Myths about Index

  • 2007-11-254

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning

    B-Tree Index With Height 4

    Root Level 3

    Branch Level 2 Branch Level 2

    Branch Level 1 Branch Level 1 Branch Level 1 Branch Level 1

    Leaf Level 0

    Leaf Level 0

    Leaf Level 0

    Leaf Level 0

    Leaf Level 0

    Leaf Level 0

    Leaf Level 0

    Leaf Level 0

  • 2007-11-255

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    Columns Indexed:

    SQL> select index_name, column_name from

    user_ind_columns

    where index_name = 'SALES_IDX_2' ;

    INDEX_NAME COLUMN_NAME

    ------------------------------ -----------------

    SALES_IDX_2 STATE

    SALES_IDX_2 SALE_MONTH

    SALES_IDX_2 SALE_YEAR

    SALES_IDX_2 PROD_ID

    SALES_IDX_2 COMM_1

    SQL> analyze index sales_idx_2 validate structure ;

    Index analyzed.

    SQL> select /*+ full(a) parallel(a,8) */ count(*) from sales a;

    COUNT(*)

    ----------

    14,336,064

    SQL> select table_name, index_name from dba_indexes

    where table_name = 'SALES' ;

    TABLE_NAME INDEX_NAME

    ------------------------------ ------------------------------

    SALES SALES_IDX_2

    SQL> select data_object_id, object_id, object_name

    from dba_objects

    where object_name ='SALES_IDX_2' ;

    DATA_OBJECT_ID OBJECT_ID OBJECT_NAME

    -------------- ---------- -------------

    68475 68475 SALES_IDX_2

    SQL> select name, height, blocks, lf_blks, br_blks, DEL_LF_ROWS from index_stats ;

    NAME HEIGHT BLOCKS LF_BLKS BR_BLKS DEL_LF_ROWS

    ------------ ---------- ---------- ---------- ---------- -----------

    SALES_IDX_2 4 204800 150465 1431 0

  • 2007-11-256

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    Note:

    PCTFREE is not used in

    branch blocks, hence they

    are well packed.

    The index height is 4 as you

    see the highest level 3.

    104921610 is the root block

    and has 16 entries.

    Root and branch blocks do

    not have rrow.

    NROW is the number of

    slots in the block directory

    currently in use.

    RROW is the number that

    would be in use after all

    current transactions have

    committed and the block has

    been cleaned.

    SQL>alter session set events

    'immediate trace name treedump level 68475' ;

    *** 2006-05-22 13:17:48.900

    *** SESSION ID:(34.43482) 2006-05-22 13:17:48.886

    ----- begin tree dump

    branch: 0x640fa0a 104921610 (0: nrow: 16, level: 3)

    branch: 0x641277d 104933245 (-1: nrow: 107, level: 2)

    branch: 0x640fa76 104921718 (-1: nrow: 106, level: 1)

    leaf: 0x640fa0b 104921611 (-1: nrow: 95 rrow: 95)

    leaf: 0x640fa0c 104921612 (0: nrow: 95 rrow: 95)

    leaf: 0x640fa0d 104921613 (1: nrow: 95 rrow: 95)

    leaf: 0x640fa0e 104921614 (2: nrow: 95 rrow: 95)

    leaf: 0x640fa0f 104921615 (3: nrow: 95 rrow: 95)

    (Few lines are deleted )

    branch: 0x640fae3 104921827 (0: nrow: 108, level: 1)

    leaf: 0x640fa75 104921717 (-1: nrow: 95 rrow: 95)

    leaf: 0x640fa77 104921719 (0: nrow: 95 rrow: 95)

    leaf: 0x640fa78 104921720 (1: nrow: 95 rrow: 95)

    ( lines are deleted)

    leaf: 0x6414591 104940945 (70: nrow: 95 rrow: 95)

    leaf: 0x6414592 104940946 (71: nrow: 77 rrow: 77)

    ----- end tree dump

  • 2007-11-257

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    Let use study the root block, 104921610.

    To get the file # and block #, use DBMS_UTILITY package.

    SQL> begin

    2 dbms_output.put_line(

    3 dbms_utility.data_block_address_file(dba =>104921610 )

    4 );

    5 dbms_output.put_line(

    6 dbms_utility.data_block_address_block(dba =>104921610 )

    7 );

    8 end;

    9 /

    25 ------- File #

    64010 ------- Block #

  • 2007-11-258

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    SQL> alter system dump datafile 25 block 64010 ;

    *** 2006-05-22 13:26:39.747

    *** SESSION ID:(34.43484) 2006-05-22 13:26:39.746

    Start dump data blocks tsn: 11 file#: 25 minblk 64010 maxblk 64010

    buffer tsn: 11 rdba: 0x0640fa0a (25/64010)

    scn: 0x0000.066ce790 seq: 0x01 flg: 0x06 tail: 0xe7900601

    frmt: 0x02 chkval: 0x7a20 type: 0x06=trans data

    Block header dump: 0x0640fa0a

    Object id on Block? Y

    seg/obj: 0x10b7b csc: 0x00.66ce78f itc: 1 flg: - typ: 2 - INDEX

    fsl: 0 fnx: 0x0 ver: 0x01

    Itl Xid Uba Flag Lck Scn/Fsc

    0x01 0x0002.016.000091ff 0x00800052.1052.06 --U- 1 fsc 0x0000.066ce790

    Branch block dump

    =================

    ITL Interested Transaction List

    Xid Transaction ID

    Uba Undo block address

    Flag LCk - Flag and Lock Info

    Fsc SCN of transaction

    Note: The root block has only one ITL.

    Rdba Relative data block address

    Scn - System change number

    Seq - Number of block changes

    Seg/obj Object id

    Typ Segment type (2 for b*tree index)

  • 2007-11-259

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    Branch block dump ( Logically ROOT BLOCK)

    =================

    header address 4565966916=0x110272044

    kdxcolev 3 ----------- Current Index Level

    KDXCOLEV Flags = - - -

    kdxcolok 1 --------- indicates brock transaction is happening

    kdxcoopc 0x81: opcode=1: iot flags=--- is converted=Y --- internal operation code

    kdxconco 6 --- Index column count

    kdxcosdc 0 --- count of index structural changes involving block

    kdxconro 15 ----- Number of entries

    kdxcofbo 58=0x3a --- offset to beginning of free space within a block

    kdxcofeo 6947=0x1b23 -- offset to end of free space

    kdxcoavs 6889 -- available space in a block

    kdxbrlmc 104933245=0x641277d ---- First Branch block at level 2

    kdxbrsno 14 --- last index entry to be modified

    kdxbrbksz 8056 -------------- Usable Space available for entries

    row#0[7981] dba: 109289103=0x6839e8f ------- 2

    nd

    branch block at level 2

    col 0; len 2; (2): 46 4c

    col 1; len 2; (2): c1 03

    col 2; len 3; (3): c2 15 02

    col 3; len 2; (2): c2 02

    col 4; len 50; (50):

    78 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20

    20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20

    col 5; len 6; (6): 03 80 47 2a 00 10

    (few lines are omitted)

  • 2007-11-2510

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    Continued from previous page

    row#1[7908] dba: 92529418=0x583e30a

    col 0; len 2; (2): 46 4c

    col 1; len 2; (2): c1 08

    col 2; len 3; (3): c2 15 02

    col 3; len 2; (2): c2 02

    col 4; len 50; (50):

    78 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20

    20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20

    col 5; len 4; (4): 04 81 23 90

    (few lines are omitted)

    row#14[6947] dba: 104940948=0x6414594

    col 0; len 2; (2): 53 43

    col 1; len 2; (2): c1 0b

    col 2; len 3; (3): c2 15 03

    col 3; len 2; (2): c2 02

    col 4; len 50; (50):

    78 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20

    20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20

    col 5; len 4; (4): 04 81 1c c0

    ----- end of branch block dump -----

    End dump data blocks tsn: 11 file#: 25 minblk 64010 maxblk 64010

  • 2007-11-2511

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    Similarly, you can

    get LEVEL 1

    information.

    Get the LEVEL 2 only from treedump

    $ grep "level: 2" sales_idx_2_treedump.trc

    branch: 0x641277d 104933245 (-1: nrow: 107, level: 2)

    branch: 0x6839e8f 109289103 (0: nrow: 75, level: 2)

    branch: 0x583e30a 92529418 (1: nrow: 106, level: 2)

    branch: 0x641e4b3 104981683 (2: nrow: 96, level: 2)

    branch: 0x583b16c 92516716 (3: nrow: 107, level: 2)

    branch: 0x641a4f5 104965365 (4: nrow: 62, level: 2)

    branch: 0x6837f68 109281128 (5: nrow: 107, level: 2)

    branch: 0x6c3cb73 113494899 (6: nrow: 63, level: 2)

    branch: 0x640f564 104920420 (7: nrow: 107, level: 2)

    branch: 0x64238df 105003231 (8: nrow: 57, level: 2)

    branch: 0x640c2fb 104907515 (9: nrow: 106, level: 2)

    branch: 0x683c79f 109299615 (10: nrow: 55, level: 2)

    branch: 0x6409104 104894724 (11: nrow: 106, level: 2)

    branch: 0x6420feb 104992747 (12: nrow: 80, level: 2)

    branch: 0x6c3b178 113488248 (13: nrow: 107, level: 2)

    branch: 0x6414594 104940948 (14: nrow: 73, level: 2)

  • 2007-11-2512

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    Single

    Column

    Index

  • 2007-11-2513

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    The tree dump shows:

    *** 2006-05-20 23:40:27.776

    *** SESSION ID:(34.33892) 2006-05-20 23:40:27.775

    ----- begin tree dump

    branch: 0x742260a 121775626 (0: nrow: 8, level: 1)

    leaf: 0x742260b 121775627 (-1: nrow: 4 rrow: 4)

    leaf: 0x742260c 121775628 (0: nrow: 4 rrow: 4)

    leaf: 0x742260d 121775629 (1: nrow: 4 rrow: 4)

    leaf: 0x742260e 121775630 (2: nrow: 4 rrow: 4)

    leaf: 0x742260f 121775631 (3: nrow: 4 rrow: 4)

    leaf: 0x7422610 121775632 (4: nrow: 4 rrow: 4)

    leaf: 0x7422611 121775633 (5: nrow: 4 rrow: 4)

    leaf: 0x7422612 121775634 (6: nrow: 2 rrow: 2)

    ----- end tree dump

    Since the number of entries are only 30, there is no

    branch blocks.

    Let us first build a table and an index

    create table my_table2

    as

    select rownum + 30000 id,

    rpad('x',150,'x') some

    from dba_objects where rownum

  • 2007-11-2514

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    Branch block dump

    =================

    header address

    4565966916=0x110272044

    kdxcolev 1

    KDXCOLEV Flags = - - -

    kdxcolok 0

    kdxcoopc 0x80: opcode=0: iot flags=---

    is converted=Y

    kdxconco 2

    kdxcosdc 0

    kdxconro 7

    kdxcofbo 42=0x2a

    kdxcofeo 7986=0x1f32

    kdxcoavs 7944

    kdxbrlmc 121775627=0x742260b

    kdxbrsno 0

    kdxbrbksz 8056

    Where 121775627 is the first leaf block.

    Branch (in this case root) block dump

    *** 2006-05-20 23:42:51.375

    *** SESSION ID:(34.33895) 2006-05-20 23:42:51.374

    Start dump data blocks tsn: 10 file#: 29 minblk 140810 maxblk

    140810

    buffer tsn: 10 rdba: 0x0742260a (29/140810)

    scn: 0x0000.06762c36 seq: 0x01 flg: 0x00 tail: 0x2c360601

    frmt: 0x02 chkval: 0x0000 type: 0x06=trans data

    Block header dump: 0x0742260a

    Object id on Block? Y

    seg/obj: 0x10b96 csc: 0x00.6762c34 itc: 1 flg: - typ: 2 - INDEX

    fsl: 0 fnx: 0x0 ver: 0x01

    Itl Xid Uba Flag Lck Scn/Fsc

    0x01 0xffff.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.06762c34

    --- continued --

    Key Value is NOT stored for the first block in the branch.

  • 2007-11-2515

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    SQL> select id, dump(id, 16)

    from my_table2 ;

    ID DUMP(ID,16)

    ------ ------------------------------

    30001 Typ=2 Len=4: c3,4,1,2

    30002 Typ=2 Len=4: c3,4,1,3

    30003 Typ=2 Len=4: c3,4,1,4

    30004 Typ=2 Len=4: c3,4,1,5

    30005 Typ=2 Len=4: c3,4,1,6

    30006 Typ=2 Len=4: c3,4,1,7

    30007 Typ=2 Len=4: c3,4,1,8

    30008 Typ=2 Len=4: c3,4,1,9

    30009 Typ=2 Len=4: c3,4,1,a

    30010 Typ=2 Len=4: c3,4,1,b

    30011 Typ=2 Len=4: c3,4,1,c

    30012 Typ=2 Len=4: c3,4,1,d

    30013 Typ=2 Len=4: c3,4,1,e

    30014 Typ=2 Len=4: c3,4,1,f

    30015 Typ=2 Len=4: c3,4,1,10

    --------

    -------

    30029 Typ=2 Len=4: c3,4,1,1e

    30030 Typ=2 Len=4: c3,4,1,1f

    30 rows selected.

    Branch (in this case root) block dump

    row#0[8046] dba: 121775628=0x742260c 2

    nd

    leaf block

    col 0; len 4; (4): c3 04 01 06 --- Only Index key value is stored

    col 1; TERM

    row#1[8036] dba: 121775629=0x742260d

    col 0; len 4; (4): c3 04 01 0a

    col 1; TERM

    row#2[8026] dba: 121775630=0x742260e

    col 0; len 4; (4): c3 04 01 0e

    col 1; TERM

    row#3[8016] dba: 121775631=0x742260f

    col 0; len 4; (4): c3 04 01 12

    col 1; TERM

    row#4[8006] dba: 121775632=0x7422610

    col 0; len 4; (4): c3 04 01 16

    col 1; TERM

    row#5[7996] dba: 121775633=0x7422611

    col 0; len 4; (4): c3 04 01 1a

    col 1; TERM

    row#6[7986] dba: 121775634=0x7422612

    col 0; len 4; (4): c3 04 01 1e

    col 1; TERM

    ----- end of branch block dump -----

    End dump data blocks tsn: 10 file#: 29 minblk 140810 maxblk 140810

  • 2007-11-2516

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    Let us study one of the leaf block, 121775628 :

    *** 2006-05-20 23:49:17.760

    *** SESSION ID:(34.33911) 2006-05-20 23:49:17.740

    Start dump data blocks tsn: 10 file#: 29 minblk 140812 maxblk 140812

    buffer tsn: 10 rdba: 0x0742260c (29/140812)

    scn: 0x0000.06762c35 seq: 0x02 flg: 0x04 tail: 0x2c350602

    frmt: 0x02 chkval: 0xd2d4 type: 0x06=trans data

    Block header dump: 0x0742260c

    Object id on Block? Y

    seg/obj: 0x10b96 csc: 0x00.6762c34 itc: 2 flg: - typ: 2 - INDEX

    fsl: 0 fnx: 0x0 ver: 0x01

    Itl Xid Uba Flag Lck Scn/Fsc

    0x01 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000

    0x02 0xffff.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.06762c34

    By default 2 ITL slots (INITRAN 2) are created in the leaf block.

  • 2007-11-2517

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    leaf block, 121775628 continued .

    Leaf block dump

    ===============

    header address 4565966940=0x11027205c

    kdxcolev 0

    KDXCOLEV Flags = - - -

    kdxcolok 0

    kdxcoopc 0x80: opcode=0: iot flags=--- is converted=Y

    kdxconco 2

    kdxcosdc 0

    kdxconro 4

    kdxcofbo 44=0x2c

    kdxcofeo 7976=0x1f28

    kdxcoavs 7932

    kdxlespl 0

    kdxlende 0

    kdxlenxt 121775629=0x742260d -------- Pointer to previous block

    kdxleprv 121775627=0x742260b -------- Pointer to Next Block

    kdxledsz 0

    kdxlebksz 8032

    Branch blocks do not

    participate in the range scan

    because of the pointers

    stored in the leaf blocks

  • 2007-11-2518

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    leaf block, 121775628 continued .

    row#0[8018] flag: -----, lock: 0

    col 0; len 4; (4): c3 04 01 06

    col 1; len 6; (6): 04 83 b6 0a 00 04 --- ROWID

    row#1[8004] flag: -----, lock: 0

    col 0; len 4; (4): c3 04 01 07

    col 1; len 6; (6): 04 83 b6 0a 00 05

    row#2[7990] flag: -----, lock: 0

    col 0; len 4; (4): c3 04 01 08

    col 1; len 6; (6): 04 83 b6 0a 00 06

    row#3[7976] flag: -----, lock: 0

    col 0; len 4; (4): c3 04 01 09

    col 1; len 6; (6): 04 83 b6 0a 00 07

    ----- end of leaf block dump -----

    End dump data blocks tsn: 10 file#: 29 minblk 140812 maxblk 140812

    SQL> select id, dump(id,16) , dump(rowid,16) from my_table2

    where id = 30005

    ID DUMP(ID,16) DUMP(ROWID,16)

    ------ ------------------------------ ----------------------------------------

    30005 Typ=2 Len=4: c3,4,1,6 Typ=69 Len=10: 0,1,b,94,4,83,b6,a,0,4

    Oracle still uses

    restricted ROWID

    in the index.

  • 2007-11-2519

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    Three

    Column

    Index

  • 2007-11-2520

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    Tree dump for the index:

    ----- begin tree dump

    branch: 0x483840a 75727882 (0: nrow: 4, level: 1)

    leaf: 0x483840b 75727883 (-1: nrow: 3 rrow: 3)

    leaf: 0x483840c 75727884 (0: nrow: 3 rrow: 3)

    leaf: 0x483840d 75727885 (1: nrow: 3 rrow: 3)

    leaf: 0x483840e 75727886 (2: nrow: 1 rrow: 1)

    ----- end tree dump

    Let us first build a table and an index

    create table my_table (id number(5), name varchar2(10),

    some_txt varchar2(150)) ;

    insert into my_table values (15001, 'TAMIL', rpad('x',150,'x'));

    insert into my_table values (15002, 'SCOTT', rpad('x',150,'x'));

    insert into my_table values (15003, 'TANDON', rpad('x',150,'x'));

    insert into my_table values (15004, 'KUMAR', rpad('x',150,'x'));

    insert into my_table values (15005, 'PALANI', rpad('x',150,'x'));

    insert into my_table values (15006, 'SIVA', rpad('x',150,'x'));

    insert into my_table values (15007, 'SUDA', rpad('x',150,'x'));

    insert into my_table values (15008, 'APPULLY', rpad('x',150,'x'));

    insert into my_table values (15009, 'MANOJ', rpad('x',150,'x'));

    insert into my_table values (15010, 'MIKE', rpad('x',150,'x'));

    commit;

    create index my_table_idx on my_table ( name, id, some_txt)

    pctfree 90;

  • 2007-11-2521

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    Branch block dump

    =================

    header address

    4565966916=0x110272044

    kdxcolev 1

    KDXCOLEV Flags = - - -

    kdxcolok 0

    kdxcoopc 0x80: opcode=0: iot

    flags=--- is converted=Y

    kdxconco 4

    kdxcosdc 0

    kdxconro 3

    kdxcofbo 34=0x22

    kdxcofeo 8031=0x1f5f

    kdxcoavs 7997

    kdxbrlmc 75727883=0x483840b

    kdxbrsno 0

    kdxbrbksz 8056

    Branch block, 75727882 details are given below:

    *** 2006-05-20 23:21:17.952

    *** SESSION ID:(34.33844) 2006-05-20 23:21:17.951

    Start dump data blocks tsn: 10 file#: 18 minblk 230410 maxblk 230410

    buffer tsn: 10 rdba: 0x0483840a (18/230410)

    scn: 0x0000.067620be seq: 0x01 flg: 0x00 tail: 0x20be0601

    frmt: 0x02 chkval: 0x0000 type: 0x06=trans data

    Block header dump: 0x0483840a

    Object id on Block? Y

    seg/obj: 0x10b93 csc: 0x00.67620bd itc: 1 flg: - typ: 2 - INDEX

    fsl: 0 fnx: 0x0 ver: 0x01

    Itl Xid Uba Flag Lck Scn/Fsc

    0x01 0xffff.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.067620bd

  • 2007-11-2522

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    Branch block, 75727882 details are given below:

    row#0[8048] dba: 75727884=0x483840c

    col 0; len 2; (2): 4d 49

    col 1; TERM

    row#1[8040] dba: 75727885=0x483840d

    col 0; len 2; (2): 53 49

    col 1; TERM

    row#2[8031] dba: 75727886=0x483840e

    col 0; len 3; (3): 54 41 4e

    col 1; TERM

    ----- end of branch block dump -----

    End dump data blocks tsn: 10 file#: 18 minblk 230410 maxblk 230410

    Note: Watch out TERM in the branch data. Available space was 7997.

    Roughly, 480 bytes (3 * 160) is needed for 3 entries in the branch block.

    My assumption is: Oracle either compress all the key values or use

    some hash value to store it in the col 1.

  • 2007-11-2523

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    Branch block, 75727882 details are given below:

    SQL>select id, name, dump(id,16), dump(name,16) from my_table ;

    ID NAME DUMP(ID,16) DUMP(NAME,16)

    ---------- ---------- ---------------------- ---------------------------------

    15001 TAMIL Typ=2 Len=4: c3,2,33,2 Typ=1 Len=5: 54,41,4d,49,4c

    15002 SCOTT Typ=2 Len=4: c3,2,33,3 Typ=1 Len=5: 53,43,4f,54,54

    15003 TANDON Typ=2 Len=4: c3,2,33,4 Typ=1 Len=6: 54,41,4e,44,4f,4e

    15004 KUMAR Typ=2 Len=4: c3,2,33,5 Typ=1 Len=5: 4b,55,4d,41,52

    15005 PALANI Typ=2 Len=4: c3,2,33,6 Typ=1 Len=6: 50,41,4c,41,4e,49

    15006 SIVA Typ=2 Len=4: c3,2,33,7 Typ=1 Len=4: 53,49,56,41

    15007 SUDA Typ=2 Len=4: c3,2,33,8 Typ=1 Len=4: 53,55,44,41

    15008 APPULLY Typ=2 Len=4: c3,2,33,9 Typ=1 Len=7: 41,50,50,55,4c,4c,59

    15009 MANOJ Typ=2 Len=4: c3,2,33,a Typ=1 Len=5: 4d,41,4e,4f,4a

    15010 MIKE Typ=2 Len=4: c3,2,33,b Typ=1 Len=4: 4d,49,4b,45

    10 rows selected.

  • 2007-11-2524

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    Leaf block dump

    ===============

    header address

    4565966940=0x11027205c

    kdxcolev 0

    KDXCOLEV Flags = - - -

    kdxcolok 0

    kdxcoopc 0x80: opcode=0: iot

    flags=--- is converted=Y

    kdxconco 4

    kdxcosdc 0

    kdxconro 3

    kdxcofbo 42=0x2a

    kdxcofeo 7516=0x1d5c

    kdxcoavs 7474

    kdxlespl 0

    kdxlende 0

    kdxlenxt 75727885=0x483840d

    kdxleprv 75727883=0x483840b

    kdxledsz 0

    kdxlebksz 8032

    Leaf block, 75727884 details are given below:

    *** SESSION ID:(34.33829) 2006-05-20 23:08:06.927

    Start dump data blocks tsn: 10 file#: 18 minblk 230412 maxblk

    230412

    buffer tsn: 10 rdba: 0x0483840c (18/230412)

    scn: 0x0000.067620be seq: 0x02 flg: 0x04 tail: 0x20be0602

    frmt: 0x02 chkval: 0xf11d type: 0x06=trans data

    Block header dump: 0x0483840c

    Object id on Block? Y

    seg/obj: 0x10b93 csc: 0x00.67620bd itc: 2 flg: - typ: 2 -

    INDEX

    fsl: 0 fnx: 0x0 ver: 0x01

    Itl Xid Uba Flag Lck Scn/Fsc

    0x01 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000

    0x02 0xffff.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.067620bd

  • 2007-11-2525

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    Leaf block, 75727884 details are given below:

    row#0[7861] flag: -----, lock: 0

    col 0; len 4; (4): 4d 49 4b 45 --- MIKE

    col 1; len 4; (4): c3 02 33 0b --- 15010

    col 2; len 150; (150):

    78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78

    78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78

    78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78

    78 78 78 78 78 78 78 78

    78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78

    col 3; len 6; (6): 07 c0 32 0a 00 09

    row#1[7688] flag: -----, lock: 0

    col 0; len 6; (6): 50 41 4c 41 4e 49

    col 1; len 4; (4): c3 02 33 06

    col 2; len 150; (150):

    78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78

    78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78

    78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78

    78 78 78 78 78 78 78 78

    78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78

    col 3; len 6; (6): 07 c0 32 0a 00 04

    row#2[7516] flag: -----, lock: 0

    col 0; len 5; (5): 53 43 4f 54 54 --- SCOTT

    col 1; len 4; (4): c3 02 33 03 --- 15002

    col 2; len 150; (150):

    78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78

    78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78

    78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78

    78 78 78 78 78 78 78 78

    78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78

    col 3; len 6; (6): 07 c0 32 0a 00 01

    ----- end of leaf block dump -----

    End dump data blocks tsn: 10 file#: 18 minblk 230412 maxblk 230412

  • 2007-11-2526

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    Low Level

    Processing

  • 2007-11-2527

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    SQL> select object_id,

    object_name from user_objects

    where object_name in

    ('MY_TABLE',

    'MY_TABLE_IDX');

    OBJECT_ID OBJECT_NAME

    ---------- -------------

    68504 MY_TABLE_IDX

    68503 MY_TABLE

    A. Inserting New Entry in a Leaf Block

    When Free Space is Available

    create table my_table

    (id number(5),

    name varchar2(10),

    some_txt varchar2(150)) ;

    insert into my_table values (15001, 'A_TAMIL', rpad('x',150,'x'));

    insert into my_table values (15002, 'A_SCOTT', rpad('x',150,'x'));

    insert into my_table values (15003, 'A_TANDON', rpad('x',150,'x'));

    insert into my_table values (15004, 'B_KUMAR', rpad('x',150,'x'));

    insert into my_table values (15005, 'B_PALANI', rpad('x',150,'x'));

    insert into my_table values (15006, 'B_SIVA', rpad('x',150,'x'));

    insert into my_table values (15010, 'D_MIKE', rpad('x',150,'x'));

    commit;

    create index my_table_idx on my_table

    ( name, id, some_txt)

    pctfree 90;

  • 2007-11-2528

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    Get a treedump

    SQL> alter system set events 'immediate trace name

    treedump level 68504';

    *** 2006-05-22 20:36:11.414

    *** SESSION ID:(34.45136) 2006-05-22 20:36:11.391

    ----- begin tree dump

    branch: 0x483840a 75727882 (0: nrow: 3, level: 1)

    leaf: 0x483840b 75727883 (-1: nrow: 3 rrow: 3) -- for Name starting A_XXXX

    leaf: 0x483840c 75727884 (0: nrow: 3 rrow: 3) -- for Name starting B_XXXX

    leaf: 0x483840d 75727885 (1: nrow: 1 rrow: 1) -- for Name starting D_XXXX

    ----- end tree dump

    Now I am going to insert one row and let see what happens in the index leaf

    blocks.

  • 2007-11-2529

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    SQL> insert into my_table values (15007, 'B_RAJA', rpad('x',150,'x'));

    SQK> Commit;

    SQL> alter system set events 'immediate trace name treedump level 68504';

    *** SESSION ID:(34.45141) 2006-05-22 20:42:43.420

    ----- begin tree dump

    branch: 0x483840a 75727882 (0: nrow: 3, level: 1)

    leaf: 0x483840b 75727883 (-1: nrow: 3 rrow: 3)

    leaf: 0x483840c 75727884 (0: nrow: 4 rrow: 4) --- From 3 it went to 4

    leaf: 0x483840d 75727885 (1: nrow: 1 rrow: 1)

    ----- end tree dump

    Since the new key value start with B_xxxx, it went to the block, 75727884.

    All the leaf blocks have lot of free space because I used PCTFREE 90.

  • 2007-11-2530

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    Now I am going to insert one row with NAME starting with C_XXXX and lets

    see what happens in the index leaf blocks.

    SQL> insert into my_table values (15008, 'C_KANNAN', rpad('x',150,'x')) ;

    SQL> commit;

    SQL> alter system set events 'immediate trace name treedump level 68504';

    *** 2006-05-22 20:47:46.475

    *** SESSION ID:(34.45144) 2006-05-22 20:47:46.474

    ----- begin tree dump

    branch: 0x483840a 75727882 (0: nrow: 3, level: 1)

    leaf: 0x483840b 75727883 (-1: nrow: 3 rrow: 3)

    leaf: 0x483840c 75727884 (0: nrow: 5 rrow: 5) --- the block has now 5 rows.

    leaf: 0x483840d 75727885 (1: nrow: 1 rrow: 1)

    ----- end tree dump

    Note: Before inserting a new entry in a leaf block, Oracle has to find out the

    highest block just lower than the incoming value.

    This is one of reasons why FREELIST parameter should not be set more than 1

    for indexes.

  • 2007-11-2531

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    select object_id,

    object_name

    from user_objects

    where object_name in

    ('MY_TABLE',

    'MY_TABLE_IDX');

    OBJECT_ID OBJECT_NAME

    ---------- ---------------

    68510 MY_TABLE_IDX

    68509 MY_TABLE

    B. A. Inserting New Entry in a Leaf Block

    When Free Space is NOT Available

    create table my_table (id number(5), name varchar2(10),

    some_txt varchar2(2500)) ;

    insert into my_table values (50001, 'A_TAMIL', rpad('x',2500,'x'));

    insert into my_table values (50002, 'A_SCOTT', rpad('x',2500,'x'));

    insert into my_table values (50003, 'A_TANDON', rpad('x',2500,'x'));

    insert into my_table values (50004, 'B_KUMAR', rpad('x',2500,'x'));

    insert into my_table values (50005, 'B_PALANI', rpad('x',2500,'x'));

    insert into my_table values (50006, 'B_SIVA', rpad('x',2500,'x'));

    insert into my_table values (50010, 'D_MIKE', rpad('x',2500,'x'));

    commit;

    create index my_table_idx on my_table

    ( name, id, some_txt)

    pctfree 5;

    SQL> alter system set events 'immediate trace name treedump level 68510' ;

    System altered.

  • 2007-11-2532

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    B. INSERTING NEW ENTRY IN A LEAF BLOCK

    WHEN FREE SPACE IS NOT AVAILABLE

    Treedump

    *** 2006-05-22 21:09:04.691

    *** SESSION ID:(34.45223) 2006-05-22 21:09:04.690

    ----- begin tree dump

    branch: 0x483840a 75727882 (0: nrow: 3, level: 1)

    leaf: 0x483840b 75727883 (-1: nrow: 3 rrow: 3)

    leaf: 0x483840c 75727884 (0: nrow: 3 rrow: 3)

    leaf: 0x483840d 75727885 (1: nrow: 1 rrow: 1)

    ----- end tree dump

    Now I insert a row that has a name starting with C_XXXX and

    let us see what happens to the index leaf blocks.

    SQL> insert into my_table values (50007, 'C_SUBBU', rpad('x',2500,'x'));

    1 row created.

    SQL> commit;

    Commit complete.

  • 2007-11-2533

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    B. INSERTING NEW ENTRY IN A LEAF BLOCK

    WHEN FREE SPACE IS NOT AVAILABLE

    SQL> alter system set events 'immediate trace name treedump level 68510' ;

    *** 2006-05-22 21:14:21.568

    *** SESSION ID:(34.45226) 2006-05-22 21:14:21.567

    ----- begin tree dump

    branch: 0x483840a 75727882 (0: nrow: 4, level: 1)

    leaf: 0x483840b 75727883 (-1: nrow: 3 rrow: 3)

    leaf: 0x483840c 75727884 (0: nrow: 3 rrow: 3)

    leaf: 0x483840e 75727886 (1: nrow: 1 rrow: 1) ---- NEW BLOCK ADDED

    leaf: 0x483840d 75727885 (2: nrow: 1 rrow: 1)

    ----- end tree dump

    Even though the block 75727885 has only one row (for Name D_MIKE),

    Oracle will not use that block for the new entry (NAME C_SUBBU) because it

    always try to find the highest block just lower than the incoming value. Hence,

    finally Oracle added a new block 75727886 for C_SUBBU.

  • 2007-11-2534

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    Low Level

    Split

    Processing

  • 2007-11-2535

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    SQL> select object_id,

    object_name from

    user_objects where

    object_name in

    ('MY_TABLE',

    'MY_TABLE_IDX') ;

    OBJECT_ID OBJECT_NAME

    ---------- ----------------

    68510 MY_TABLE_IDX

    68509 MY_TABLE

    C. 50:50 Split OR 90:10 Split or 99:1 Split.

    SQL> select id, name from my_table;

    ID NAME

    ---------- ----------

    50001 A_TAMIL

    50002 A_SCOTT

    50003 A_TANDON

    50004 B_KUMAR

    50005 B_PALANI

    50006 B_SIVA

    50010 D_MIKE

    50007 C_SUBBU

    8 rows selected.

    Inserting highest value in the first leaf block.

    SQL> insert into my_table values (50051, 'A_ZORNO', rpad('x',2500,'x'));

    1 row created.

    SQL> commit;

    Commit complete.

  • 2007-11-2536

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    C. 50:50 Split OR 90:10 Split or 99:1 Split.

    SQL> alter system set events 'immediate trace name treedump level 68510';

    TREEDUMP

    *** 2006-05-22 22:27:39.089

    *** SESSION ID:(34.45529) 2006-05-22 22:27:39.087

    ----- begin tree dump

    branch: 0x483840a 75727882 (0: nrow: 5, level: 1)

    leaf: 0x483840b 75727883 (-1: nrow: 3 rrow: 3) --- Original Block Not changed

    leaf: 0x483840f 75727887 (0: nrow: 1 rrow: 1) ---- New Block for A_ZORNO

    leaf: 0x483840c 75727884 (1: nrow: 3 rrow: 3)

    leaf: 0x483840e 75727886 (2: nrow: 1 rrow: 1)

    leaf: 0x483840d 75727885 (3: nrow: 1 rrow: 1)

    ----- end tree dump

    In this case it is 99:1 Split (Shall we call 90:10 Split ?)

  • 2007-11-2537

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    C. 50:50 Split OR 90:10 Split or 99:1 Split.

    Inserting lowest value.

    SQL> insert into my_table values (50052, 'A_BABU', rpad('x', 2500,'x')) ;

    1 row created.

    SQL> commit;

    Commit complete.

    TREEDUMP

    *** 2006-05-22 22:34:41.973

    *** SESSION ID:(34.45531) 2006-05-22 22:34:41.972

    ----- begin tree dump

    branch: 0x483840a 75727882 (0: nrow: 6, level: 1)

    leaf: 0x483840b 75727883 (-1: nrow: 2 rrow: 2) -- Original row

    leaf: 0x4838410 75727888 (0: nrow: 2 rrow: 2) --- New Block added

    leaf: 0x483840f 75727887 (1: nrow: 1 rrow: 1)

    leaf: 0x483840c 75727884 (2: nrow: 3 rrow: 3)

    leaf: 0x483840e 75727886 (3: nrow: 1 rrow: 1)

    leaf: 0x483840d 75727885 (4: nrow: 1 rrow: 1)

    ----- end tree dump

    When lowest

    value is

    inserted,

    Oracle splits

    the entries in

    the block into

    50:50.

  • 2007-11-2538

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    SQL> select object_id,

    object_name from user_objects

    where object_name in

    ('MY_TABLE',

    'MY_TABLE_IDX') ;

    OBJECT_ID OBJECT_NAME

    ---------- ---------------

    68514 MY_TABLE_IDX

    68513 MY_TABLE

    C. 50:50 Split OR 90:10 Split or 99:1 Split.

    I recreated the table.

    SQL> select id, name from my_table;

    ID NAME

    ---------- ----------

    50001 A_ANBU

    50002 A_SCOTT

    50003 A_TANDON

    50004 B_KUMAR

    50005 B_PALANI

    50006 B_SIVA

    50010 D_MIKE

    7 rows selected.

    SQL> alter system set events 'immediate trace name

    treedump level 68514 ';

  • 2007-11-2539

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    C. 50:50 Split OR 90:10 Split or 99:1 Split.

    Original Treedump:

    *** 2006-05-22 22:44:39.085

    *** SESSION ID:(34.45564) 2006-05-22 22:44:39.083

    ----- begin tree dump

    branch: 0x483840a 75727882 (0: nrow: 3, level: 1)

    leaf: 0x483840b 75727883 (-1: nrow: 3 rrow: 3)

    leaf: 0x483840c 75727884 (0: nrow: 3 rrow: 3)

    leaf: 0x483840d 75727885 (1: nrow: 1 rrow: 1)

    ----- end tree dump

    Inserted a row after A_BABU.

    SQL> insert into my_table values (50051, 'A_EDWARD', rpad('x',2500,'x'));

    1 row created.

    SQL> commit;

    Commit complete.

  • 2007-11-2540

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    C. 50:50 Split OR 90:10 Split or 99:1 Split.

    New Treedump:

    *** 2006-05-22 22:48:27.509

    *** SESSION ID:(34.45570) 2006-05-22 22:48:27.508

    ----- begin tree dump

    branch: 0x483840a 75727882 (0: nrow: 4, level: 1)

    leaf: 0x483840b 75727883 (-1: nrow: 3 rrow: 3)

    leaf: 0x483840e 75727886 (0: nrow: 1 rrow: 1) --------- New block added

    leaf: 0x483840c 75727884 (1: nrow: 3 rrow: 3)

    leaf: 0x483840d 75727885 (2: nrow: 1 rrow: 1)

    ----- end tree dump

    Lets see what is in the new block.

    90:10 or

    99:1 Split

    happened

    when a

    middle

    value is

    inserted.

  • 2007-11-2541

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    C. 50:50 Split OR 90:10 Split or 99:1 Split.

    SQL> begin

    2 dbms_output.put_line(

    3 dbms_utility.data_block_address_file(dba=>75727886)

    4 );

    5 dbms_output.put_line(

    6 dbms_utility.data_block_address_block(dba=>75727886)

    7 );

    8 end;

    9 /

    18 --- File #

    230414 --- Block #

    Get the block dump

    SQL> alter system dump datafile 18 block 230414 ;

    System altered.

  • 2007-11-2542

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    C. 50:50 Split OR 90:10 Split or 99:1 Split.

    +46 kdxlenxt 75727884=0x483840c Partial dump

    +47 kdxleprv 75727883=0x483840b

    +48 kdxledsz 0

    +49 kdxlebksz 8032

    +50 row#0[5507] flag: -----, lock: 0

    +51 col 0; len 8; (8): 41 5f 54 41 4e 44 4f 4e -- A_TANDON

    +52 col 1; len 4; (4): c3 06 01 04

    +53 col 2; len 2500; (2500):

    +54 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78

    +55 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78

    (a lot of rows are deleted for readability)

    +56 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78

    +57 col 3; len 6; (6): 07 c0 32 0b 00 00

    +58 ----- end of leaf block dump -----

    +59 End dump data blocks tsn: 10 file#: 18 minblk 230414 maxblk 230414

    When a middle value is inserted and there is NO free space

    in the block, then Oracle splits the block into 90:10 (99:1).

  • 2007-11-2543

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    declare

    M number ;

    N Number := 200001;

    begin

    For M in 100001 .. 200000 LOOP

    N := N - 1;

    insert into my_table (id1,name, id2)

    values

    (M, 'XXXXXX', N);

    commit;

    END LOOP;

    end;

    /

    spool off

    Note: M is increasing and N is

    a decreasing.

    D. Does the arrival of rows matter

    leaf blocks?

    The answer is YES.

    create table my_table

    (id1 number(6),

    name varchar2(10),

    id2 number(6) );

    create index my_table_idx_1 on

    my_table (id1) pctfree 10;

    create index my_table_idx_2 on

    my_table (id2) pctfree 10;

    SQL> select min(id1), max(id1), min(id2), max(id2) from my_table;

    MIN(ID1) MAX(ID1) MIN(ID2) MAX(ID2)

    ---------- ---------- ---------- ----------

    100001 200000 100001 200000

  • 2007-11-2544

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    SQL> select count(*) from my_table;

    COUNT(*)

    ----------

    100000

    SQL> analyze index my_table_idx_1 validate structure;

    Index analyzed.

    SQL> select name, blocks, lf_blks, br_blks, distinct_keys from index_stats;

    NAME BLOCKS LF_BLKS BR_BLKS DISTINCT_KEYS

    -------------- ---------- ---------- ---------- -------------

    MY_TABLE_IDX_1 12800 394 1 100000

    SQL> analyze index my_table_idx_2 validate structure;

    Index analyzed.

    SQL> select name, blocks, lf_blks, br_blks, distinct_keys from index_stats;

    NAME BLOCKS LF_BLKS BR_BLKS DISTINCT_KEYS

    -------------- ---------- ---------- ---------- -------------

    MY_TABLE_IDX_2 12800 406 1 100000

    Note:

    394 leaf

    blocks for

    the

    ascending

    sequence vs

    406 leaf

    blocks for

    the

    descending

    seq. The

    difference is

    not much.

  • 2007-11-2545

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    declare

    M number ;

    N Number := 200001;

    begin

    For M in 100001 .. 300000 LOOP

    N := N - 1;

    insert into my_table (id1,name, id2)

    values

    (M, 'XXXXXX', N);

    commit;

    END LOOP;

    end;

    /

    spool off

    E. Deleted space is not reused?

    This is a myth.

    create table my_table

    (id1 number(6),

    name varchar2(10),

    id2 number(6) );

    create index my_table_idx_1 on

    my_table (id1) pctfree 10;

    SQL> analyze index my_table_idx_1

    validate structure ;

    SQL> select name, blocks, lf_blks, br_blks, distinct_keys from index_stats;

    NAME BLOCKS LF_BLKS BR_BLKS DISTINCT_KEYS

    ------------------------------ ---------- ---------- ---------- -------------

    MY_TABLE_IDX_1 12800 400 1 200000

  • 2007-11-2546

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    E. Deleted space is not reused?

    Now I delete 50 % of the rows.

    SQL> delete my_table where id1 commit;

    Commit complete.

    SQL> analyze index my_table_idx_1 validate structure ;

    Index analyzed.

    SQL> select name, blocks, lf_blks, br_blks, del_lf_rows from index_stats;

    NAME BLOCKS LF_BLKS BR_BLKS DEL_LF_ROWS

    ------------------------------ ---------- ---------- ---------- -----------

    MY_TABLE_IDX_1 12800 400 1 86500

    I insert 100,000 rows but with different values for ID1

    SQL> declare

    M number ;

    N Number := 200001;

    begin

    For M in 300001 .. 400000 LOOP

    N := N - 1;

    insert into my_table (id1,name, id2) values (M, 'XXXXXX', N);

    END LOOP;

    commit;

    end;

    /

  • 2007-11-2547

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    E. Deleted space is not reused?

    SQL> analyze index my_table_idx_1 validate structure ;

    Index analyzed.

    SQL> select name, blocks, lf_blks, br_blks, del_lf_rows , distinct_keys, pct_used

    from index_stats;

    NAME BLOCKS LF_BLKS BR_BLKS DEL_LF_ ROWS DISTINCT_KEYS PCT_USED

    -------------- ---------- ---------- ---------- ----------- ------------- ----------

    MY_TABLE_IDX_1 12800 404 1 1000 201000 100

    You see the number of leaf blocks did not increase by 50%. All the

    available free leaf blocks are reused.

    PCT_USED column in INDEX_STATS does not tell you the truth

    because it assumes that the blocks which are in the FREELIST are

    also used by leaf blocks. Hence, we got 100 % PCT_USED.

  • 2007-11-2548

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    SQL> select

    distinct id1

    from my_table;

    ID1

    ----------

    0

    1

    2

    3

    4

    F. Most distinct column should be the first column in

    a composite index.

    This is another myth.

    There is not truth in it. If the optimizer computes low

    cost for an indexed access path, it would use it.

    The following example will disprove the myth.

    create table my_table as

    select mod(rownum,5) id1, -- 5 distinct values

    mod(rownum,50) id2, -- 50 distinct values

    rownum id3, --- very high distinct values

    rpad('x',300,'x') sometxt

    from dba_objects;

    create index my_table_idx_low on my_table(id1, id2, id3) ;

    analyze table my_table compute statistics

    for table for all indexes for all indexed columns size 1;

  • 2007-11-2549

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    F. Most distinct column should be the first column in a composite

    index.

    SQL> select * from my_table where id1= 2 and id2 = 29 and id3 = 100 ;

    Execution Plan

    ----------------------------------------------------------

    0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=160)

    1 0 TABLE ACCESS (BY INDEX ROWID) OF 'MY_TABLE' (Cost=2 Card=1 Bytes=160)

    2 1 INDEX (RANGE SCAN) OF 'MY_TABLE_IDX_LOW' (NON-UNIQUE) (Cost=1 Card=1)

    As you see the LOW cardinality index is being used.

    Another example:

    SQL> select * from my_table where id2 = 10 and id3 between 200 and 300 ;

    Execution Plan

    ----------------------------------------------------------

    0 SELECT STATEMENT Optimizer=CHOOSE (Cost=12 Card=2 Bytes=320)

    1 0 TABLE ACCESS (BY INDEX ROWID) OF 'MY_TABLE' (Cost=12 Card=2 Bytes=320)

    2 1 INDEX (SKIP SCAN) OF 'MY_TABLE_IDX_LOW' (NON-UNIQUE) (Cost=6 Card=2)

    I could re-state the statement as:

    Use a column in a composite index as a leading column if most of the

    queries have predicates of that column.

  • 2007-11-2550

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning B-Tree Index

    Why is NOT my index being used by the Optimizer?

    There are several reasons for an index not being used by the Optimizer.

    Some of them are:

    1. Wrong Index Hint

    2. Column is NULL in the WHERE Clause

    3. Table and Indexes are not analyzed properly or analyzed with low

    estimate or statistics are out of date

    4. Column is checked with different data type example Date_column =

    12-31-2005 or varchar2_column = 12

    5. A function is used on the indexed column

    6. Optimizer computes cost of FULL table scan is cheaper than cost of

    indexed access path

    7. Leading column of a composite index is not used in the predicate.

  • 2007-11-2551

    Beacon infotech Corporation

    www.oracleact.com

    Oracle Performance Tuning