Archive

Archive for the ‘Managing Database Objects’ Category

Managing Tablespace

November 20, 2009 Leave a comment

What is an Oracle Tablespace?

A tablespace is a logical storage unit – multiple application objects (e.g. tables) can be stored in one tablespace. A tablespace can be online or offline (not accessible), and can contain one or more datafiles, each of which can be online or offline.

There is no relationship between a tablespace and a schema. Objects in the same schema can be in different tablespaces, and a tablespace can hold objects from different schemas.

Locally Managed Tablespaces (LMT’s) : When creating an LMT, the storage parameters NEXT, PCTINCREASE, MINEXTENTS, MAXEXTENTS, and DEFAULT STORAGE are not required (invalid syntax). An LMT can have either uniform or variable extent sizes. Variable extents are determined automatically by the system. When you create the tablespace, the UNIFORM or AUTOALLOCATE (system-managed) clause specifies the type of allocation.

For uniform extents, you can specify an extent size or use the default size, which is 1 MB. Temporary tablespaces that manage their extents locally can only use this type of allocation.

For system-managed extents, you can specify the size of the initial extent and Oracle determines the optimal size of additional extents, with a minimum extent size of 64 KB. This is the default for permanent tablespaces.

The following statement creates a locally managed tablespace named test_ts and specifies AUTOALLOCATE:

SQL Code :
CREATE TABLESPACE test1_ts DATAFILE '/u02/oracle/data/test1_ts.dbf' SIZE 50M
    EXTENT MANAGEMENT LOCAL AUTOALLOCATE;
Automatic segment-space management
SQL Code :
CREATE TABLESPACE test2_ts DATAFILE '/u02/oracle/data/test2_ts.dbf' SIZE 50M
    EXTENT MANAGEMENT LOCAL
    SEGMENT SPACE MANAGEMENT AUTO;

Dictionary Managed Tablespaces: A tablespace that uses the data dictionary to manage its extents has incremental extent sizes, which are determined by the storage parameters INITIAL, NEXT, and PCTINCREASE. These can be adjusted to control the extent sizes. When additional space is needed, the NEXT and PCTINCREASE parameters determine the sizes of new extents.

As an example, the following statement creates the tablespace tbsa, with the following characteristics:

The data of the new tablespace is contained in a single datafile, 50M in size.

The tablespace is explicitly created as a dictionary-managed tablespace by specifying EXTENT MANAGEMENT DICTIONARY.

The default storage parameters for any segments created in this tablespace are specified.

The following statement creates the tablespace tbsb:

SQL Code :
CREATE TABLESPACE tbsb
    DATAFILE '/u02/oracle/data/tb01.dbf' SIZE 50M
    EXTENT MANAGEMENT DICTIONARY
    DEFAULT STORAGE (
        INITIAL 50K
        NEXT 50K
        MINEXTENTS 2
        MAXEXTENTS 50
        PCTINCREASE 0);

Temporary tablespace: Locally managed temporary tablespaces have temporary datafiles (tempfiles), which are similar to ordinary datafiles except that:

  • You cannot create a tempfile with the ALTER DATABASE statement.
  • You cannot rename a tempfile or set it to read-only.
  • Tempfiles are always set to NOLOGGING mode.
  • When you create or resize tempfiles, they are not always guaranteed allocation of disk space for the file size specified. On certain file systems (for example, UNIX) disk blocks are allocated not at file creation or resizing, but before the blocks are accessed.

Create Temporary Tablespace

SQL Code :
CREATE TEMPORARY TABLESPACE test_temp TEMPFILE '/u02/oracle/data/test_temp01.dbf'
     SIZE 20M REUSE
   EXTENT MANAGEMENT LOCAL UNIFORM SIZE 16M;

System Tablespace: Every Oracle database contains a tablespace named SYSTEM, which Oracle creates automatically when the database is created. The SYSTEM tablespace always contains the data dictionary tables for the entire database. All data stored on behalf of stored PL/SQL program units (procedures, functions, packages, and triggers) resides in the SYSTEM tablespace.

The SYSTEM tablespace is always online when the database is open.

Data Dictionary Objects to get information about tablespace

Tablespaces                    ts$, dba_tablespaces ,
                               user_tablespaces, Tablespace

Quotas                         tsq$, dba_ts_quotas, user_ts_quotas

Data Files                     dba_data_files, v_$backup_datafile,
                               v_$datafile,
                               v_$datafile_copy, v_$datafile_header

Free Space                     dba_free_space

Segments                       dba_segments, v_$segment_statistics

Extents                        dba_extents

Blocks                         v_$database_block_corruption

Groups                         dba_tablespace_groups

SYSAUX Tablespace              v_$sysaux_occupants

