goals for tuning

Upload: vamsi-srimathirumala

Post on 05-Apr-2018

217 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/31/2019 Goals for Tuning

    1/22

    Goals for Tuning.

    February 13, 2011 bysamadhan

    Objectives of Tuning the System:

    The objectives of tuning a system can be either anyone of the two below.

    1)To reduce the response time for end users of the system. Take it as a special care if your

    database response time is not optimal.

    2)To reduce the resources used to process the same work. Take it as special care if you havelimited hardware resource.

    We can achieve both our objectives in three ways.

    A)Reduce the Workload: SQL tuning commonly involves finding more efficient ways to

    process the same workload. It is possible to change the execution plan of the statement withoutaltering the functionality to reduce the resource consumption.

    B) Balance the Workload: Systems often tend to have peak usage in the daytime when realusers are connected to the system, and low usage in the nighttime. If noncritical reports and batch

    jobs can be scheduled to run in the nighttime and their concurrency during day time reduced,

    then it frees up resources for the more critical programs in the day.

    C) Parallelize the Workload: Queries that access large amounts of data (typical data warehouse

    queries) often can be parallelized. This is extremely useful for reducing the response time in low

    concurrency data warehouse. However, for OLTP environments, which tend to be high

    concurrency, this can adversely impact other users by increasing the overall resource usage ofthe program.

    Three basic steps of SQL tuning.

    February 13, 2011 bysamadhan

    Probably you have heard many times about performance tuning of Oracle. And one of the major

    part of performance tuning is to tune the SQL statement so that it generates better execution plan

    and performs well. It will be easy to tune the SQL statements if we remember three basic steps of

    SQL tuning. The three basic steps of SQL tuning is listed here.

    Step1: At first we need to identified the high load SQLs or top SQLs that are responsible forperformance problem or in another word the sql that consume application workload and system

    resources. We can easily identify them by reviewing past SQL execution history available in the

    system.

    http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/
  • 7/31/2019 Goals for Tuning

    2/22

    Step 2: Now generate execution plan of those high load sql statements and verify that the

    execution plans produced by the query optimizer for these statements perform reasonably.

    Step 3: Implement corrective actions to generate better execution plans for poorly performing

    SQL statements. While taking corrective actions there is many considerations. Hopefully I will

    discuss these consideration in my blogs one by another.

    The possible causes for Excessive Undo generation

    February 13, 2011 bysamadhan

    1)Transactions with huge undo.

    -It is obvious to see high undo usage when there are huge transactions. If that is going to be the

    case this growth should be expected behavior.

    2)The Higher value setting of UNDO_RETENTION.The higher value of UNDO_RETENTION will increase much undo. As it cant be marked undoextents as EXPIRED till the duration of the UNDO_RETENTION.

    3)Autoextensible mode of Undo data files.

    Disabling the auto extensible mode of the datafiles of active undo tablespace will reuse the

    UNEXPIRED extents when undo tablespace suffer in space pressure.If they are set to autoextensible, it will not reuse the space for the new transaction. In such scenarios new transaction

    will allocate a space and your undo tablespace will start growing.

    4)Undo tablespace is using Autoallocate option:-UNDO is using auto allocate option of LMT. As the number of the extents goes up, the extentsize will be increased too.When the number is extents reaches hundred the extent size will be

    bigger. If it reaches thousands it will be even more bigger.If you know the size

    Troubleshoot unusable Index in Oracle

    February 13, 2011 bysamadhan

    If a procedural object, such as a stored PL/SQL function or a view, becomes invalid, the DBA

    does not necessarily have to do anything: the first time it is accessed, Oracle will attempt to

    recompile it, and this may well succeed.

    But if an index becomes unusable for any reason, it must always be repaired explicitly before itcan be used.

    http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/
  • 7/31/2019 Goals for Tuning

    3/22

    This is because an index consists of the index key values, sorted into order, each with the

    relevantrowid. The rowid is the physical pointer to the location of the row to which the index key refers.

    If the rowids of the table are changed, then the index will be marked as unusable. This could

    occur for a number of reasons. Perhaps the most common is that the table has been moved, withthe ALTER TABLEMOVE command. This will change the physical placement of all the

    rows, and therefore the index entries will be pointing to the wrong place. Oracle will be aware ofthis and will therefore not permit use of the index.

    Identifying Unusable Indexes

    In earlier releases of the Oracle database, when executing SQL statements, if the session

    attempted to use an unusable index it would immediately return an error, and the statement

    would fail. Release 10g of the database changes this behavior. If a statement attempts to use anunusable index, the statement will revert to an execution plan that does not require the index.

    Thus, statements will always succeedbut perhaps at the cost of greatly reduced performance.

    This behavior is controlled by the instance parameter SKIP_UNUSABLE_INDEXES, which

    defaults to TRUE. The exception to this is if the index is necessary to enforce a constraint: if the

    index on a primary key column becomes unusable, the table will be locked for DML.

    To detect indexes which have become unusable, query the DBA_INDEXES view:

    SQL> select owner, index_name from dba_indexes where status=UNUSABLE;

    Repairing Unusable Indexes

    -

    To repair the index, it must be re-created with the ALTER INDEXREBUILD command.

    This will make a pass through the table, generating a new index with correct rowid pointers

    for each index key. When the new index is completed, the original unusable index is dropped.

    The syntax of the REBUILD command has several options. The more important ones areTABLESPACE, ONLINE, and NOLOGGING. By default, the index will be rebuilt within its

    current tablespace, but by specifying a table space with the TABLESPACE keyword, it can be

    moved to a different one.

    Also by default, during the course of the rebuild the table will be locked for DML. This can beavoided by using the ONLINE keyword.

    1)Create Table and insert row in it:

    -

    SQL> create table test ( a number primary key); Table created.

  • 7/31/2019 Goals for Tuning

    4/22

    SQL> insert into test values(1);1 row created.

    SQL> commit;Commit complete.

    2)Check the Index Status

    SQL> select index_name, status from user_indexes;INDEX_NAME STATUS

    SYS_C0044513 VALID

    3)Move the Table and Check Status:

    SQL> alter table test move;

    Table altered.

    SQL> select index_name, status from user_indexes;INDEX_NAME STATUS

    SYS_C0044513 UNUSABLE

    4)Rebuild The Index:

    SQL> alter index SYS_C0044514 rebuild online;Index altered.

    SQL> select index_name, status from user_indexes;INDEX_NAME STATUS

    SYS_C0044514 VALID

    Improve INSERT Performance in oracle

    February 14, 2011 bysamadhan

    One day we had an issue to increase the speed of insert statements. This activity was carried out

    at our one of the bank client. We had to insert about 500K record to database as quickly aspossible. We were inserting at a rate of 10 records/sec. Well, I was thinking the following

    approaches to gain speed-

    1. Use a large blocksizeBy defining large (i.e. 16k or 32k) blocksizes for the target tables, we

    can reduce I/O because more rows fit onto a block before a block full condition (as set byPCTFREE) unlinks the block from the freelist.

    http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/
  • 7/31/2019 Goals for Tuning

    5/22

    >DROP TABLESPACE sam_tbs INCLUDING CONTENTS AND DATAFILES;

    >CREATE TABLESPACE sam_tbs DATAFILE /mnt/extra/test1.dbf SIZE 1024MAUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED blocksize 16K;

    2. Increase the size of UNDO tablespace -

    >CREATE UNDO TABLESPACE UNDOTBS DATAFILE /mnt/extra/test_undo1.dbf SIZE200M BLOCKSIZE 16K;

    >alter system set undo_tablespace=UNDOTBS scope=both;

    >DROP TABLESPACE UNDOTBSP1 INCLUDING CONTENTS AND DATAFILES;

    3. APPEND into tablesBy using the APPEND hint, it ensures that Oracle always grabs fresh

    data blocks by raising the high-water-mark for the table.

    >insert /*+ append */ into customer values (hello,;there);

    4. Table into NOLOGGING modePutting the table into NOLOGGING mode, which willallow Oracle to avoid almost all redo logging.

    >SELECT logging FROM user_tables WHERE table_name = LOGIN;

    >ALTER TABLE login NOLOGGING;

    Again, to enable logging -

    >ALTER TABLE login LOGGING;

    5. Disable/drop indexesIts far faster to rebuild indexes after the data load, all at-once. Also

    indexes will rebuild cleaner, and with less I/O if they reside in a tablespace with a large block

    size.

    6. Parallelize the loadWe can invoke parallel DML (i.e. using the PARALLEL and APPENDhint) to have multiple inserts into the same table. For this INSERT optimization, make sure to

    define multiple freelists and use the SQL APPEND option.

    Latch Contention in Oracle

    February 14, 2011 bysamadhan

    What is Latch?

    Well, the hardware definition of latch isa window or door lock. The electronic definition oflatch isan electronic circuit used to store information.

    Then what is Latch in Oracle? Very uncommon as the problem is super sophisticated.

    http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/
  • 7/31/2019 Goals for Tuning

    6/22

    Latch is one kind of very quick (could be acquired and released in nanoseconds) lock or

    serialization mechanism (makes more sense) to protect Oracles shared memory in SGA.Basically latch protects the same area of SGA being updated by more than one process.

    Now question comes, what are protected and why?

    Each Oracle operation needs to read and update SGA. For example

    1. When a query reads a block from disk, it will modify a free block in buffer cache and adjust

    the buffer cache LRU chain2. When a new SQL statement is parsed, it will be added to the library cache within SGA

    3. When DML issued and modifications are made in blocks, changes are placed in redo buffer

    4. Database writer periodically (after commit, after SCN change or after each 3 sec) writes

    buffers from memory to disk and updates their status from dirty to clean.5. Redo log writer writes blocks from redo buffer to redo logs.

    Latch prevents any of these operations from colliding and possibly corrupting the SGA.

    If the specific latch is already in use by another process, oracle will retry very frequently with acumulative delay up to certain times (controlled by hidden parameter) called spin count. First

    time one process fails to acquire the latch, it will attempt to awaken after 10 milliseconds up to

    its spin count. Subsequent waits will increase in durationmight be seconds in extreme cases.

    This affects response time and throughput.

    Most common type latch is Cache Buffer Latch and Cache buffer LRU chain latch which are

    caused for highly accessing blocks, called hot blocks. Contention on these latches is typicallycaused by concurrent access to a very hot block. The most common type of such hot block is

    index root or block branch.

    Optimize Data Access Path in Oracle

    February 14, 2011 bysamadhan

    To achieve optimum performance for data-intensive queries, materialized views and indexes are

    essential when tuning SQL statements. The SQL Access Advisor enables to optimize data accesspaths of SQL queries by recommending the proper set of materialized views, materialized view

    logs, and indexes for a given workload.

    A materialized view provides access to table data by storing the results of a query in a separateschema object. A materialized view contains the rows resulting from a query against one or more

    base tables or views.

    A materialized view log is a schema object that records changes to a master tables data, so that a

    materialized view defined on the master table can be refreshed incrementally.

    http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/
  • 7/31/2019 Goals for Tuning

    7/22

    The SQL Access Advisor also recommends bitmap, function-based, and B-tree indexes. A

    bitmap index provides a reduced response time for many types of ad hoc queries and reducedstorage requirements compared to other indexing techniques. A functional index derives the

    indexed value from the table data. For example, to find character data in mixed cases, a

    functional index can be used to look for the values as if they were all in uppercase characters.

    When you would make Index and when not

    February 14, 2011 bysamadhan

    * Create an index if you frequently want to retrieve less than 15% of the rows in a large table.* To improve performance on joins of multiple tables, index columns used for joins.

    * Small tables do not require indexes.

    Some columns are strong candidates for indexing. Columns with one or more of the following

    characteristics are candidates for indexing:

    * Values are relatively unique in the column.

    * There is a wide range of values (good for regular indexes).* There is a small range of values (good for bitmap indexes).

    * The column contains many nulls, but queries often select all rows having a value. In this case,

    use the following phrase:

    WHERE COL_X > -9.99 * power(10,125)

    Using the preceding phrase is preferable to:

    WHERE COL_X IS NOT NULL

    This is because the first uses an index on COL_X (assuming that COL_X is a numeric column).

    Columns with the following characteristics are less suitable for indexing:

    * There are many nulls in the column and you do not search on the not null values.

    The size of a single index entry cannot exceed roughly one-half (minus some overhead) of the

    available space in the data block.

    Other Considerations:

    1. The order of columns in the CREATE INDEX statement can affect query performance. Ingeneral, specify the most frequently used columns first.If you create a single index across

    columns to speed up queries that access, for example, col1, col2, and col3; then queries that

    access just col1, or that access just col1 and col2, are also speeded up. But a query that accessedjust col2, just col3, or just col2 and col3 does not use the index.

    http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/
  • 7/31/2019 Goals for Tuning

    8/22

    2. There is a trade-off between the speed of retrieving data from a table and the speed of

    updating the table. For example, if a table is primarily read-only, having more indexes can beuseful; but if a table is heavily updated, having fewer indexes could be preferable.

    3. Drop Index that are no longer required.

    4. Using different tablespaces (on different disks) for a table and its index produces betterperformance than storing the table and index in the same tablespace. Disk contention is reduced.

    Sample Table Scans in Oracle

    February 14, 2011 bysamadhan

    A sample table scan retrieves a random sample of data from a simple table or a complexSELECT statement, such as a statement involving joins and views.

    This access path is used when a statements FROM clause includes the SAMPLE clause or theSAMPLE BLOCK clause.

    To perform a sample table scan when sampling by rows with the SAMPLE clause, Oracle reads

    a specified percentage of rows in the table.

    To perform a sample table scan when sampling by blocks with the SAMPLE BLOCK clause,Oracle reads a specified percentage of table blocks.

    Example:

    -

    SQL> select * from test_skip_scan sample(.2);20 rows selected.

    Execution Plan

    -

    Plan hash value: 571935661

    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

    | 0 | SELECT STATEMENT | | 20 | 180 | 6 (0)| 00:00:01 || 1 | TABLE ACCESS SAMPLE| TEST_SKIP_SCAN | 20 | 180 | 6 (0)| 00:00:01 |

    Sample Table Scans in Oracle

    What and when Index Scans is used

    http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/2011/02/14/sample-table-scans-in-oracle/http://samadhandba.wordpress.com/2011/02/14/sample-table-scans-in-oracle/http://samadhandba.wordpress.com/2011/02/14/sample-table-scans-in-oracle/http://samadhandba.wordpress.com/2011/02/16/what-and-when-index-scans-is-used/http://samadhandba.wordpress.com/2011/02/16/what-and-when-index-scans-is-used/http://samadhandba.wordpress.com/2011/02/16/what-and-when-index-scans-is-used/http://samadhandba.wordpress.com/2011/02/14/sample-table-scans-in-oracle/http://samadhandba.wordpress.com/author/samadhandba/
  • 7/31/2019 Goals for Tuning

    9/22

    Index Skip, Full, Fast Full Index, Index Joins Bitmap

    Indexes Scan

    February 16, 2011 bysamadhan

    A)Index Skip Scan

    -As the name suggest index skip scan does not scan complete index. But it scan of the subindexes.

    Index skip scan lets a composite index be split logically into smaller subindexes. In skip

    scanning, the initial column of the composite index is not specified in the query. In other words,

    it is skipped.

    The number of logical subindexes is determined by the number of distinct values in the initial

    column. Skip scanning is advantageous if there are few distinct values in the leading column of

    the composite index and many distinct values in the nonleading key of the index.

    Suppose if I make a make a composite index with two columns sex and id. The leading columnsex contains only two distinct columns. Now if I query with non-leading column that is with id

    column then index skip scan will be used.

    Example:

    SQL> create table test_skip_scan (sex varchar2(1), id number, address varchar2(20));Table created.

    SQL> create index test_skip_scan_I on test_skip_scan(sex,id);Index created.

    SQL> begin

    for i in 1 .. 10000

    loop

    insert into test_skip_scan

    values(decode(remainder(abs(round(dbms_random.value(2,20),0)),2),0,M',F'),i,null);

    end loop;

    end;

    /PL/SQL procedure successfully completed.

    SQL> analyze table test_skip_scan estimate statistics;Table analyzed.

    SQL> select * from test_skip_scan where id=1;

    http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/
  • 7/31/2019 Goals for Tuning

    10/22

    Execution Plan

    -Plan hash value: 2410156502

    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

    | 0 | SELECT STATEMENT | | 1 | 9 | 4 (0)| 00:00:01 || 1 | TABLE ACCESS BY INDEX ROWID| TEST_SKIP_SCAN | 1 | 9 | 4 (0)| 00:00:01 |

    |* 2 | INDEX SKIP SCAN | TEST_SKIP_SCAN_I | 1 | | 3 (0)| 00:00:01 |

    Predicate Information (identified by operation id):

    2access(ID=1)

    filter(ID=1)

    B)Index Fast Full Scan

    Fast full index scans are an alternative to a full table scan when the index contains all thecolumns that are needed for the query, and at least one column in the index key has the NOT

    NULL constraint.

    A fast full scan accesses the data in the index itself, without accessing the table.

    It cannot be used to eliminate a sort operation, because the data is not ordered by the index key.

    It reads the entire index using multiblock reads, unlike a full index scan, and can be parallelized.

    Fast full index scans cannot be performed against bitmap indexes.

    You can specify fast full index scans with the initialization parameter

    OPTIMIZER_FEATURES_ENABLE or the INDEX_FFS hint.

    Example:

    SQL> select /*+INDEX_FFS(test_skip_scan)*/ sex,id from test_skip_scan;

    10000 rows selected.

    Execution Plan

    -Plan hash value: 4280781105

  • 7/31/2019 Goals for Tuning

    11/22

    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

    | 0 | SELECT STATEMENT | | 10000 | 40000 | 7 (0)| 00:00:01 |

    | 1 | INDEX FAST FULL SCAN| TEST_SKIP_SCAN_I | 10000 | 40000 | 7 (0)| 00:00:01 |

    C)Index Joins

    -An index join is a hash join of several indexes that together contain all the table columns that arereferenced in the query. If an index join is used, then no table access is needed, because all the

    relevant column values can be retrieved from the indexes. An index join cannot be used to

    eliminate a sort operation.

    You can specify an index join with the INDEX_JOIN hint. For more information on the

    INDEX_JOIN hint.

    SQL> select sex,id from test_skip_scan where id in (select col1 from test_tab);

    1000 rows selected.

    Execution Plan

    -

    Plan hash value: 1059662925

    -

    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |-

    | 0 | SELECT STATEMENT | | 999 | 6993 | 9 (12)| 00:00:01 ||* 1 | HASH JOIN RIGHT SEMI | | 999 | 6993 | 9 (12)| 00:00:01 |

    | 2 | INDEX FAST FULL SCAN| TEST_TAB_I | 1000 | 3000 | 2 (0)| 00:00:01 |

    | 3 | TABLE ACCESS FULL | TEST_SKIP_SCAN | 10000 | 40000 | 6 (0)| 00:00:01 |

    -

    Predicate Information (identified by operation id):

    1

    access(ID=COL1)

    D)Bitmap Indexes

    A bitmap join uses a bitmap for key values and a mapping function that converts each bit

    position to a rowid. Bitmaps can efficiently merge indexes that correspond to several conditions

    in a WHERE clause, using Boolean operations to resolve AND and OR conditions.

  • 7/31/2019 Goals for Tuning

    12/22

    Bitmap indexes and bitmap join indexes are available only if you have purchased the Oracle

    Enterprise Edition.

    What and when Index Scans is used

    February 16, 2011 bysamadhan

    In case of index scan a row is retrieved by traversing the index, using the indexed column valuesspecified by the statement. An index scan retrieves data from an index based on the value of one

    or more columns in the index. To perform an index scan, Oracle searches the index for the

    indexed column values accessed by the statement. If the statement accesses only columns of theindex, then Oracle reads the indexed column values directly from the index, rather than from the

    table.

    The index contains not only the indexed value, but also the rowids of rows in the table havingthat value. Therefore, if the statement accesses other columns in addition to the indexed columns,

    then Oracle can find the rows in the table by using either a table access by rowid or a clusterscan.

    An index scan can be various types like

    1)Index Unique Scans

    2)Index Range Scans3)Index Range Scans Descending

    4)Index Skip Scans

    5)Full Scans

    6)Fast Full Index Scans

    7)Index Joins8)Bitmap Indexes

    1)Index Unique Scans

    -This scan returns, at most, a single rowid. Oracle performs a unique scan if a statement contains

    a UNIQUE or a PRIMARY KEY constraint that guarantees that only a single row is accessed.

    This access path is used when all columns of a unique (B-tree) index or an index created as a

    result of a primary key constraint are specified with equality conditions. There is an example in

    later of this section.

    2)Index Range Scans

    -An index range scan is a common operation for accessing selective data.

    Data is returned in the ascending order of index columns. Multiple rows with identical values

    are sorted in ascending order by rowid.

    http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/
  • 7/31/2019 Goals for Tuning

    13/22

    If data must be sorted by order, then use the ORDER BY clause, and do not rely on an index. If

    an index can be used to satisfy an ORDER BY clause, then the optimizer uses this option andavoids a sort.

    The optimizer uses a range scan when it finds one or more leading columns of an index

    specified in conditions like col1=1 or col11 or (col1=1 AND col1=99 AND ..)

    Range scans can use unique or non-unique indexes. Range scans avoid sorting when index

    columns constitute the ORDER BY/GROUP BY clause.

    The hint INDEX(table_alias index_name) instructs the optimizer to use a specific index.

    Note that leading wildcards like %text does not result range scan but text% might result range

    scan.

    Look at following examples, 88% used range scans but %88 did not used range scans.

    SQL> create table table_a(n number ,k varchar2(15));Table created.

    SQL> begin

    for i in 1 .. 10000

    loop

    insert into table_a values(i,pc-||round(dbms_random.value(1,20000),0));

    end loop;

    end;

    /2 3 4 5 6 7

    PL/SQL procedure successfully completed.

    SQL> create index table_a_I_K on table_a(k);Index created.

    SQL> select * from table_a where k like 88%;

    no rows selected

    Execution Plan

    -Plan hash value: 1124802227

    -

    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

    -| 0 | SELECT STATEMENT | | 1 | 22 | 1 (0)| 00:00:01 |

    | 1 | TABLE ACCESS BY INDEX ROWID| TABLE_A | 1 | 22 | 1 (0)| 00:00:01 |

  • 7/31/2019 Goals for Tuning

    14/22

    |* 2 | INDEX RANGE SCAN | TABLE_A_I_K | 1 | | 1 (0)| 00:00:01 |

    -

    Predicate Information (identified by operation id):

    2access(K LIKE 88%)

    filter(K LIKE 88%)

    Note

    - dynamic sampling used for this statement

    SQL> select * from table_a where k like %88;102 rows selected.

    Execution Plan-

    Plan hash value: 1923776651

    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

    | 0 | SELECT STATEMENT | | 102 | 2244 | 8 (0)| 00:00:01 |

    |* 1 | TABLE ACCESS FULL| TABLE_A | 102 | 2244 | 8 (0)| 00:00:01 |

    Predicate Information (identified by operation id):

    1filter(K LIKE %88)

    Note

    - dynamic sampling used for this statement

    3)Index Range Scans Descending

    An index range scan descending is identical to an index range scan, except that the data isreturned in descending order.

    Indexes, by default, are stored in ascending order.

    The optimizer uses index range scan descending when an order by descending clause can besatisfied by an index.

  • 7/31/2019 Goals for Tuning

    15/22

    The hint INDEX_DESC(table_alias index_name) is used for index range scan descending.

    Example:

    -

    SQL> select * from table_a where k like 8888%;

    8 rows selected.

    Execution Plan

    -Plan hash value: 1124802227

    -

    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

    -

    | 0 | SELECT STATEMENT | | 1 | 9 | 4 (0)| 00:00:01 |

    | 1 | TABLE ACCESS BY INDEX ROWID| TABLE_A | 1 | 9 | 4 (0)| 00:00:01 ||* 2 | INDEX RANGE SCAN | TABLE_A_I_K | 1 | | 2 (0)| 00:00:01 |

    -

    Predicate Information (identified by operation id):

    2access(K LIKE 8888%)

    filter(K LIKE 8888%)

    SQL> select /*+index_desc(table_a)*/ * from table_a where k like 8888%;

    8 rows selected.

    Execution Plan

    -Plan hash value: 3364135956

    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

    | 0 | SELECT STATEMENT | | 1 | 9 | 4 (0)| 00:00:01 |

    | 1 | TABLE ACCESS BY INDEX ROWID | TABLE_A | 1 | 9 | 4 (0)| 00:00:01 |

    |* 2 | INDEX RANGE SCAN DESCENDING| TABLE_A_I_K | 1 | | 2 (0)| 00:00:01 |

    Predicate Information (identified by operation id):

    2access(K LIKE 8888%)

    filter(K LIKE 8888% AND K LIKE 8888%)

  • 7/31/2019 Goals for Tuning

    16/22

    4)Index Skip Scans:

    Discussed in

    5)Full Scans

    Discussed in6)Fast Full Index Scans

    Discussed in

    7)Index Joins

    Discussed in

    8)Bitmap Indexes

    Discussed in

    To illustrate an example create a table and make its column primary key. Now put the indexed

    column in the where clause with an equality operator. Note that index unique scan will be used.

    SQL> create table test_tab2 as select level col1, level col2 from dual connect by level select * from test_tab2 where col1=99;

    Execution Plan

    -

    Plan hash value: 700767796

    -

    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

    -

    | 0 | SELECT STATEMENT | | 1 | 26 | 3 (0)| 00:00:01 |

    |* 1 | TABLE ACCESS FULL| TEST_TAB2 | 1 | 26 | 3 (0)| 00:00:01 |

    -

    Predicate Information (identified by operation id):

    1filter(COL1=99)

    Note

    - dynamic sampling used for this statement

    Create non-unique index on the table.

  • 7/31/2019 Goals for Tuning

    17/22

    SQL> create index test_tab2_I on test_tab2(col1);Index created.

    Case 2: As on col1 there is non-unique index so range scan will be performed.

    -

    SQL> select * from test_tab2 where col1=99;

    Execution Plan

    -

    Plan hash value: 465564947

    -

    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

    -| 0 | SELECT STATEMENT | | 1 | 26 | 2 (0)| 00:00:01 |

    | 1 | TABLE ACCESS BY INDEX ROWID| TEST_TAB2 | 1 | 26 | 2 (0)| 00:00:01 |

    |* 2 | INDEX RANGE SCAN | TEST_TAB2_I | 1 | | 1 (0)| 00:00:01 |-

    Predicate Information (identified by operation id):

    2access(COL1=99)

    Note

    - dynamic sampling used for this statement

    Now drop the index and add primary key on the table.

    SQL> drop index test_tab2_I;Index dropped.

    SQL> alter table

    2 test_tab2 add primary key(col1);Table altered.

    Case 3: Adding primary key with equality operation on column causes to use index unique

    scan.

    SQL> select * from test_tab2 where col1=99;

    Execution Plan

    -

    Plan hash value: 1384425796

  • 7/31/2019 Goals for Tuning

    18/22

    -

    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

    -

    | 0 | SELECT STATEMENT | | 1 | 26 | 1 (0)| 00:00:01 |

    | 1 | TABLE ACCESS BY INDEX ROWID| TEST_TAB2 | 1 | 26 | 1 (0)| 00:00:01 |

    |* 2 | INDEX UNIQUE SCAN | SYS_C006487 | 1 | | 0 (0)| 00:00:01 |-

    Predicate Information (identified by operation id):

    2access(COL1=99)

    How to adjust the high watermark in ORACLE 10g

    ALTER TABLE SHRINK

    February 17, 2011 bysamadhan

    Yesterday my junior team member was confused about fragmentation and High water mark

    concepts.Also there was good comment on my fragmentation post, so it inspire me to write

    something about the High Watermark and the Oracle 10gR1 New Feature SEGMENT

    SHRINKING.About fragmentation I have already disscused in my previous post .

    The High Watermark is the maximum fill-grade a table has ever reached.

    Above the high watermark are only empty blocks.These blocks can be formatted or unformatted.

    First lets have a look at the question when space is allocated

    - when you create a table at least one extent (contiguous blocks) is allocated to the table

    - if you have specified MINEXTENTS the number of MINEXTENTS extents

    will be allocated immedaitely to the table

    - if you have not specified MINEXTENTS then exactely one extent will be allocated .

    Immediately after creation of the segment (table) the high watermark will be at the first block of

    the first extent as long as there are no inserts made.

    When you insert rows into the table the high watermark will be bumped up step by step.

    This is done by the server process which makes the inserts.

    Now let us take a look at when space is released again from a segment like a table or index:

    Lets asume that we have filled a table with 1000000 rows.

    And lets asume that we deleted 50000 rows afterwards.

    http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/author/samadhandba/http://samadhandba.wordpress.com/2011/01/20/table-fragmentation-how-to-avoid-same/http://samadhandba.wordpress.com/2011/01/20/table-fragmentation-how-to-avoid-same/http://samadhandba.wordpress.com/2011/01/20/table-fragmentation-how-to-avoid-same/http://samadhandba.wordpress.com/2011/01/20/table-fragmentation-how-to-avoid-same/http://samadhandba.wordpress.com/author/samadhandba/
  • 7/31/2019 Goals for Tuning

    19/22

    In this case the high watermark will have reached the level of 100000 and will have stayed

    there. Which means that we have empty blocks below the high watermark now.Oracle has a good reason this: it might occur that you delete rows and immediately this you

    insert rows into the same table. In this case it is good that the space was not released with the

    deletes, because it had to be get reallocate again for the following inserts, which would mean

    permanent changes to the data dictionary(=> dba_free_space, dba_extents, dba_segements ) .

    Furthermore the physical addresses of the deleted row get recycled by new rows.

    These empty blocks below the high watermark can get annoying in a number of situations

    because they are not used by DIRECT LOADs and DIRECT PATH LOADs:

    1. seriell direct load:

    INSERT /*+ APPEND */

    INTO hr.employeesNOLOGGING

    SELECT *FROM oe.emps;

    2. parallel direct load:

    ALTER SESSION ENABLE PARALLEL DML;INSERT /*+PARALLLEL(hr.employees,2)

    INTO hr.employees

    NOLOGGINGSELECT *

    FROM oe.emps;

    3. direct path loads:sqlldr hr/hr control=lcaselutz.ctl direct=y (default is direct=n)

    All the above actions case that the SGA is not used for the inserts but the PGA:

    there wil be temporary segements filled and dumped into newly formatted blocks above the high

    watermark.

    So we might want to get high watermark down before we load data into the table in order to use

    the free empty blocks for the loading.

    So how can we release unused space from a table?

    There are a number of possible options which are already available before Oracle 10g:

    - What we always could do is export and import the segment. After an import the table will have only one extent.

    The rows will have new physical addresses and

    the high watermark will be adjusted.- Another option would be to TRUNCATE the table.

  • 7/31/2019 Goals for Tuning

    20/22

    With this we would loose all rows which are in the table.So we cannot use this if we want to keep existing records.

    With Oracle 9i another possibilty was implemented:ALTER TABLE emp MOVE TABLESPACE users;

    This statement will also cause that- the rows will have new physical addresses and- the high watermark will be adjusted.

    But for this:

    - we need a full (exclusive) table lock- the indexes will be left with the status unusable (because they contain the old rowids) and

    must be rebuilt.

    Starting with ORACLE 10gR1 we can use a new feature for adjusting the high watermark,

    it is called segment shrinking and is only possible for segments which use ASSM, in otherwords, which are located in tablespaces which use Automatic Segement Space Management.

    In such a tablespace a table does not really have a High watermark!It uses two watermarks instead:- the High High Watermark referred to as HHWM, above which alle blocks ar unformatted.

    - the Low High Watermark referred to as LHWM below which all blocks are formatted.

    We now can have unformatted blocks in the middle of a segment!

    ASSM was introduced in Oracle 9iR2 and it was made the default for tablespaces in Oracle

    10gR2.With the table shrinking feature we can get Oracle

    to move rows which are located in the middle or at the end of a segment

    further more down to the beginning of the segment and by

    this make the segment more compact.For this we must first allow ORACLE to change the ROWIDs of these rows by issuing

    ALTER TABLE emp ENABLE ROW MOVEMENT;

    ROWIDs are normally assigned to a row for the life time of the row at insert time.

    After we have given Oracle the permission to change the ROWIDs

    we can now issue a shrink statement.

    ALTER TABLE emp SHRINK SPACE;

    This statement will procede in two steps:

    - The first step makes the segment compact

    by moving rows further down to free blocks at the beginning of the segment.

    - The second step adjusts the high watermark. For this Oracle needs an exclusive table

    lock,

    but for a very short moment only.

    Table shrinking

    - will adjust the high watermark

    - can be done online

  • 7/31/2019 Goals for Tuning

    21/22

    - will cause only rowlocks during the operation and just a very short full table lock at the endof the operation

    - indexes will be maintained and remain usable

    - can be made in one go- can be made in two steps

    (this can be usefull if you cannot get a full table lock during certain hours: you only make the first step and adjust the high watermark later

    when it is more conveniant:

    - ALTER TABLE emp SHRINK SPACE;only for the emp table- ALTER TABLE emp SHRINK SPACE CASCADE;for all dependent objects as well

    - ALTER TABLE emp SHRINK SPACE COMPACT;only makes the first step (moves the

    rows)

    How are the indexes maintained?

    In the first phase Oracle scans the segment from the back to find the position of the last row.Afterwards it scan the segment from the beginning to find the position of the first free slot in a

    block in this segment. In case the two positions are the same, there is nothing to shrink. In case

    the two positions are different Oracle deletes the row from the back and inserts it into the free

    position at front of the segement. Now Oracle scan the segement from the back and front againand again until it finds that the two positions are the same.

    Since it is DML statements performed to move the rows, the indexes are maintained at the same

    time. Only row level locks are used for these operations in the first pase of SHRINK TABLEstatement.

    The following restrictions apply to table shrinking:

    1.) It is only possible in tablespaces with ASSM.2.) You cannot shrink:

    - UNDO segments

    - temporary segments- clustered tables

    - tables with a colmn of datatype LONG

    - LOB indexes

    - IOT mapping tables and IOT overflow segments- tables with MVIEWS with ON COMMIT

    - tables with MVIEWS which are based on ROWIDs

    The Oracle 10g Oracle comes with a Segment Advisor utility.The Enterprise Manager, Database Control, even has a wizzard which can search for shrink

    candidates.

    This advisor is run automatically by an autotask job on a regular basis in the default

    maintainance window.

  • 7/31/2019 Goals for Tuning

    22/22

    You can use the built in package DBMS_SPACE to run the advisor manually as well.

    I will blog about this later on some time.