Temp Tablespace                dba_temp_files

Undo Tablespace                dba_rollback_segs, dba_undo_extents,
                               v_$rollstat, v_$undostat

Transportable Tablespaces      transport_set_violations

Dictionary Management          fet$, uet$

Monitoring Tablespace

To list the names and default storage parameters of all tablespaces in a database

SQL Code:
SELECT TABLESPACE_NAME "TABLESPACE",
   INITIAL_EXTENT "INITIAL_EXT",
   NEXT_EXTENT "NEXT_EXT",
   MIN_EXTENTS "MIN_EXT",
   MAX_EXTENTS "MAX_EXT",
   PCT_INCREASE
FROM DBA_TABLESPACES;
----------------------------------------------------------------------
SQL Code:
SELECT tablespace_name,
       block_size,
       status,
       contents,
       retention,
       extent_management,
       allocation_type,
       plugged_in,
       segment_space_management
FROM dba_tablespaces;
----------------------------------------------------------------------
SQL Code:
SELECT tablespace_name,
ROUND(SUM(total_mb)-SUM(free_mb)) CUR_USE_MB,
ROUND(SUM(total_mb)) CUR_SZ_MB,
ROUND((SUM(total_mb)-SUM(free_mb))/SUM(total_mb)*100) CUR_PCT_FULL,
ROUND(SUM(max_mb) - (SUM(total_mb)-SUM(free_mb))) FREE_SPACE_MB,
ROUND(SUM(max_mb)) MAX_SZ_MB, ROUND((SUM(total_mb)-SUM(free_mb))/SUM(max_mb)*100) PCT_FULL
FROM (
  SELECT tablespace_name, SUM(bytes)/1024/1024 FREE_MB,
  0 TOTAL_MB, 0 MAX_MB
  FROM dba_free_space
  GROUP BY tablespace_name
  UNION
  SELECT tablespace_name, 0 CURRENT_MB,
  SUM(bytes)/1024/1024 TOTAL_MB,
  SUM(DECODE(maxbytes,0,bytes, maxbytes))/1024/1024 MAX_MB
FROM dba_data_files
  GROUP BY tablespace_name)
GROUP BY tablespace_name
----------------------------------------------------------------------
SQL Code:
SELECT  dd.tablespace_name tablespace_name,
        dd.file_name file_name,
        dd.bytes/1024 TABLESPACE_KB,
        SUM(fs.bytes)/1024 KBYTES_FREE,
        MAX(fs.bytes)/1024 NEXT_FREE
FROM    sys.dba_free_space fs, sys.dba_data_files dd
WHERE   dd.tablespace_name = fs.tablespace_name
        AND dd.file_id = fs.file_id
GROUP BY dd.tablespace_name, dd.file_name, dd.bytes/1024
ORDER BY dd.tablespace_name, dd.file_name; 
----------------------------------------------------------------------
SQL Code:
SELECT file_name, tablespace_name, ROUND(bytes/1024000) MB
FROM dba_data_files
ORDER BY 1;

Displaying Statistics for Free Space (Extents) of Each Tablespace

SQL Code:
SELECT TABLESPACE_NAME "TABLESPACE", FILE_ID,
   COUNT(*)    "PIECES",
   MAX(blocks) "MAXIMUM",
   MIN(blocks) "MINIMUM",
   AVG(blocks) "AVERAGE",
   SUM(blocks) "TOTAL"
   FROM DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME, FILE_ID;

To list the names, sizes, and associated tablespaces of a database

SQL Code:
SELECT  FILE_NAME, BLOCKS, TABLESPACE_NAME
   FROM DBA_DATA_FILES;

Monitoring Free Space of a database

SQL Code:
SELECT  BLOCK_ID, BYTES, BLOCKS
     FROM  DBA_FREE_SPACE
     WHERE TABLESPACE_NAME = 'USERS'
     ORDER BY BLOCK_ID;

BLOCK_ID               BYTES                  BLOCKS               
---------------------- ---------------------- ----------------------
417                    1835008                224

Coalescing Free Space

Syntax:
ALTER TABLESPACE <tablespace name> COALESCE;

Availability of Datafiles or Tempfiles

Syntax: 
  ALTER TABLESPACE ... DATAFILE {ONLINE|OFFLINE}
  ALTER TABLESPACE ... TEMPFILE {ONLINE|OFFLINE}
SQL Code:
ALTER TABLESPACE users OFFLINE NORMAL;

Dropping Tablespace

The following statement drops the users tablespace, including the segments in the tablespace

SQL Code:
DROP TABLESPACE users INCLUDING CONTENTS;

The following statement drops the USER tablespace and its associated datafiles:

SQL Code:
DROP TABLESPACE users INCLUDING CONTENTS AND DATAFILES;

Get SQL Code of a tablespace

SQL Code: 
SELECT dbms_metadata.get_ddl('TABLESPACE', 'USERS')
FROM dual;

To see the default tablestace information

SQL Code: 
SELECT *
FROM props$
WHERE name LIKE '%DEF%'

TABLESPACE INFORMATION

Tablespace Name – Name of the tablespace

Initial Extent – Default initial extent size

Next Extent – Default incremental extent size

Min Extents – Default minimum number of extents

Max Extents – Default maximum number of extents

PCT Increase – Default percent increase for extent size

Status – Tablespace status: ONLINE, OFFLINE, or INVALID (tablespace has been dropped)

Contents – Type of tablespace. This column will have ‘TEMPORARY’ (v7.3+) for dedicated temporary tablespaces, and ‘PERMANENT’ for  tablespaces that can store both temporary sort segments and permanent objects.

 
SQL Code:
Select TABLESPACE_NAME,
     INITIAL_EXTENT,
     NEXT_EXTENT,
     MIN_EXTENTS,
     MAX_EXTENTS,
     PCT_INCREASE,
     STATUS,
     CONTENTS
from  dba_tablespaces
order by TABLESPACE_NAME

Coalesced Exts

Tablespace Name – Name of tablespace

Total Extents – Total number of free extents in tablespace

Extents Coalesced – Total number of coalesced free extents in tablespace

% Extents Coalesced – Percentage of coalesced free extents in tablespace

Total Bytes – Total number of free bytes in tablespace

Bytes Coalesced – Total number of coalesced free bytes in tablespace

Total Blocks – Total number of free oracle blocks in tablespace

Blocks Coalesced – Total number of coalesced free Oracle blocks in tablespace

% Blocks Coalesced – Percentage of coalesced free Oracle blocks in tablespace

SQL Code:
Select TABLESPACE_NAME,
     TOTAL_EXTENTS,
     EXTENTS_COALESCED,
     PERCENT_EXTENTS_COALESCED,
     TOTAL_BYTES,
     BYTES_COALESCED,
     TOTAL_BLOCKS,
     BLOCKS_COALESCED,
     PERCENT_BLOCKS_COALESCED
from  dba_free_space_coalesced
order by TABLESPACE_NAME

Usage

Tablespace Name – Name of the tablespace

Bytes Used – Size of the file in bytes

Bytes Free – Size of free space in bytes

Largest – Largest free space in bytes

Percent Used – Percentage of tablespace that is being used – Careful if it is more than 85%

 
SQL Code:
Select a.TABLESPACE_NAME,
     a.BYTES bytes_used,
     b.BYTES bytes_free,
     b.largest,
     round(((a.BYTES-b.BYTES)/a.BYTES)*100,2) percent_used
from      
     (
            select  TABLESPACE_NAME,
                    sum(BYTES) BYTES
            from    dba_data_files
            group   by TABLESPACE_NAME
     )
     a,
     (
            select  TABLESPACE_NAME,
                    sum(BYTES) BYTES ,
                    max(BYTES) largest
            from    dba_free_space
            group   by TABLESPACE_NAME
     )
     b
where  a.TABLESPACE_NAME=b.TABLESPACE_NAME
order  by ((a.BYTES-b.BYTES)/a.BYTES) desc

Users Default (SYSTEM)

Username – Name of the user

Created – User creation date

Profile – Name of resource profile assigned to the user

Default Tablespace – Default tablespace for data objects

Temporary Tablespace – Default tablespace for temporary objects

Only SYS, SYSTEM and possibly DBSNMP should have their default tablespace set to SYSTEM.

 
SQL Code:
select USERNAME,
     CREATED,
     PROFILE,
     DEFAULT_TABLESPACE,
     TEMPORARY_TABLESPACE
from dba_users
order by USERNAME

Objects in SYSTEM Tablespac

Owner – Owner of the object
Object Name – Name of object
Object Type – Type of object
Tablespace – Tablespace name
Size – Size (bytes) of object
Any user (other than SYS, SYSTEM) should have their objects moved out of the SYSTEM tablespace

SQL Code:
Select OWNER,
     SEGMENT_NAME,
     SEGMENT_TYPE,
     TABLESPACE_NAME,
     BYTES
from  dba_segments
where TABLESPACE_NAME = 'SYSTEM'
and   OWNER not in ('SYS','SYSTEM')
order  by OWNER, SEGMENT_NAME

Freespace/Largest Ext

Tablespace – Name of the tablespace

Total Free Space – Total amount (bytes) of freespace in the tablespace

Largest Free Extent – Largest free extent (bytes) in the tablespace

SQL Code:
select TABLESPACE_NAME,
       sum(BYTES) Total_free_space,
       max(BYTES) largest_free_extent
from   dba_free_space
group  by TABLESPACE_NAME

Managing Index

November 20, 2009 Leave a comment

What is an Index?

An index is a performance-tuning method of allowing faster retrieval of records. An index creates an entry for each value that appears in the indexed columns. By default, Oracle creates B-tree indexes.

Major Data Dictionary view to manage Index

DBA view describes indexes on all tables in the database. ALL view describes indexes on all tables accessible to the user. USER view is restricted to indexes owned by the user. Some columns in these views contain statistics that are generated by the DBMS_STATS package or ANALYZE statement.

·  DBA_INDEXES
·  ALL_INDEXES
·  USER_INDEXES

These views describe the columns of indexes on tables. Some columns in these views contain statistics that are generated by the DBMS_STATS package or ANALYZE statement. DBA_IND_EXPRESSIONS

·  DBA_IND_COLUMNS
·  ALL_IND_COLUMNS
·  USER_IND_COLUMNS

These views describe the expressions of function-based indexes on tables. DBA_IND_STATISTICS

·  ALL_IND_EXPRESSIONS
·  USER_IND_EXPRESSIONS

These views contain optimizer statistics for indexes.

INDEX_STATS Stores information from the last ANALYZE INDEX…VALIDATE STRUCTURE statement. INDEX_HISTOGRAM Stores information from the last ANALYZE INDEX…VALIDATE STRUCTURE statement. V$OBJECT_USAGE Contains index usage information produced by the ALTER INDEX…MONITORING USAGE functionality.

·  ALL_IND_STATISTICS
·  USER_IND_STATISTICS

Create an Index

Syntax: 
CREATE [UNIQUE] INDEX index_name
  ON table_name (column1, column2, . column_n)
  [ COMPUTE STATISTICS ];

Create a Function-Based Index

In Oracle, you are not restricted to creating indexes on only columns. You can create function-based indexes.

The syntax for creating a function-based index is:

Syntax :
CREATE [UNIQUE] INDEX index_name
  ON table_name (function1, function2, . function_n)
  [ COMPUTE STATISTICS ];

SQL Code: 
CREATE INDEX ename_idx ON emp (UPPER(emane));

Rebuild Index Syntax

Syntax: 
alter index index_name rebuild;

Rebuild Index of multiple users

SQL Code: 
Select  'alter index ' || OWNER ||'.'||INDEX_NAME || ' rebuild;'
from    all_indexes
Where   Owner = 'USER NAME'
    OR  Owner = 'USER NAME'

Collect Statistics on an Index

If you forgot to collect statistics on the index when you first created it or you want to update the statistics, you can always use the ALTER INDEX command to collect statistics at a later date.

The syntax for collecting statistics on an index is:

Syntax :
ALTER INDEX index_name
  REBUILD COMPUTE STATISTICS;

Move Table and Index to Other Table Space

Assume that the name of the table space convention like user name and postfix by idx and ts

Syntax: 
ALTER TABLE schema.table_name MOVE TABLESPACE TABLESPACE_NAME;
 
SQL Code:
select 'ALTER TABLE ' || OWNER || '.' || TABLE_NAME || ' MOVE TABLESPACE ' || OWNER || ’ts’ ||';'
from ALL_TABLES
WHERE OWNER IN ('USER NAME', 'USER NAME', 'USER NAME');

Rebuild and move index to another tablespace. Also it can be used to migrate index to tablespace with diffrent blocksize.

If your table contains LONG column you must export and import data with exp/expdp, imp/impdb utilities.

Syntax: 
ALTER INDEX schema.index_name REBUILD TABLESPACE TABLESPACE_NAME;

SQL Code
select 'ALTER INDEX ' || OWNER || '.' || INDEX_NAME || ' REBUILD TABLESPACE ' || OWNER || 'idx’;'
from ALL_INDEXES
WHERE OWNER IN ('USER NAME', 'USER NAME', 'USER NAME');

ORA-01502 index ‘string.string’ or partition of such index is in unusable state

Cause: An attempt has been made to access an index or index partition that has been marked unusable by a direct load or by a DDL operation.

Action: DROP the specified index, or REBUILD the specified index, or REBUILD the unusable index partition.

This error code says your index is in an unusable state. It’s easy to find these indexes.

How to identify the index unusable

SQL Code:
select index_name, status, owner
from all_indexes
where STATUS = 'UNUSABLE';

How to rebuild index unusable

SQL Code:
select 'alter index '||owner||'.'||index_name||' rebuild;'
from dba_indexes
where STATUS = 'UNUSABLE';

Drop an Index

Syntax:
DROP INDEX index_name;