<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6635855396776353582</id><updated>2012-02-16T08:44:53.744-08:00</updated><category term='SQL scripts'/><category term='Database Upgrade/Migration'/><category term='Database Architecture'/><category term='Linux'/><category term='Performance Tuning'/><category term='Partitioning'/><category term='DataGuard'/><category term='Critical Patch Update (CPU)'/><category term='SQL/PLSQL'/><category term='Shell commands and scripts'/><category term='Database Security'/><category term='RMAN'/><category term='Oracle Installation'/><category term='Oracle Streams'/><title type='text'>Oracle And Linux Checkpoint</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://harioracledba.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://harioracledba.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Hari</name><uri>http://www.blogger.com/profile/08163699296840233717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>24</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6635855396776353582.post-4868534619186809488</id><published>2008-09-28T22:09:00.000-07:00</published><updated>2008-09-28T22:10:40.309-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Expect script for SSH login</title><content type='html'>#!/usr/bin/expect -f&lt;br /&gt;# Hari Prakash for SSH login&lt;br /&gt;#Set Variables&lt;br /&gt;set SYSTEM [lindex $argv 0]&lt;br /&gt;set USER [lindex $argv 1]&lt;br /&gt;set PASSWORD [lindex $argv 2]&lt;br /&gt;set COMMAND [lindex $argv 3]&lt;br /&gt;set timeout -1&lt;br /&gt;  if { [llength $argv] &lt; 4 } {&lt;br /&gt;    send_user " usage: olssh.sh host user password command\r\n"&lt;br /&gt;    exit 1&lt;br /&gt;  }&lt;br /&gt;#Spawn ssh process&lt;br /&gt;spawn ssh $USER@$SYSTEM $COMMAND&lt;br /&gt;match_max 100000&lt;br /&gt;expect "*?assword:*" {&lt;br /&gt;send "$PASSWORD\r"&lt;br /&gt;exp_continue&lt;br /&gt;  } "Are you sure you want to continue connecting (yes/no)? " {&lt;br /&gt;    send "yes\r"&lt;br /&gt;exp_continue&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635855396776353582-4868534619186809488?l=harioracledba.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://harioracledba.blogspot.com/feeds/4868534619186809488/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635855396776353582&amp;postID=4868534619186809488' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/4868534619186809488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/4868534619186809488'/><link rel='alternate' type='text/html' href='http://harioracledba.blogspot.com/2008/09/expect-script-for-ssh-login.html' title='Expect script for SSH login'/><author><name>Hari</name><uri>http://www.blogger.com/profile/08163699296840233717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635855396776353582.post-707933835546644867</id><published>2008-08-30T10:40:00.000-07:00</published><updated>2008-08-30T10:44:29.749-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle Installation'/><title type='text'>Oracle Enterprise Manager Repository</title><content type='html'>&lt;p&gt;&lt;strong&gt;Install Enterprise Manager Repository&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;$ emca -config dbcontrol db -repos create &lt;/p&gt;&lt;p&gt;&lt;br /&gt;STARTED EMCA at Aug 30, 2008 08:40:26 PMEM Configuration Assistant, Version 10.2.0.3.0 ProductionCopyright (c) 2003, 2005, Oracle. All rights reserved.&lt;br /&gt;Enter the following information:&lt;/p&gt;&lt;p&gt;Database SID: ORCLDB&lt;/p&gt;&lt;p&gt;..&lt;/p&gt;&lt;p&gt;..&lt;/p&gt;&lt;p&gt;..&lt;br /&gt;&lt;strong&gt;Other emca commands&lt;/strong&gt;&lt;/p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;p&gt;Drop Enterprise Manager repository:&lt;br /&gt;emca -deconfig dbcontrol db -repos drop &lt;/p&gt;&lt;p&gt;&lt;br /&gt;Create Enterprise Manager repository:&lt;br /&gt;emca -config dbcontrol db -repos create &lt;/p&gt;&lt;p&gt;&lt;br /&gt;Recreate Enterprise Manager repository:&lt;br /&gt;emca -config dbcontrol db -repos recreate &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; Configuration files for the Enterprise Manager are found in AGENT_HOME/sysman/config where AGENT_HOME is $ORACLE_HOME/server_name.domain_SID. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635855396776353582-707933835546644867?l=harioracledba.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://harioracledba.blogspot.com/feeds/707933835546644867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635855396776353582&amp;postID=707933835546644867' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/707933835546644867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/707933835546644867'/><link rel='alternate' type='text/html' href='http://harioracledba.blogspot.com/2008/08/oracle-enterprise-manager-repository.html' title='Oracle Enterprise Manager Repository'/><author><name>Hari</name><uri>http://www.blogger.com/profile/08163699296840233717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635855396776353582.post-4897601883072327644</id><published>2008-08-30T09:58:00.000-07:00</published><updated>2008-08-30T10:27:23.656-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Database Architecture'/><title type='text'>Oracle Database Architecture</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_-6h64QfPqto/SLl9Cx1hpeI/AAAAAAAAAA8/KWaz59URkfI/s1600-h/db.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5240357128113333730" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_-6h64QfPqto/SLl9Cx1hpeI/AAAAAAAAAA8/KWaz59URkfI/s400/db.JPG" border="0" /&gt;&lt;/a&gt; The general purpose of a database is to store and retrieve related information. An Oracle database has a logical and a physical structure. The physical structure of the database is the set of operating system files in the database. An Oracle database consists of three file types.&lt;br /&gt;&lt;br /&gt;• Data files containing the actual data in the database&lt;br /&gt;• Redo logs containing a record of changes made to the database to enable recovery of the data in case of failures&lt;br /&gt;• Control files containing information necessary to maintain and verify database integrity&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Memory Structure&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Oracle’s memory structure consists of two memory areas known as:&lt;br /&gt;&lt;br /&gt;• System Global Area (SGA): Allocated at instance startup, and is a fundamental component of an Oracle Instance&lt;br /&gt;• Program Global Area (PGA): Allocated when the server process is started&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;System Global Area (SGA)&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;• SGA is dynamic and sized using SGA_MAX_SIZE.&lt;br /&gt;• SGA memory allocated and tracked in granules by SGA components&lt;br /&gt;–        Contiguous virtual memory allocation&lt;br /&gt;–        Size based on SGA_MAX_SIZE&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Shared Pool&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The shared pool is used to store the most recently executed SQL statements and the most recently used data definitions.&lt;br /&gt;• It consists of two key performance-related memory structures:&lt;br /&gt;– Library cache&lt;br /&gt;– Data dictionary cache&lt;br /&gt;• Sized by the parameter SHARED_POOL_SIZE&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Library Cache&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;The library cache stores information about the most recently used SQL and PL/SQL statements. The library cache:&lt;br /&gt;• Enables the sharing of commonly used statements&lt;br /&gt;• Is managed by a least recently used (LRU) algorithm&lt;br /&gt;• Consists of two structures:&lt;br /&gt;– Shared SQL area&lt;br /&gt;– Shared PL/SQL area&lt;br /&gt;• Has its size determined by the shared pool sizing&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Data Dictionary Cache&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The data dictionary cache is a collection of the most recently used definitions in the database.&lt;br /&gt;• It includes information about database files, tables, indexes, columns, users, privileges, and other database objects.&lt;br /&gt;• During the parse phase, the server process looks at the data dictionary for information to resolve object names and validate access.&lt;br /&gt;• Caching the data dictionary information into memory improves response time on queries.&lt;br /&gt;• Size is determined by the shared pool sizing.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Database Buffer Cache&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The database buffer cache stores copies of data blocks that have been retrieved from the data files.&lt;br /&gt;• It enables great performance gains when you obtain and update data.&lt;br /&gt;• It is managed through a least recently used (LRU) algorithm.&lt;br /&gt;• DB_BLOCK_SIZE determines the primary block size.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Redo Log Buffer Cache&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The redo log buffer cache records all changes made to the database data blocks.&lt;br /&gt;• Its primary purpose is recovery.&lt;br /&gt;• Changes recorded within are called redo entries.&lt;br /&gt;• Redo entries contain information to reconstruct or redo changes.&lt;br /&gt;• Size is defined by LOG_BUFFER.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Large Pool&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The large pool is an optional area of memory in the SGA configured only in a shared server environment.&lt;br /&gt;• It relieves the burden placed on the shared pool.&lt;br /&gt;• This configured memory area is used for session memory (UGA), I/O slaves, and backup and restore operations.&lt;br /&gt;• Unlike the shared pool, the large pool does not use an LRU list.&lt;br /&gt;• Sized by LARGE_POOL_SIZE.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Java Pool&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The Java pool services the parsing requirements for Java commands.&lt;br /&gt;• Required if installing and using Java.&lt;br /&gt;• It is stored much the same way as PL/SQL in database tables.&lt;br /&gt;• It is sized by the JAVA_POOL_SIZE parameter.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Program Global Area Components&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The Program Global Area or Process Global Area (PGA) is a memory region that contains data and control information for a single server process or a single background process. The PGA is allocated when a process is created and deallocated when the process is terminated. In contrast to the SGA, which is shared by several processes, the PGA is an area that is used by only one process. In a dedicated server configuration, the PGA includes these components:&lt;br /&gt;• Sort area: Used for any sorts that may be required to process the SQL statement&lt;br /&gt;• Session information: Includes user privileges and performance statistics for the session&lt;br /&gt;• Cursor state: Indicates the stage in the processing of the SQL statements that are currently used by the session&lt;br /&gt;• Stack space: Contains other session variables&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Oracle Database Process&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Database Writer (DBWn)&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;DBWn writes when:&lt;br /&gt;• Checkpoint&lt;br /&gt;• Dirty buffers threshold reached&lt;br /&gt;• No free buffers&lt;br /&gt;• Timeout&lt;br /&gt;• RAC ping request&lt;br /&gt;• Tablespace offline&lt;br /&gt;• Tablespace read only&lt;br /&gt;• Table DROP or TRUNCATE&lt;br /&gt;• Tablespace BEGIN BACKUP&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Log Writer (LGWR)&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;LGWR writes:&lt;br /&gt;• At commit&lt;br /&gt;• When one-third full&lt;br /&gt;• When there is 1 MB of redo&lt;br /&gt;• Every 3 seconds&lt;br /&gt;• Before DBWn writes&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;System Monitor (SMON)&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Responsibilities:&lt;br /&gt;• Instance recovery:&lt;br /&gt;– Rolls forward changes in the redo logs&lt;br /&gt;– Opens the database for user access&lt;br /&gt;– Rolls back uncommitted transactions&lt;br /&gt;• Coalesces free space ever 3 sec&lt;br /&gt;• Deallocates temporary segments&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Process Monitor (PMON)&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Cleans up after failed processes by:&lt;br /&gt;• Rolling back the transaction&lt;br /&gt;• Releasing locks&lt;br /&gt;• Releasing other resources&lt;br /&gt;• Restarts dead dispatchers&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Checkpoint (CKPT)&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Responsible for:&lt;br /&gt;• Signalling DBWn at checkpoints&lt;br /&gt;• Updating datafile headers with checkpoint information&lt;br /&gt;• Updating control files with checkpoint information&lt;br /&gt;At every log switch&lt;br /&gt;• When an instance has been shut down with the normal, transactional, or immediate&lt;br /&gt;option&lt;br /&gt;• When forced by setting the initialization parameter FAST_START_MTTR_TARGET.&lt;br /&gt;• When manually requested by the database administrator&lt;br /&gt;• When the ALTER TABLESPACE [OFFLINE NORMALREAD ONLYBEGIN&lt;br /&gt;BACKUP] cause checkpointing on specific data files.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635855396776353582-4897601883072327644?l=harioracledba.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://harioracledba.blogspot.com/feeds/4897601883072327644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635855396776353582&amp;postID=4897601883072327644' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/4897601883072327644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/4897601883072327644'/><link rel='alternate' type='text/html' href='http://harioracledba.blogspot.com/2008/08/oracle-database-architecture.html' title='Oracle Database Architecture'/><author><name>Hari</name><uri>http://www.blogger.com/profile/08163699296840233717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_-6h64QfPqto/SLl9Cx1hpeI/AAAAAAAAAA8/KWaz59URkfI/s72-c/db.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635855396776353582.post-8818847228767767568</id><published>2008-08-30T09:36:00.000-07:00</published><updated>2008-08-30T09:37:47.789-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Database Upgrade/Migration'/><title type='text'>Oracle 9.x to 9.x Upgrade</title><content type='html'>&lt;p&gt;1) Install Oracle binaries with new patch set&lt;br /&gt;&lt;br /&gt;2) Check for invalid objects and run utlrp.sql to recompile&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; SELECT OWNER, OBJECT_TYPE, STATUS, COUNT(*)&lt;br /&gt;FROM DBA_OBJECTS WHERE STATUS&amp;lt;&amp;gt;’VALID’&lt;br /&gt;GROUP BY OWNER, OBJECT_TYPE, STATUS;&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; @$ORACLE_HOME/rdbms/admin/utlrp.sql&lt;br /&gt;&lt;br /&gt;3) Shutdown database and listener&lt;br /&gt;&lt;br /&gt;4) Copy the parameter file to new oracle home and make sure &lt;br /&gt;SHARED_POOL_SIZE &amp;amp; JAVA_POOL_SIZE greater than 150mb&lt;br /&gt;&lt;br /&gt;5) Change /etc/oratab to new oracle home and relogin to set correct Oracle home&lt;br /&gt;&lt;br /&gt;6) Connect as sysdba and run migrate script&lt;br /&gt;&lt;br /&gt;connect / as sysdba&lt;br /&gt;startup migrate &lt;br /&gt;spool patch.log&lt;br /&gt;@$ORACLE_HOME/rdbms/admin/catpatch.sql&lt;br /&gt;spool off&lt;br /&gt;&lt;br /&gt;7) Review for any errors &lt;br /&gt;&lt;br /&gt;8) shutdown and startup &lt;br /&gt;&lt;br /&gt;9) Run utlrp.sql to recompile any invalid objects&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; @$ORACLE_HOME/rdbms/admin/utlrp.sql&lt;br /&gt;&lt;br /&gt;10) Modify the listener.ora file with new ORACLE_HOME and start the listener&lt;br /&gt;&lt;br /&gt;11) Start listener&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635855396776353582-8818847228767767568?l=harioracledba.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://harioracledba.blogspot.com/feeds/8818847228767767568/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635855396776353582&amp;postID=8818847228767767568' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/8818847228767767568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/8818847228767767568'/><link rel='alternate' type='text/html' href='http://harioracledba.blogspot.com/2008/08/oracle-9x-to-9x-upgrade.html' title='Oracle 9.x to 9.x Upgrade'/><author><name>Hari</name><uri>http://www.blogger.com/profile/08163699296840233717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635855396776353582.post-8768835113066822517</id><published>2008-08-30T08:50:00.000-07:00</published><updated>2008-08-30T08:57:46.348-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Database Upgrade/Migration'/><title type='text'>Oracle 9i to 10g Upgrade</title><content type='html'>&lt;p&gt;&lt;br /&gt;1) Install Oracle10g Binaries on the host and upgrade to latest version to 10g.&lt;br /&gt;&lt;br /&gt;2) Check for invalid objects and run utlrp.sql to recompile&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; SELECT OWNER, OBJECT_TYPE, STATUS, COUNT(*)&lt;br /&gt;FROM DBA_OBJECTS WHERE STATUS&amp;lt;&amp;gt;’VALID’&lt;br /&gt;GROUP BY OWNER, OBJECT_TYPE, STATUS;&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; @$ORACLE_HOME/rdbms/admin/utlrp.sql -- 9i Oracle home&lt;br /&gt;&lt;br /&gt;3) Connect to Oracle 9i database and run the below script from new 10g oracle &lt;br /&gt;home&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; $ORACLE_HOME/rdbms/admin/utlu102i.sql -- 10g Oracle home&lt;br /&gt;&lt;br /&gt;4) Run the below sql, which gives all the user having connect privilege on &lt;br /&gt;oracle9i. Preserve the output&lt;br /&gt;&lt;br /&gt;SELECT grantee FROM dba_role_privs&lt;br /&gt;WHERE granted_role = 'CONNECT' and&lt;br /&gt;grantee NOT IN (&lt;br /&gt;'SYS', 'OUTLN', 'SYSTEM', 'CTXSYS', 'DBSNMP','LOGSTDBY_ADMINISTRATOR', 'ORDSYS','ORDPLUGINS', &lt;br /&gt;'OEM_MONITOR', 'WKSYS', 'WKPROXY','WK_TEST', 'WKUSER', 'MDSYS', 'LBACSYS', 'DMSYS','WMSYS', &lt;br /&gt;'OLAPDBA', 'OLAPSVR', 'OLAP_USER','OLAPSYS', 'EXFSYS', 'SYSMAN', 'MDDATA','SI_INFORMTN_SCHEMA', &lt;br /&gt;'XDB', 'ODM'); &lt;br /&gt;&lt;br /&gt;5) Connect to 9i database and create pfile from spfile &lt;br /&gt;&lt;br /&gt;SQL&amp;gt; create pfile from spfile;&lt;br /&gt;&lt;br /&gt;6) Take backup of database &lt;br /&gt;&lt;br /&gt;7) Edit pfile to add below listed 10g parameters and remove/comments the &lt;br /&gt;deprecated parameters&lt;br /&gt;&lt;br /&gt;AQ_TM_PROCESSES=0 -- If specified&lt;br /&gt;Set streams_pool_size = 50MB&lt;br /&gt;Set session_max_open_files = 20&lt;br /&gt;Set max_enabled_roles = 50&lt;br /&gt;db_cache_size = 200M (at the least)&lt;br /&gt;. SHARED_POOL_SIZE=150M (at the least)&lt;br /&gt;JAVA_POOL_SIZE=150M (at the least)&lt;br /&gt;LARGE_POOL_SIZE=150M (at the least)&lt;br /&gt;&lt;br /&gt;8) Shutdown database and create spfile from pfile&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; create spfile from pfile;&lt;br /&gt;&lt;br /&gt;9) Add the entry to /etc/oratab file and recompile/relogin to set the oracle 10g &lt;br /&gt;home&lt;br /&gt;&lt;br /&gt;ORCLDB:/u01/app/oracle/product/10.2.0/db_1:N&lt;br /&gt;&lt;br /&gt;10) Copy spfile to Oracle 10g home dbs directory&lt;br /&gt;&lt;br /&gt;$ cp /oracle/9i/9.2.0.6/dbs/spfileorcldb.ora $ORACLE_HOME/dbs&lt;br /&gt;&lt;br /&gt;11) Start upgrade database and make sure it is the right database&lt;br /&gt;&lt;br /&gt;$sqlplus sys as sysdba&lt;br /&gt;SQL&amp;gt; startup upgrade&lt;br /&gt;SQL&amp;gt; SELECT NAME FROM V$DATABASE;&lt;br /&gt;&lt;br /&gt;12) Add SYSAUX tablespace and ensure adequate space in SYSTEM tablespace (set to &lt;br /&gt;2GB and autoextend on)&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; CREATE TABLESPACE sysaux&lt;br /&gt;2 DATAFILE '/oracle/oradata/ORCLDB/sysaux01.dbf'&lt;br /&gt;3 SIZE 300M REUSE AUTOEXTEND ON&lt;br /&gt;4 EXTENT MANAGEMENT LOCAL&lt;br /&gt;5 SEGMENT SPACE MANAGEMENT AUTO&lt;br /&gt;6 ONLINE;&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; ALTER TABLESPACE SYSTEM AUTOEXTEND ON;&lt;br /&gt;&lt;br /&gt;13) Run catupgrd.sql script as sysdba&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; spool /home/oracle/upgrade_orcldb.log&lt;br /&gt;SQL&amp;gt; @$ORACLE_HOME/rdbms/admin/catupgrd.sql&lt;br /&gt;&lt;br /&gt;14) Shutdown and startup database&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; shutdown immediate&lt;br /&gt;SQL&amp;gt; startup&lt;br /&gt;&lt;br /&gt;15) Run utlrp.sql to recompile any invalid objects&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; @$ORACLE_HOME/rdbms/admin/utlrp.sql&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; SELECT OWNER, OBJECT_TYPE, STATUS, COUNT(*)&lt;br /&gt;FROM DBA_OBJECTS WHERE STATUS&amp;lt;&amp;gt;’VALID’&lt;br /&gt;GROUP BY OWNER, OBJECT_TYPE, STATUS;&lt;br /&gt;&lt;br /&gt;16) Change AQ_TM_PROCESSES,COMPATIBLE parameters and ensure log_archive_format &lt;br /&gt;has %T,%S,%R &lt;br /&gt;&lt;br /&gt;SQL&amp;gt; alter system set AQ_TM_PROCESSES=2 scope=spfile;&lt;br /&gt;SQL&amp;gt; alter system set COMPATIBLE=10.2.0.3 scope=spfile;&lt;br /&gt;&lt;br /&gt;17) Shutdown and startup to enable parameters&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; shutdown immediate&lt;br /&gt;SQL&amp;gt; startup&lt;br /&gt;&lt;br /&gt;18) Modify the listener.ora file with new ORACLE_HOME and start the listener&lt;br /&gt;&lt;br /&gt;19) Recreate password file&lt;br /&gt;&lt;br /&gt;$ orapwd file=orapwORCLDB password=password entries=5&lt;br /&gt;&lt;br /&gt;20) Check remote connectivity&lt;br /&gt;&lt;br /&gt;$ sqlplus sys@ORCLDB as sysdba&lt;br /&gt;&lt;br /&gt;21) Grant the below privileges to all the users which you have collected at step &lt;br /&gt;4&lt;br /&gt;&lt;br /&gt;GRANT CREATE VIEW TO &amp;lt;USERNAME&amp;gt;;&lt;br /&gt;GRANT CREATE TABLE TO &amp;lt;USERNAME&amp;gt;;&lt;br /&gt;GRANT ALTER SESSION TO &amp;lt;USERNAME&amp;gt;;&lt;br /&gt;GRANT CREATE CLUSTER TO &amp;lt;USERNAME&amp;gt;;&lt;br /&gt;GRANT CREATE SESSION TO &amp;lt;USERNAME&amp;gt;;&lt;br /&gt;GRANT CREATE SYNONYM TO &amp;lt;USERNAME&amp;gt;;&lt;br /&gt;GRANT CREATE SEQUENCE TO &amp;lt;USERNAME&amp;gt;;&lt;br /&gt;GRANT CREATE DATABASE LINK TO &amp;lt;USERNAME&amp;gt;;&lt;br /&gt;&lt;br /&gt;Appendix A: Initialization Parameters Obsolete in 10g&lt;br /&gt;&lt;br /&gt;ENQUEUE_RESOURCES&lt;br /&gt;DBLINK_ENCRYPT_LOGIN&lt;br /&gt;HASH_JOIN_ENABLED&lt;br /&gt;LOG_PARALLELISM&lt;br /&gt;MAX_ROLLBACK_SEGMENTS&lt;br /&gt;MTS_CIRCUITS&lt;br /&gt;MTS_DISPATCHERS&lt;br /&gt;MTS_LISTENER_ADDRESS&lt;br /&gt;MTS_MAX_DISPATCHERS&lt;br /&gt;MTS_MAX_SERVERS&lt;br /&gt;MTS_MULTIPLE_LISTENERS&lt;br /&gt;MTS_SERVERS&lt;br /&gt;MTS_SERVICE&lt;br /&gt;MTS_SESSIONS&lt;br /&gt;OPTIMIZER_MAX_PERMUTATIONS&lt;br /&gt;ORACLE_TRACE_COLLECTION_NAME&lt;br /&gt;ORACLE_TRACE_COLLECTION_PATH&lt;br /&gt;ORACLE_TRACE_COLLECTION_SIZE&lt;br /&gt;ORACLE_TRACE_ENABLE&lt;br /&gt;ORACLE_TRACE_FACILITY_NAME&lt;br /&gt;ORACLE_TRACE_FACILITY_PATH&lt;br /&gt;PARTITION_VIEW_ENABLED&lt;br /&gt;PLSQL_NATIVE_C_COMPILER&lt;br /&gt;PLSQL_NATIVE_LINKER&lt;br /&gt;PLSQL_NATIVE_MAKE_FILE_NAME&lt;br /&gt;PLSQL_NATIVE_MAKE_UTILITY&lt;br /&gt;ROW_LOCKING&lt;br /&gt;SERIALIZABLE&lt;br /&gt;TRANSACTION_AUDITING&lt;br /&gt;UNDO_SUPPRESS_ERRORS&lt;br /&gt;&lt;br /&gt;Appendix B: Initialization Parameters Deprecated in 10g&lt;br /&gt;&lt;br /&gt;LOGMNR_MAX_PERSISTENT_SESSIONS&lt;br /&gt;MAX_COMMIT_PROPAGATION_DELAY&lt;br /&gt;REMOTE_ARCHIVE_ENABLE&lt;br /&gt;SERIAL_REUSE&lt;br /&gt;SQL_TRACE&lt;br /&gt;BUFFER_POOL_KEEP (replaced by DB_KEEP_CACHE_SIZE) BUFFER_POOL_RECYCLE&lt;br /&gt;(replaced by DB_RECYCLE_CACHE_SIZE) GLOBAL_CONTEXT_POOL_SIZE&lt;br /&gt;LOCK_NAME_SPACE LOG_ARCHIVE_START MAX_ENABLED_ROLES&lt;br /&gt;PARALLEL_AUTOMATIC_TUNING PLSQL_COMPILER_FLAGS (replaced by&lt;br /&gt;PLSQL_CODE_TYPE and PLSQL_DEBUG)&lt;br /&gt;&lt;br /&gt;KNOWN ISSUES&lt;br /&gt;&lt;br /&gt;While upgrade following error was encountered.&lt;br /&gt;create or replace&lt;br /&gt;*&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-06553: PLS-213: package STANDARD not accessible.&lt;br /&gt;ORA-00955: name is already used by an existing object&lt;br /&gt;&lt;br /&gt;Please make sure to set the following init parameters as below in the&lt;br /&gt;spfile/init file or comment them out to their default values, at the&lt;br /&gt;time of upgrading the database.&lt;br /&gt;&lt;br /&gt;PLSQL_V2_COMPATIBILITY = FALSE&lt;br /&gt;PLSQL_NATIVE_LIBRARY_DIR = &amp;quot;&amp;quot;&lt;br /&gt;PLSQL_NATIVE_LIBRARY_SUBDIR_COUNT = 0&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635855396776353582-8768835113066822517?l=harioracledba.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://harioracledba.blogspot.com/feeds/8768835113066822517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635855396776353582&amp;postID=8768835113066822517' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/8768835113066822517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/8768835113066822517'/><link rel='alternate' type='text/html' href='http://harioracledba.blogspot.com/2008/08/oracle-9i-to-10g-upgrade.html' title='Oracle 9i to 10g Upgrade'/><author><name>Hari</name><uri>http://www.blogger.com/profile/08163699296840233717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635855396776353582.post-9049751303121994482</id><published>2008-08-11T05:46:00.000-07:00</published><updated>2008-08-11T05:47:59.224-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Steps to create new Linux partition</title><content type='html'>[root@centos u01]# fdisk -l&lt;br /&gt;&lt;br /&gt;Disk /dev/hdb: 40.0 GB, 40020664320 bytes&lt;br /&gt;255 heads, 63 sectors/track, 4865 cylinders&lt;br /&gt;Units = cylinders of 16065 * 512 = 8225280 bytes&lt;br /&gt;&lt;br /&gt;   Device Boot      Start         End      Blocks   Id  System&lt;br /&gt;/dev/hdb1   *           1          25      200781   83  Linux&lt;br /&gt;/dev/hdb2              26        2256    17920507+  83  Linux&lt;br /&gt;/dev/hdb3            2257        2868     4915890   83  Linux&lt;br /&gt;/dev/hdb4            2869        4865    16040902+   5  Extended&lt;br /&gt;/dev/hdb5            2869        3442     4610623+  83  Linux&lt;br /&gt;/dev/hdb6            3443        3990     4401778+  83  Linux&lt;br /&gt;/dev/hdb7            3991        4353     2915766   82  Linux swap / Solaris&lt;br /&gt;/dev/hdb8            4354        4608     2048256   83  Linux&lt;br /&gt;/dev/hdb9            4609        4761     1228941   83  Linux&lt;br /&gt;/dev/hdb10           4762        4863      819283+  83  Linux&lt;br /&gt;&lt;br /&gt;Disk /dev/sda: 160.0 GB, 160041885696 bytes&lt;br /&gt;255 heads, 63 sectors/track, 19457 cylinders&lt;br /&gt;Units = cylinders of 16065 * 512 = 8225280 bytes&lt;br /&gt;&lt;br /&gt;   Device Boot      Start         End      Blocks   Id  System&lt;br /&gt;/dev/sda1   *           1        3824    30716248+   c  W95 FAT32 (LBA)&lt;br /&gt;/dev/sda2            3825        7648    30716280    c  W95 FAT32 (LBA)&lt;br /&gt;/dev/sda3            7649       16317    69633742+   f  W95 Ext'd (LBA)&lt;br /&gt;/dev/sda5            7649       10453    22531131    b  W95 FAT32&lt;br /&gt;/dev/sda6           10454       13640    25599546    b  W95 FAT32&lt;br /&gt;/dev/sda7           13641       16317    21502971    b  W95 FAT32&lt;br /&gt;[root@centos u01]# fdisk /dev/sda&lt;br /&gt;&lt;br /&gt;The number of cylinders for this disk is set to 19457.&lt;br /&gt;There is nothing wrong with that, but this is larger than 1024,&lt;br /&gt;and could in certain setups cause problems with:&lt;br /&gt;1) software that runs at boot time (e.g., old versions of LILO)&lt;br /&gt;2) booting and partitioning software from other OSs&lt;br /&gt;   (e.g., DOS FDISK, OS/2 FDISK)&lt;br /&gt;&lt;br /&gt;Command (m for help): n&lt;br /&gt;Command action&lt;br /&gt;   l   logical (5 or over)&lt;br /&gt;   p   primary partition (1-4)&lt;br /&gt;p&lt;br /&gt;Selected partition 4&lt;br /&gt;First cylinder (16318-19457, default 16318): &lt;br /&gt;Using default value 16318&lt;br /&gt;Last cylinder or +size or +sizeM or +sizeK (16318-19457, default 19457): &lt;br /&gt;Using default value 19457&lt;br /&gt;&lt;br /&gt;Command (m for help): p&lt;br /&gt;&lt;br /&gt;Disk /dev/sda: 160.0 GB, 160041885696 bytes&lt;br /&gt;255 heads, 63 sectors/track, 19457 cylinders&lt;br /&gt;Units = cylinders of 16065 * 512 = 8225280 bytes&lt;br /&gt;&lt;br /&gt;   Device Boot      Start         End      Blocks   Id  System&lt;br /&gt;/dev/sda1   *           1        3824    30716248+   c  W95 FAT32 (LBA)&lt;br /&gt;/dev/sda2            3825        7648    30716280    c  W95 FAT32 (LBA)&lt;br /&gt;/dev/sda3            7649       16317    69633742+   f  W95 Ext'd (LBA)&lt;br /&gt;/dev/sda4           16318       19457    25222050   83  Linux&lt;br /&gt;/dev/sda5            7649       10453    22531131    b  W95 FAT32&lt;br /&gt;/dev/sda6           10454       13640    25599546    b  W95 FAT32&lt;br /&gt;/dev/sda7           13641       16317    21502971    b  W95 FAT32&lt;br /&gt;&lt;br /&gt;Command (m for help): w&lt;br /&gt;The partition table has been altered!&lt;br /&gt;&lt;br /&gt;Calling ioctl() to re-read partition table.&lt;br /&gt;Syncing disks.&lt;br /&gt;&lt;br /&gt;[root@centos u01]# partprobe&lt;br /&gt;Warning: Unable to open /dev/hdc read-write (Read-only file system).  /dev/hdc has been opened read-only.&lt;br /&gt; &lt;br /&gt;[root@centos u01]# mkfs -t ext3 /dev/sda4&lt;br /&gt;mke2fs 1.39 (29-May-2006)&lt;br /&gt;Filesystem label=&lt;br /&gt;OS type: Linux&lt;br /&gt;Block size=4096 (log=2)&lt;br /&gt;Fragment size=4096 (log=2)&lt;br /&gt;3155936 inodes, 6305512 blocks&lt;br /&gt;315275 blocks (5.00%) reserved for the super user&lt;br /&gt;First data block=0&lt;br /&gt;Maximum filesystem blocks=0&lt;br /&gt;193 block groups&lt;br /&gt;32768 blocks per group, 32768 fragments per group&lt;br /&gt;16352 inodes per group&lt;br /&gt;Superblock backups stored on blocks: &lt;br /&gt;        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, &lt;br /&gt;        4096000&lt;br /&gt;&lt;br /&gt;Writing inode tables: done                            &lt;br /&gt;Creating journal (32768 blocks): done&lt;br /&gt;Writing superblocks and filesystem accounting information: done&lt;br /&gt;&lt;br /&gt;This filesystem will be automatically checked every 27 mounts or&lt;br /&gt;180 days, whichever comes first.  Use tune2fs -c or -i to override.&lt;br /&gt;&lt;br /&gt;[root@centos u01]# e2label /dev/sda4 /u01&lt;br /&gt;&lt;br /&gt;[root@centos u01]# cat /etc/fstab &lt;br /&gt;LABEL=/u01              /u01                    ext3    defaults        1 2 &lt;br /&gt;&lt;br /&gt;[root@centos ~]# mount /dev/sda4 /u01&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635855396776353582-9049751303121994482?l=harioracledba.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://harioracledba.blogspot.com/feeds/9049751303121994482/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635855396776353582&amp;postID=9049751303121994482' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/9049751303121994482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/9049751303121994482'/><link rel='alternate' type='text/html' href='http://harioracledba.blogspot.com/2008/08/steps-to-create-new-linux-partition.html' title='Steps to create new Linux partition'/><author><name>Hari</name><uri>http://www.blogger.com/profile/08163699296840233717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635855396776353582.post-6893804652451731261</id><published>2008-08-09T08:51:00.000-07:00</published><updated>2008-08-09T08:54:12.954-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Performance Tuning'/><title type='text'>10046/10053 trace with tkprof</title><content type='html'>(1) Create a 10046/10053 trace file using the following steps:&lt;br /&gt;&lt;br /&gt;$ sqlplus /nolog&lt;br /&gt;connect username/password&lt;br /&gt;alter session set timed_statistics = true;&lt;br /&gt;alter session set statistics_level=all;&lt;br /&gt;alter session set max_dump_file_size = unlimited;&lt;br /&gt;alter session set events '10046 trace name context forever, level 12';&lt;br /&gt;alter session set events '10053 trace name context forever, level 1';&lt;br /&gt;-- If the query has binds define them using the correct data types and values&lt;br /&gt;--variable b1 varchar2(10);&lt;br /&gt;--variable b2 number;&lt;br /&gt;--begin&lt;br /&gt;--:b1 := 'bind value 1';&lt;br /&gt;--:b2 := 42;&lt;br /&gt;--end;&lt;br /&gt;&lt;br /&gt;-- Run the query with a distinct comment /* comment_&lt;date&gt; */ to force a hard parse &lt;br /&gt;&lt;br /&gt;select /* mycomm_2k08 */ empno,ename from emp where empno=10001;&lt;br /&gt;&lt;br /&gt;select 'close the cursor' from dual;&lt;br /&gt;exec dbms_session.reset_package;&lt;br /&gt;alter session set events '10046 trace name context off';&lt;br /&gt;alter session set events '10053 trace name context off';&lt;br /&gt;quit&lt;br /&gt;&lt;br /&gt;(2) Recreate the plan table to ensure it is the correct format for this version of the database:&lt;br /&gt;&lt;br /&gt;$ sqlplus /nolog&lt;br /&gt;connect username/password&lt;br /&gt;drop table plan_table;&lt;br /&gt;@?/rdbms/admin/utlxplan&lt;br /&gt;quit&lt;br /&gt;&lt;br /&gt;(3) Find the raw 10046/10053 trace file in the user dump destination and run tkprof against it:&lt;br /&gt;&lt;br /&gt;$ tkprof &lt;filename&gt;.trc &lt;filename&gt;.tkprof sort=exeela waits=yes explain=username/password&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635855396776353582-6893804652451731261?l=harioracledba.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://harioracledba.blogspot.com/feeds/6893804652451731261/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635855396776353582&amp;postID=6893804652451731261' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/6893804652451731261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/6893804652451731261'/><link rel='alternate' type='text/html' href='http://harioracledba.blogspot.com/2008/08/1004610053-trace-with-tkprof.html' title='10046/10053 trace with tkprof'/><author><name>Hari</name><uri>http://www.blogger.com/profile/08163699296840233717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635855396776353582.post-7312130612004372226</id><published>2008-07-15T03:05:00.000-07:00</published><updated>2008-07-15T03:15:36.550-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL/PLSQL'/><title type='text'>Execute Shell Script from Oracle Procedure</title><content type='html'>The below steps explains how to execute shell script from procedure using DBMS_SCHEDULER.&lt;br /&gt;&lt;br /&gt;Root access is required for the steps below.&lt;br /&gt;&lt;br /&gt;1. Ensure the configuration file $ORACLE_HOME/rdbms/admin/externaljob.ora is owned by root:&lt;br /&gt;&lt;br /&gt;cd $ORACLE_HOME/rdbms/admin/&lt;br /&gt;chown root externaljob.ora &lt;br /&gt;&lt;br /&gt;$ ls -l externaljob.ora&lt;br /&gt;-rw-r-----    1 root     centos       1534 Dec 22  2005 externaljob.ora&lt;br /&gt;&lt;br /&gt;2. Ensure the file permissions are correctly set for $ORACLE_HOME/rdbms/admin/externaljob.ora.&lt;br /&gt;Remove write privileges from group and other.&lt;br /&gt;&lt;br /&gt;chmod 640 externaljob.ora&lt;br /&gt;ls -la externaljob.ora&lt;br /&gt;-rw-r----- 1 root oinstall 1537 Sep 13 09:24 externaljob.ora&lt;br /&gt;&lt;br /&gt;3. Edit $ORACLE_HOME/rdbms/admin/externaljob.ora and set run_user to the OS account that owns the Oracle installation and the database and run_group to the OS group that owns the Oracle_Home.&lt;br /&gt;&lt;br /&gt;run_user = oracle  &lt;br /&gt;run_group = dba&lt;br /&gt;&lt;br /&gt;4. Ensure the setuid bit is set on the $ORACLE_HOME/bin/extjob executable.&lt;br /&gt;&lt;br /&gt;cd $ORACLE_HOME/bin&lt;br /&gt;chmod 4750 extjob&lt;br /&gt;&lt;br /&gt;$ ls -l extjob&lt;br /&gt;-rwsr-x---    1 root     centos      64911 Jun 17 01:43 extjob&lt;br /&gt;&lt;br /&gt;5. Run below procedure &lt;br /&gt;&lt;br /&gt;Connect / as sysdba&lt;br /&gt;&lt;br /&gt;create or replace procedure PrcCreateOsDir(p_path IN VARCHAR2,p_filename IN VARCHAR2)&lt;br /&gt;is&lt;br /&gt;v_object_job number:=0;&lt;br /&gt;v_object_prg number:=0;&lt;br /&gt;begin&lt;br /&gt;select count(1) into v_object_job from user_objects where object_name='CREATEDIRJOB';&lt;br /&gt;select count(1) into v_object_prg from user_objects where object_name='CREATEDIRPROG';&lt;br /&gt;IF v_object_prg = 0 THEN&lt;br /&gt; DBMS_SCHEDULER.create_program(program_name =&gt; 'createdirprog',&lt;br /&gt;      program_type        =&gt; 'EXECUTABLE',&lt;br /&gt;        program_action      =&gt; '/oracle/shell/createdir.sh',&lt;br /&gt;        number_of_arguments =&gt; 2,&lt;br /&gt;        comments            =&gt; 'Program to create directory at host level.');&lt;br /&gt;END IF;&lt;br /&gt;IF v_object_job = 0 THEN&lt;br /&gt; DBMS_SCHEDULER.CREATE_JOB(job_name  =&gt;  'createdirjob',&lt;br /&gt; program_name =&gt;  'createdirprog');&lt;br /&gt;END IF;&lt;br /&gt;  DBMS_SCHEDULER.define_program_argument (program_name =&gt; 'createdirprog',&lt;br /&gt;     argument_name     =&gt; 'path',&lt;br /&gt;     argument_position =&gt; 1,&lt;br /&gt;     argument_type     =&gt; 'VARCHAR2');&lt;br /&gt;  DBMS_SCHEDULER.define_program_argument (program_name =&gt; 'createdirprog',&lt;br /&gt;     argument_name     =&gt; 'filename',&lt;br /&gt;     argument_position =&gt; 2,&lt;br /&gt;     argument_type     =&gt; 'VARCHAR2');&lt;br /&gt; DBMS_SCHEDULER.ENABLE(name =&gt; 'createdirprog');&lt;br /&gt; Dbms_Scheduler.Set_Job_Argument_Value(Job_Name =&gt; 'createdirjob',&lt;br /&gt;     argument_Name  =&gt; 'path',&lt;br /&gt;     argument_Value =&gt; p_path);&lt;br /&gt; Dbms_Scheduler.Set_Job_Argument_Value(Job_Name =&gt; 'createdirjob',&lt;br /&gt;     argument_Name  =&gt; 'filename',&lt;br /&gt;           argument_Value =&gt; p_filename );&lt;br /&gt; DBMS_SCHEDULER.run_job(job_name  =&gt;  'createdirjob');&lt;br /&gt;end;&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;6. Shell script to create directory&lt;br /&gt;&lt;br /&gt;$cat createdir.sh&lt;br /&gt;#!/bin/bash&lt;br /&gt;mkdir $1/$2&lt;br /&gt;&lt;br /&gt;7. Execute procedure to create directory&lt;br /&gt;&lt;br /&gt;SQL&gt;  exec PrcCreateOsDir('/oracle/data','mydir');&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635855396776353582-7312130612004372226?l=harioracledba.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://harioracledba.blogspot.com/feeds/7312130612004372226/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635855396776353582&amp;postID=7312130612004372226' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/7312130612004372226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/7312130612004372226'/><link rel='alternate' type='text/html' href='http://harioracledba.blogspot.com/2008/07/execute-shell-script-from-oracle.html' title='Execute Shell Script from Oracle Procedure'/><author><name>Hari</name><uri>http://www.blogger.com/profile/08163699296840233717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635855396776353582.post-3408437572396802750</id><published>2008-07-15T00:23:00.000-07:00</published><updated>2008-07-15T00:26:53.004-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Shell commands and scripts'/><title type='text'>Multithreaded Export and Import</title><content type='html'>The below script used for doing multithreaded export and import with list of tables specified in tablelist file&lt;br /&gt;&lt;br /&gt;$ cat initiate&lt;br /&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;cleanup()&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;rm -fr dumpdir&lt;br /&gt;&lt;br /&gt;mkdir dumpdir&lt;br /&gt;&lt;br /&gt;rm -fr expdone&lt;br /&gt;&lt;br /&gt;mkdir expdone&lt;br /&gt;&lt;br /&gt;rm -fr impdone&lt;br /&gt;&lt;br /&gt;mkdir impdone&lt;br /&gt;&lt;br /&gt;rm -fr explock&lt;br /&gt;&lt;br /&gt;mkdir explock&lt;br /&gt;&lt;br /&gt;rm -fr implock&lt;br /&gt;&lt;br /&gt;mkdir implock&lt;br /&gt;&lt;br /&gt;rm -fr explog&lt;br /&gt;&lt;br /&gt;mkdir explog&lt;br /&gt;&lt;br /&gt;rm -fr implog&lt;br /&gt;&lt;br /&gt;mkdir implog&lt;br /&gt;&lt;br /&gt;rm -fr expproglog&lt;br /&gt;&lt;br /&gt;mkdir expproglog&lt;br /&gt;&lt;br /&gt;rm -fr impproglog&lt;br /&gt;&lt;br /&gt;mkdir impproglog&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;createproc()&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;i=1&lt;br /&gt;&lt;br /&gt;while [ $i -le $pid ]&lt;br /&gt;&lt;br /&gt;do&lt;br /&gt;&lt;br /&gt;./export $i &gt; ${PWD}/expproglog/export_$i.log &amp;&lt;br /&gt;&lt;br /&gt;echo " Export started with process id $i"&lt;br /&gt;&lt;br /&gt;sleep 2&lt;br /&gt;&lt;br /&gt;./import $i &gt; ${PWD}/impproglog/import_$i.log &amp;&lt;br /&gt;&lt;br /&gt;echo " Import started with process id $i"&lt;br /&gt;&lt;br /&gt;sleep 2&lt;br /&gt;&lt;br /&gt;i=$((i+1))&lt;br /&gt;&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;echo "Enter number of export &amp; import process to start.. "&lt;br /&gt;&lt;br /&gt;read pid&lt;br /&gt;&lt;br /&gt;echo "Doing cleanup of dump and log directories.."&lt;br /&gt;&lt;br /&gt;cleanup&lt;br /&gt;&lt;br /&gt;sleep 2&lt;br /&gt;&lt;br /&gt;echo "Cleanup done.."&lt;br /&gt;&lt;br /&gt;createproc&lt;br /&gt;&lt;br /&gt;echo " Export and import process started, Check the log for progress"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$cat export&lt;br /&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;export()&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;tablelist=`cat tablelist`&lt;br /&gt;&lt;br /&gt;j=`wc -l tablelist | awk ' { print $1 } '`&lt;br /&gt;&lt;br /&gt;exec 3&lt;tablelist&lt;br /&gt;&lt;br /&gt;while [ $j -gt 0 ]&lt;br /&gt;&lt;br /&gt;do&lt;br /&gt;&lt;br /&gt;read &lt;&amp;3 tableiden&lt;br /&gt;&lt;br /&gt;table=`echo $tableiden | awk ' { print $1 } '`&lt;br /&gt;&lt;br /&gt;iden=`echo $tableiden | awk ' { print $2 } '`&lt;br /&gt;&lt;br /&gt;if [ -e "${PWD}/expdone/expdone.${table}" ] ; then&lt;br /&gt;&lt;br /&gt;SKIP=Y&lt;br /&gt;&lt;br /&gt;elif [ -e "${PWD}/explock/explock.${table}" ] ; then&lt;br /&gt;&lt;br /&gt;SKIP=Y&lt;br /&gt;&lt;br /&gt;else&lt;br /&gt;&lt;br /&gt;SKIP=N&lt;br /&gt;&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;if [ "$SKIP" = "N" ] ; then&lt;br /&gt;&lt;br /&gt;touch ${PWD}/explock/explock.${table}&lt;br /&gt;&lt;br /&gt;dateecho "About to start export of table $table.."&lt;br /&gt;&lt;br /&gt;exp user1/user1@prod1 file=${PWD}/dumpdir/exp_$table.dmp log=${PWD}/explog/exp_$table.log tables=$table &gt; /dev/null 2&gt;&amp;1&lt;br /&gt;&lt;br /&gt;sleep 2&lt;br /&gt;&lt;br /&gt;touch ${PWD}/expdone/expdone.${table}&lt;br /&gt;&lt;br /&gt;rm -f ${PWD}/explock/explock.${table}&lt;br /&gt;&lt;br /&gt;dateecho "completed export of table $table.."&lt;br /&gt;&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;SKIP=N&lt;br /&gt;&lt;br /&gt;j=$((j-1))&lt;br /&gt;&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function dateecho&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;datevar=`date '+%Y/%m/%d %H:%M:%S'`&lt;br /&gt;&lt;br /&gt;echo "$datevar $*"&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;proc=$1&lt;br /&gt;&lt;br /&gt;dateecho "Export process started with id $1.."&lt;br /&gt;&lt;br /&gt;while [ 1 ]&lt;br /&gt;&lt;br /&gt;do&lt;br /&gt;&lt;br /&gt;count=`wc -l tablelist | awk ' { print $1 } '`&lt;br /&gt;&lt;br /&gt;counttask=`ls -ltr ${PWD}/expdone | grep -v total | wc -l`&lt;br /&gt;&lt;br /&gt;if [ $count != $counttask ] ; then&lt;br /&gt;&lt;br /&gt;export&lt;br /&gt;&lt;br /&gt;else&lt;br /&gt;&lt;br /&gt;dateecho "Export process $proc completed successfully.."&lt;br /&gt;&lt;br /&gt;exit 1&lt;br /&gt;&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ cat import&lt;br /&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;import()&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;tablelist=`cat tablelist`&lt;br /&gt;&lt;br /&gt;j=`wc -l tablelist | awk ' { print $1 } '`&lt;br /&gt;&lt;br /&gt;exec 3&lt;tablelist&lt;br /&gt;&lt;br /&gt;while [ $j -gt 0 ]&lt;br /&gt;&lt;br /&gt;do&lt;br /&gt;&lt;br /&gt;read &lt;&amp;3 tableiden&lt;br /&gt;&lt;br /&gt;table=`echo $tableiden | awk ' { print $1 } '`&lt;br /&gt;&lt;br /&gt;iden=`echo $tableiden | awk ' { print $2 } '`&lt;br /&gt;&lt;br /&gt;if [ -e "${PWD}/expdone/expdone.${table}" ] ; then&lt;br /&gt;&lt;br /&gt;if [ -e "${PWD}/impdone/impdone.${table}" ] ; then&lt;br /&gt;&lt;br /&gt;SKIP=Y&lt;br /&gt;&lt;br /&gt;elif [ -e "${PWD}/implock/implock.${table}" ] ; then&lt;br /&gt;&lt;br /&gt;SKIP=Y&lt;br /&gt;&lt;br /&gt;else&lt;br /&gt;&lt;br /&gt;SKIP=N&lt;br /&gt;&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;else&lt;br /&gt;&lt;br /&gt;SKIP=Y&lt;br /&gt;&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;if [ "$SKIP" = "N" ] ; then&lt;br /&gt;&lt;br /&gt;touch ${PWD}/implock/implock.${table}&lt;br /&gt;&lt;br /&gt;dateecho "About to start import of table $table.."&lt;br /&gt;&lt;br /&gt;imp user2/user2@prod2 file=${PWD}/dumpdir/exp_$table.dmp log=${PWD}/implog/imp_$table.log full=y &gt; /dev/null 2&gt;&amp;1&lt;br /&gt;&lt;br /&gt;sleep 2&lt;br /&gt;&lt;br /&gt;touch ${PWD}/impdone/impdone.${table}&lt;br /&gt;&lt;br /&gt;rm -f ${PWD}/implock/implock.${table}&lt;br /&gt;&lt;br /&gt;dateecho "Completed import of table $table.."&lt;br /&gt;&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;SKIP=N&lt;br /&gt;&lt;br /&gt;j=$((j-1))&lt;br /&gt;&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function dateecho&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;datevar=`date '+%Y/%m/%d %H:%M:%S'`&lt;br /&gt;&lt;br /&gt;echo "$datevar $*"&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;proc=$1&lt;br /&gt;&lt;br /&gt;dateecho "Import process started with id $1.."&lt;br /&gt;&lt;br /&gt;while [ 1 ]&lt;br /&gt;&lt;br /&gt;do&lt;br /&gt;&lt;br /&gt;count=`wc -l tablelist | awk ' { print $1 } '`&lt;br /&gt;&lt;br /&gt;counttask=`ls -ltr ${PWD}/impdone | grep -v total | wc -l`&lt;br /&gt;&lt;br /&gt;if [ $count != $counttask ] ; then&lt;br /&gt;&lt;br /&gt;import&lt;br /&gt;&lt;br /&gt;else&lt;br /&gt;&lt;br /&gt;dateecho "Import process $proc completed successfully.."&lt;br /&gt;&lt;br /&gt;exit 1&lt;br /&gt;&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;done&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635855396776353582-3408437572396802750?l=harioracledba.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://harioracledba.blogspot.com/feeds/3408437572396802750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635855396776353582&amp;postID=3408437572396802750' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/3408437572396802750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/3408437572396802750'/><link rel='alternate' type='text/html' href='http://harioracledba.blogspot.com/2008/07/multithreaded-export-and-import.html' title='Multithreaded Export and Import'/><author><name>Hari</name><uri>http://www.blogger.com/profile/08163699296840233717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635855396776353582.post-3847888593907087527</id><published>2008-07-14T09:10:00.000-07:00</published><updated>2008-07-14T10:55:47.328-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DataGuard'/><title type='text'>Logical Standby</title><content type='html'>Steps to create logical standby database which has similar file system structure.&lt;br /&gt;&lt;br /&gt;1) Identify unsupported objects and tables that have no primary key or unique constratint&lt;br /&gt;&lt;br /&gt;SELECT * FROM DBA_LOGSTDBY_UNSUPPORTED;&lt;br /&gt;&lt;br /&gt;SELECT OWNER, TABLE_NAME, BAD_COLUMN FROM DBA_LOGSTDBY_NOT_UNIQUE;&lt;br /&gt;&lt;br /&gt;Change unsupported column and add primary key if any rows selected from above queries respectively&lt;br /&gt;&lt;br /&gt;2) On primary database enable below intialization parametera and ensure that database archivelog mode.&lt;br /&gt;&lt;br /&gt;log_archive_dest_1 = "location=/oracle/ORCLDB_P/arch" &lt;br /&gt;log_archive_dest_2 = "SERVICE=ORCLDB_S LGWR" &lt;br /&gt;log_archive_dest_state_1 = ENABLE&lt;br /&gt;log_archive_dest_state_2 = ENABLE&lt;br /&gt;log_archive_format = ARCH_%t_%r_%s.arc&lt;br /&gt;&lt;br /&gt;Shutdown immediate&lt;br /&gt;Startup mount&lt;br /&gt;alter database archivelog;&lt;br /&gt;alter database open;&lt;br /&gt;archive log list;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3) On Standby Database enable the below intialization parameters&lt;br /&gt;&lt;br /&gt;log_archive_start = true&lt;br /&gt;log_archive_dest_1 = "location=/oracle/ORCLDB_P/arch" &lt;br /&gt;log_archive_dest_state_1 = ENABLE&lt;br /&gt;log_archive_format = ARCH_%t_%r_%s.arc &lt;br /&gt;&lt;br /&gt;4) Enable supplemental logging on primary key and unique index&lt;br /&gt;&lt;br /&gt;ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY, UNIQUE INDEX) COLUMNS;&lt;br /&gt;&lt;br /&gt;SELECT SUPPLEMENTAL_LOG_DATA_PK, SUPPLEMENTAL_LOG_DATA_UI from V$DATABASE;&lt;br /&gt;&lt;br /&gt;SUP SUP&lt;br /&gt;--- ---&lt;br /&gt;YES YES&lt;br /&gt;&lt;br /&gt;5) Make sure log_parallelism is set to 1 (default)&lt;br /&gt;&lt;br /&gt;SQL&gt; show parameter LOG_PARALLELISM;&lt;br /&gt;&lt;br /&gt;NAME                                 TYPE        VALUE&lt;br /&gt;------------------------------------ ----------- ------------------------------&lt;br /&gt;log_parallelism                      integer     1&lt;br /&gt;&lt;br /&gt;6) Create alternate tablespace for logical standby system tables&lt;br /&gt;&lt;br /&gt;CREATE TABLESPACE LOGMNR DATAFILE '/oracle/ORCLDB_P/oradata/logmnr.dbf' SIZE 50M;;&lt;br /&gt;&lt;br /&gt;EXECUTE DBMS_LOGMNR_D.SET_TABLESPACE ('LOGMNR');&lt;br /&gt;&lt;br /&gt;7) On Primary perform cold backup and copy all files(datafiles,redo..) to standby site&lt;br /&gt;&lt;br /&gt;8) Create Logical standby control file from primary&lt;br /&gt;&lt;br /&gt;ALTER DATABASE CREATE LOGICAL STANDBY CONTROLFILE AS '/backup/log.ctl';&lt;br /&gt;&lt;br /&gt;9) On primary database and build the log miner dictionary &lt;br /&gt;&lt;br /&gt;ALTER SYSTEM ENABLE RESTRICTED SESSION; &lt;br /&gt;&lt;br /&gt;EXECUTE DBMS_LOGSTDBY.BUILD;&lt;br /&gt;&lt;br /&gt;10) Archive log current&lt;br /&gt;&lt;br /&gt;ALTER SYSTEM ARCHIVE LOG CURRENT;&lt;br /&gt;&lt;br /&gt;11) Identify archived redo log that contains the log miner dictionary &lt;br /&gt;&lt;br /&gt;SELECT NAME FROM V$ARCHIVED_LOG WHERE DICTIONARY_BEGIN='YES' AND STANDBY_DEST='NO';&lt;br /&gt;&lt;br /&gt;12) Startup mount standby database and turn on the database guard&lt;br /&gt;&lt;br /&gt;STARTUP MOUNT;&lt;br /&gt;&lt;br /&gt;ALTER DATABASE GUARD ALL;&lt;br /&gt;&lt;br /&gt;ALTER DATABASE OPEN;&lt;br /&gt;&lt;br /&gt;13) Create tempfile on standby database&lt;br /&gt;&lt;br /&gt;alter tablespace TEMP ADD TEMPFILE '/oracle/ORCLDB_P/oradata/temp.dbf' size 200M reuse&lt;br /&gt;&lt;br /&gt;14) On standby database, register logfile identified in step 11&lt;br /&gt;&lt;br /&gt;alter database register logical logfile '/oracle/ORCLDB_P/ARCH_001_8474994_00011.arc'&lt;br /&gt;&lt;br /&gt;15)  alter database to begin SQL apply on the logical standby&lt;br /&gt;&lt;br /&gt;ALTER DATABASE START LOGICAL STANDBY APPLY INITIAL;&lt;br /&gt;&lt;br /&gt;16) Register database with listener&lt;br /&gt;&lt;br /&gt;ALTER SYSTEM REGISTER;&lt;br /&gt;&lt;br /&gt;17) Check V$LOGSTDBY &amp; DBA_LOGSTDBY_PROGRESS whether archived logs being applied if not start apply again&lt;br /&gt;&lt;br /&gt;ALTER DATABASE START LOGICAL STANDBY APPLY ;&lt;br /&gt;&lt;br /&gt;select SEQUENCE#, FIRST_TIME, NEXT_TIME, DICT_BEGIN, DICT_END from DBA_LOGSTDBY_LOG order by SEQUENCE#;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635855396776353582-3847888593907087527?l=harioracledba.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://harioracledba.blogspot.com/feeds/3847888593907087527/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635855396776353582&amp;postID=3847888593907087527' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/3847888593907087527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/3847888593907087527'/><link rel='alternate' type='text/html' href='http://harioracledba.blogspot.com/2008/07/logical-standby.html' title='Logical Standby'/><author><name>Hari</name><uri>http://www.blogger.com/profile/08163699296840233717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635855396776353582.post-1107898454791314307</id><published>2008-07-14T09:08:00.000-07:00</published><updated>2008-07-14T09:09:11.710-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DataGuard'/><title type='text'>Physical Standby</title><content type='html'>Steps to create physical standby database which has similar file system structure.&lt;br /&gt;&lt;br /&gt;1) Put the primary database in force logging mode&lt;br /&gt;&lt;br /&gt;ALTER DATABASE FORCE LOGGING;&lt;br /&gt;&lt;br /&gt;2) On primary database enable the below intialization parameter and ensure that database archivelog mode.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; log_archive_dest_1='LOCATION=/oracle/ORCLDB_P/arch’&lt;br /&gt; log_archive_dest_2='SERVICE=ORCLDB_S reopen=60'&lt;br /&gt; log_archive_dest_state_1=enable&lt;br /&gt; log_archive_dest_state_2=enable&lt;br /&gt; log_archive_format=ARCH_%t_%r_%s.dbf&lt;br /&gt;&lt;br /&gt;Shutdown immediate&lt;br /&gt;Startup mount&lt;br /&gt;alter database archivelog;&lt;br /&gt;alter database open;&lt;br /&gt;archive log list;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3) On Standby Database enable the below intialization parameter&lt;br /&gt;&lt;br /&gt; fal_server=ORCLDB_P&lt;br /&gt; fal_client=ORCLDB_S&lt;br /&gt; log_archive_dest_1='LOCATION=/oracle/ORCLDB_P/arch'&lt;br /&gt; log_archive_dest_state_1=enable&lt;br /&gt; log_archive_format=ARCH_%t_%r_%s.dbf&lt;br /&gt;&lt;br /&gt;4) Startup nomount database&lt;br /&gt;&lt;br /&gt;startup nomount;&lt;br /&gt;&lt;br /&gt;5) On standby use RMAN Duplicate to restore standby database from primary&lt;br /&gt;&lt;br /&gt;rman target sys/manager@ORCLDB_P auxiliary sys/manager nocatalog&lt;br /&gt;&lt;br /&gt;run &lt;br /&gt;{&lt;br /&gt;   allocate auxiliary channel c1 type disk;&lt;br /&gt;   DUPLICATE TARGET DATABASE FOR STANDBY DORECOVER;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;6) Put standby database in recover managed mode  &lt;br /&gt;&lt;br /&gt;alter database recover managed standby database disconnect from session;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635855396776353582-1107898454791314307?l=harioracledba.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://harioracledba.blogspot.com/feeds/1107898454791314307/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635855396776353582&amp;postID=1107898454791314307' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/1107898454791314307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/1107898454791314307'/><link rel='alternate' type='text/html' href='http://harioracledba.blogspot.com/2008/07/physical-standby.html' title='Physical Standby'/><author><name>Hari</name><uri>http://www.blogger.com/profile/08163699296840233717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635855396776353582.post-6656075123429055945</id><published>2008-07-13T04:18:00.000-07:00</published><updated>2008-08-28T23:22:15.955-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RMAN'/><title type='text'>Duplicate Database</title><content type='html'>1) On source database ORCLDB1, backup database with archivelog&lt;br /&gt;&lt;br /&gt;Connect to RMAN&lt;br /&gt;&lt;br /&gt;rman target sys/manager nocatalog&lt;br /&gt;&lt;br /&gt;run&lt;br /&gt;{&lt;br /&gt; allocate channel c1 type disk;&lt;br /&gt; backup database plus archivelog&lt;br /&gt; format '/oracle/backup/orcldg1_%U.bck';&lt;br /&gt; release channel c1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;2) On target database ORCLDB2, Run below script with duplicate database command&lt;br /&gt;&lt;br /&gt;Connect to RMAN&lt;br /&gt;&lt;br /&gt;rman target sys/oracle@ORCLDB1 auxiliary sys/oracle nocatalog&lt;br /&gt;&lt;br /&gt;run&lt;br /&gt;{&lt;br /&gt;  allocate auxiliary channel c1 type disk;&lt;br /&gt;  set newname for datafile 1  to '/oradata/db2/SYSTEM01.DBF';&lt;br /&gt;  set newname for datafile 2  to '/oradata/db2/UNDOTBS01.DBF';&lt;br /&gt;  set newname for datafile 3  to '/oradata/db2/SYSAUX01.DBF';&lt;br /&gt;  set newname for datafile 4  to '/oradata/db2/USERS01.DBF';&lt;br /&gt;  set newname for datafile 5  to '/oradata/db2/EXAMPLE01.DBF';&lt;br /&gt;  set newname for datafile 6  to '/oradata/db2/STRMTAB_01.DBF';&lt;br /&gt;  set newname for datafile 7  to '/oradata/db2/LOGMNRTST_01.DBF';&lt;br /&gt;  set newname for tempfile 1  to '/oradata/db2/TEMP01.DBF';&lt;br /&gt;  duplicate target database to ORCLDB2&lt;br /&gt;  logfile&lt;br /&gt;   group 1 ('/oradata/db2/redo1.log') size 200M reuse,&lt;br /&gt;   group 2 ('/oradata/db2/redo2.log') size 200M reuse,&lt;br /&gt;   group 3 ('/oradata/db2/redo3.log') size 200M reuse;  &lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635855396776353582-6656075123429055945?l=harioracledba.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://harioracledba.blogspot.com/feeds/6656075123429055945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635855396776353582&amp;postID=6656075123429055945' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/6656075123429055945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/6656075123429055945'/><link rel='alternate' type='text/html' href='http://harioracledba.blogspot.com/2008/07/duplicate-database.html' title='Duplicate Database'/><author><name>Hari</name><uri>http://www.blogger.com/profile/08163699296840233717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635855396776353582.post-521393143055767369</id><published>2008-07-13T04:11:00.000-07:00</published><updated>2008-07-13T04:14:17.084-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RMAN'/><title type='text'>Refreshing Database</title><content type='html'>1) Backup up source database &lt;br /&gt;&lt;br /&gt;rman target sys/manager nocatalog&lt;br /&gt;&lt;br /&gt;run&lt;br /&gt; {&lt;br /&gt;  allocate channel c1 type disk;&lt;br /&gt;  backup database format '\backup\db1_%U.bck';&lt;br /&gt;  release channel c1;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;2) Backup control file on source database&lt;br /&gt;&lt;br /&gt;ALTER DATABASE BACKUP CONTROLFILE TO '/backup/control.bck';&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3) Copy all required archived logs and backup files along with control file backup to target database archive and backup directory respectively.&lt;br /&gt;&lt;br /&gt;4) Shutdown target database&lt;br /&gt;&lt;br /&gt;5) Copy backup control file to target control file location specified in parameter file&lt;br /&gt;&lt;br /&gt;6) Change the db_name and archive log format of target database parameter file similar to source.&lt;br /&gt;&lt;br /&gt;7) Startup mount target database&lt;br /&gt;&lt;br /&gt;8) Connect to RMAN on target database and restore database (Use set newname to specify new file system path)&lt;br /&gt;&lt;br /&gt;rman target sys/manager nocatalog&lt;br /&gt;&lt;br /&gt;run&lt;br /&gt; {&lt;br /&gt;  allocate channel c1 type disk;&lt;br /&gt;  set newname for datafile 1  to '/oradata/db2/SYSTEM01.DBF';&lt;br /&gt;  set newname for datafile 2  to '/oradata/db2/UNDOTBS01.DBF';&lt;br /&gt;  set newname for datafile 3  to '/oradata/db2/SYSAUX01.DBF';&lt;br /&gt;  set newname for datafile 4  to '/oradata/db2/USERS01.DBF';&lt;br /&gt;  set newname for datafile 5  to '/oradata/db2/EXAMPLE01.DBF';&lt;br /&gt;  set newname for datafile 6  to '/oradata/db2/STRMTAB_01.DBF';&lt;br /&gt;  set newname for datafile 7  to '/oradata/db2/LOGMNRTST_01.DBF';&lt;br /&gt;  restore database;&lt;br /&gt;  switch datafile all;&lt;br /&gt;  release channel c1;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;9) Recover database &lt;br /&gt;&lt;br /&gt;recover database using backup controlfile until cancel;&lt;br /&gt;&lt;br /&gt;10) Take control file trace of target database&lt;br /&gt;&lt;br /&gt;alter database backup controlfile to trace;&lt;br /&gt;&lt;br /&gt;11) Edit the trace control file which is in udump directory with target database name and set database option&lt;br /&gt;&lt;br /&gt;12) Revert back the parameter of target database with old dbname and archive log format&lt;br /&gt;&lt;br /&gt;13) Shutdown immediate target database&lt;br /&gt;&lt;br /&gt;14) Start nomount target database&lt;br /&gt;&lt;br /&gt;15) Recreate the control file which has been edited in step 11&lt;br /&gt;&lt;br /&gt;16) Open database with resetlogs option&lt;br /&gt;&lt;br /&gt;alter database open resetlogs;&lt;br /&gt;&lt;br /&gt;17) Add tempfile with reuse option and rename global database name&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635855396776353582-521393143055767369?l=harioracledba.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://harioracledba.blogspot.com/feeds/521393143055767369/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635855396776353582&amp;postID=521393143055767369' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/521393143055767369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/521393143055767369'/><link rel='alternate' type='text/html' href='http://harioracledba.blogspot.com/2008/07/refreshing-database.html' title='Refreshing Database'/><author><name>Hari</name><uri>http://www.blogger.com/profile/08163699296840233717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635855396776353582.post-7529172149217083492</id><published>2008-07-11T10:03:00.000-07:00</published><updated>2008-07-11T10:18:41.601-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Shell commands and scripts'/><title type='text'>Shell Scripts</title><content type='html'>&lt;strong&gt;Connect to database using Shell script&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;checkdb.ksh&lt;br /&gt;&lt;br /&gt;#Usage: checkdb.ksh ORCLDB&lt;br /&gt;echo $1&lt;br /&gt;sqlplus system@$1/manager&lt;&lt; !&lt;br /&gt;set timing on&lt;br /&gt;set pagesize 100&lt;br /&gt;select name from v\$database;&lt;br /&gt;exit;&lt;br /&gt;! &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Steps for splitting and importing&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;When OS filesize limit set, The dump file can be splitted in to smaller chunks&lt;br /&gt;using split command and imported to database using pipe.&lt;br /&gt;&lt;br /&gt;$ split -b2000m devdb.dmp &amp; &lt;br /&gt;&lt;br /&gt;$ ls -ltr&lt;br /&gt;total 8393333&lt;br /&gt;-rw-r--r--   1 hp nobody   1104011840 Feb 22 05:12 xaf&lt;br /&gt;-rw-r--r--   1 hp nobody   2097152000 Feb 22 05:10 xae&lt;br /&gt;-rw-r--r--   1 hp nobody   2097152000 Feb 22 05:05 xad&lt;br /&gt;-rw-r--r--   1 hp nobody   2097152000 Feb 22 05:00 xac&lt;br /&gt;-rw-r--r--   1 hp nobody   2097152000 Feb 22 04:58 xab&lt;br /&gt;-rw-r--r--   1 hp nobody   2097152000 Feb 22 04:57 xaa&lt;br /&gt;&lt;br /&gt;$ mknod imp_pipe p&lt;br /&gt;&lt;br /&gt;$ ls&lt;br /&gt;imp_pipe xaa xab xac xad xae xaf &lt;br /&gt;&lt;br /&gt;$ cat xaa xab xac xad xae xaf &gt; imp_pipe &amp;&lt;br /&gt;&lt;br /&gt;$imp system/manager@stagedb ignore=y file=imp_pipe log=imp.log fromuser=devuser&lt;br /&gt;touser=stageuser&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635855396776353582-7529172149217083492?l=harioracledba.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://harioracledba.blogspot.com/feeds/7529172149217083492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635855396776353582&amp;postID=7529172149217083492' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/7529172149217083492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/7529172149217083492'/><link rel='alternate' type='text/html' href='http://harioracledba.blogspot.com/2008/07/shell-scripts.html' title='Shell Scripts'/><author><name>Hari</name><uri>http://www.blogger.com/profile/08163699296840233717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635855396776353582.post-662490634449271263</id><published>2008-07-06T02:00:00.000-07:00</published><updated>2008-07-11T09:18:40.976-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle Streams'/><title type='text'>Oracle Streams Schema Replication</title><content type='html'>The below procedure sets one way replication from source to target database&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Initialization Parameters For Streams&lt;/strong&gt;&lt;br /&gt; Set the below intialization paramters   &lt;br /&gt;   &lt;br /&gt;   &lt;br /&gt;COMPATIBLE =10.1.0 or higher.&lt;br /&gt;&lt;br /&gt;GLOBAL_NAMES = TRUE &lt;br /&gt;&lt;br /&gt;JOB_QUEUE_PROCESSES= 4 or higher.&lt;br /&gt;&lt;br /&gt;PARALLEL_MAX_SERVERS= 2 or higher.&lt;br /&gt;&lt;br /&gt;SHARED_POOL_SIZE= 200 MB&lt;br /&gt;&lt;br /&gt;OPEN_LINKS= 4 or higher.&lt;br /&gt;&lt;br /&gt;TIMED_STATISTICS= true. &lt;br /&gt;&lt;br /&gt;LOG_ARCHIVE_DEST_n= set atleast one arch destination, where n is 1, 2, 3, ... 10.&lt;br /&gt;&lt;br /&gt;LOG_ARCHIVE_DEST_STATE_n= set to enable.&lt;br /&gt;&lt;br /&gt;UNDO_RETENTION &gt;900 &lt;br /&gt;&lt;br /&gt;_job_queue_interval=1  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Create streams adminstrator and grant privileges on both Source and Target&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;create user STRMADMIN identified by STRMADMIN;&lt;br /&gt;ALTER USER STRMADMIN DEFAULT TABLESACE STRMTAB;&lt;br /&gt;ALTER USER STRMADMIN QUOTA UNLIMITED ON STRMTAB;&lt;br /&gt;GRANT CONNECT, RESOURCE, AQ_ADMINISTRATOR_ROLE to STRMADMIN;&lt;br /&gt;GRANT SELECT ANY DICTIONARY TO STRMADMIN;&lt;br /&gt;GRANT EXECUTE ON DBMS_AQ TO STRMADMIN;&lt;br /&gt;GRANT EXECUTE ON DBMS_AQADM TO STRMADMIN;&lt;br /&gt;GRANT EXECUTE ON DBMS_FLASHBACK TO STRMADMIN;&lt;br /&gt;GRANT EXECUTE ON DBMS_STREAMS_ADM TO STRMADMIN;&lt;br /&gt;GRANT EXECUTE ON DBMS_CAPTURE_ADM TO STRMADMIN;&lt;br /&gt;GRANT EXECUTE ON DBMS_APPLY_ADM TO STRMADMIN;&lt;br /&gt;GRANT EXECUTE ON DBMS_RULE_ADM TO STRMADMIN;&lt;br /&gt;GRANT EXECUTE ON DBMS_PROPAGATION_ADM TO STRMADMIN;&lt;br /&gt;GRANT DBA to STRMADMIN;&lt;br /&gt;execute DBMS_STREAMS_AUTH.GRANT_ADMIN_PRIVILEGE('STRMADMIN');&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Create streams queue&lt;/strong&gt;&lt;br /&gt;    &lt;br /&gt; connect STRMADMIN/STRMADMIN&lt;br /&gt;&lt;br /&gt;    BEGIN&lt;br /&gt;     DBMS_STREAMS_ADM.SET_UP_QUEUE(&lt;br /&gt;      queue_table =&gt; 'STREAMS_QUEUE_TABLE',&lt;br /&gt;      queue_name =&gt; 'STREAMS_QUEUE', &lt;br /&gt;      queue_user =&gt; 'STRMADMIN');&lt;br /&gt;    END;&lt;br /&gt;    /&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;On Target database ORCDDB2&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Apply rules for the Schema at the destination database :&lt;br /&gt;&lt;br /&gt; BEGIN&lt;br /&gt;  DBMS_STREAMS_ADM.ADD_SCHEMA_RULES(&lt;br /&gt;    schema_name =&gt; 'SCOTT', &lt;br /&gt;    streams_type =&gt; 'APPLY ', &lt;br /&gt;    streams_name =&gt; 'STRMADMIN_APPLY', &lt;br /&gt;    queue_name =&gt; 'STRMADMIN.STREAMS_QUEUE', &lt;br /&gt;    include_dml =&gt; true, &lt;br /&gt;  include_ddl =&gt; true, &lt;br /&gt;    source_database =&gt; 'ORCLDB1');&lt;br /&gt; END;&lt;br /&gt; /&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Specify an 'APPLY USER' at the destination database&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;User which needs to apply all DML statements and DDL statements.&lt;br /&gt; The user specified in the APPLY_USER parameter must have the necessary &lt;br /&gt;  privileges to perform DML and DDL changes on the apply objects.   &lt;br /&gt;&lt;br /&gt;  BEGIN&lt;br /&gt;      DBMS_APPLY_ADM.ALTER_APPLY(&lt;br /&gt;       apply_name =&gt; 'STRMADMIN_APPLY',&lt;br /&gt;       apply_user =&gt; 'SCOTT');&lt;br /&gt; END;&lt;br /&gt; /&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Start the Apply process &lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;DECLARE&lt;br /&gt; v_started number;&lt;br /&gt;BEGIN&lt;br /&gt; SELECT decode(status, 'ENABLED', 1, 0) INTO v_started&lt;br /&gt; FROM DBA_APPLY WHERE APPLY_NAME = 'STRMADMIN_APPLY';&lt;br /&gt; if (v_started = 0) then&lt;br /&gt;   DBMS_APPLY_ADM.START_APPLY(apply_name  =&gt; 'STRMADMIN_APPLY');&lt;br /&gt; end if;&lt;br /&gt;END;&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;strong&gt;Steps to be carried out at the Source Database ORCLDB1&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Move LogMiner tables from SYSTEM tablespace:&lt;br /&gt;&lt;br /&gt;    By default, all LogMiner tables are created in the SYSTEM tablespace.&lt;br /&gt;    It is a good practice to create an alternate tablespace for the LogMiner&lt;br /&gt;    tables.&lt;br /&gt;&lt;br /&gt;    CREATE TABLESPACE LOGMNRTS DATAFILE 'logmnrts.dbf' SIZE 25M AUTOEXTEND ON&lt;br /&gt;    MAXSIZE UNLIMITED;&lt;br /&gt;&lt;br /&gt;    BEGIN&lt;br /&gt;     DBMS_LOGMNR_D.SET_TABLESPACE('LOGMNRTS');&lt;br /&gt;    END;&lt;br /&gt;    /&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Turn on supplemental logging at database level&lt;/strong&gt;&lt;br /&gt;    &lt;br /&gt;    connect SYS/password as SYSDBA&lt;br /&gt;    &lt;br /&gt;ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY, UNIQUE INDEX) COLUMNS;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Create a database link to the source and destination database &lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;    connect STRMADMIN/STRMADMIN&lt;br /&gt;    &lt;br /&gt;    CREATE DATABASE LINK ORCLDB1 connect to&lt;br /&gt;    STRMADMIN identified by STRMADMIN using 'ORCLDB1';&lt;br /&gt;     &lt;br /&gt;    Test the database link to be working properly by querying against the &lt;br /&gt;    destination database.&lt;br /&gt;    Eg : select * from global_name@ORCLDB1;   &lt;br /&gt;&lt;br /&gt;    connect STRMADMIN/STRMADMIN&lt;br /&gt;    &lt;br /&gt;    CREATE DATABASE LINK ORCLDB2 connect to&lt;br /&gt;    STRMADMIN identified by STRMADMIN using 'ORCLDB2';&lt;br /&gt;     &lt;br /&gt;    Test the database link to be working properly by querying against the &lt;br /&gt;    destination database.&lt;br /&gt;    Eg : select * from global_name@ORCLDB2;     &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Add capture rules for the schema SCOTT at the source database&lt;/strong&gt;    &lt;br /&gt;&lt;br /&gt; BEGIN&lt;br /&gt;  DBMS_STREAMS_ADM.ADD_SCHEMA_RULES(&lt;br /&gt;    schema_name =&gt; 'SCOTT', &lt;br /&gt;    streams_type =&gt; 'CAPTURE', &lt;br /&gt;    streams_name =&gt; 'STREAM_CAPTURE', &lt;br /&gt;    queue_name =&gt; 'STRMADMIN.STREAMS_QUEUE', &lt;br /&gt;    include_dml =&gt; true, &lt;br /&gt;  include_ddl =&gt; true, &lt;br /&gt;    source_database =&gt; 'ORCLDB1');&lt;br /&gt; END;&lt;br /&gt; /&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Add propagation rules for the schema SCOTT  at the source database&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;    This step will also create a propagation job to the destination database.&lt;br /&gt;    &lt;br /&gt;     BEGIN&lt;br /&gt;  DBMS_STREAMS_ADM.ADD_SCHEMA_PROPAGATION_RULES(&lt;br /&gt;    schema_name =&gt; 'SCOTT', &lt;br /&gt;    streams_name =&gt; 'STREAM_PROPAGATE', &lt;br /&gt;    source_queue_name =&gt; 'STRMADMIN.STREAMS_QUEUE', &lt;br /&gt;    destination_queue_name =&gt; 'STRMADMIN.STREAMS_QUEUE@ORCLDB2', &lt;br /&gt;    include_dml =&gt; true, &lt;br /&gt;    include_ddl =&gt; true, &lt;br /&gt;    source_database =&gt; 'ORCLDB1');&lt;br /&gt; END;&lt;br /&gt; /&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Export, import and instantiation of tables from Source to Destination Database&lt;/strong&gt; &lt;br /&gt;&lt;br /&gt;exp USERID=SYSTEM/manager@ORCLDB1 OWNER=SCOTT FILE=scott.dmp LOG=exportTables.log OBJECT_CONSISTENT=Y STATISTICS = NONE    &lt;br /&gt;&lt;br /&gt;imp USERID=SYSTEM@ORCLDB2 FILE=scott.dmp LOG=importTables.log FULL=Y CONSTRAINTS=Y IGNORE=Y COMMIT=Y STREAMS_INSTANTIATION=Y  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Start the Capture process on source database ORCLDB1&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     begin&lt;br /&gt;       DBMS_CAPTURE_ADM.START_CAPTURE(capture_name  =&gt; 'STREAM_CAPTURE');&lt;br /&gt;     end;&lt;br /&gt;     /&lt;br /&gt;  &lt;br /&gt;                &lt;br /&gt;The setup is now ready to replicate data between the two databases using &lt;br /&gt;Oracle Streams.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Removing a Streams Configuration&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;To Remove streams configuration use DBMS_STREAMS_ADM.REMOVE_STREAMS_CONFIGURATION and drop Streams user,&lt;br /&gt;&lt;br /&gt;CONN SYS/MANAGER AS SYSDBA&lt;br /&gt;&lt;br /&gt;EXEC DBMS_STREAMS_ADM.REMOVE_STREAMS_CONFIGURATION();&lt;br /&gt;&lt;br /&gt;DROP USER STRMADMIN CASCADE;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;SQL Queries for Monitoring Streams&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Determining Capture to Dequeue Latency for a Message&lt;br /&gt;&lt;br /&gt;COLUMN APPLY_NAME HEADING 'Apply Process|Name' FORMAT A17&lt;br /&gt;COLUMN LATENCY HEADING 'Latency|in|Seconds' FORMAT 9999&lt;br /&gt;COLUMN CREATION HEADING 'Message Creation' FORMAT A17&lt;br /&gt;COLUMN LAST_DEQUEUE HEADING 'Last Dequeue Time' FORMAT A20&lt;br /&gt;COLUMN DEQUEUED_MESSAGE_NUMBER HEADING 'Dequeued|Message Number' FORMAT 999999&lt;br /&gt;&lt;br /&gt;SELECT APPLY_NAME,&lt;br /&gt;     (DEQUEUE_TIME-DEQUEUED_MESSAGE_CREATE_TIME)*86400 LATENCY,&lt;br /&gt;     TO_CHAR(DEQUEUED_MESSAGE_CREATE_TIME,'HH24:MI:SS MM/DD/YY') CREATION,&lt;br /&gt;     TO_CHAR(DEQUEUE_TIME,'HH24:MI:SS MM/DD/YY') LAST_DEQUEUE,&lt;br /&gt;     DEQUEUED_MESSAGE_NUMBER  &lt;br /&gt;  FROM V$STREAMS_APPLY_READER;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;General information about each apply process in a database&lt;br /&gt;&lt;br /&gt;COLUMN APPLY_NAME HEADING 'Apply|Process|Name' FORMAT A15&lt;br /&gt;COLUMN QUEUE_NAME HEADING 'Apply|Process|Queue' FORMAT A15&lt;br /&gt;COLUMN RULE_SET_NAME HEADING 'Positive|Rule Set' FORMAT A15&lt;br /&gt;COLUMN NEGATIVE_RULE_SET_NAME HEADING 'Negative|Rule Set' FORMAT A15&lt;br /&gt;COLUMN STATUS HEADING 'Apply|Process|Status' FORMAT A15&lt;br /&gt;&lt;br /&gt;SELECT APPLY_NAME, &lt;br /&gt;       QUEUE_NAME, &lt;br /&gt;       RULE_SET_NAME, &lt;br /&gt;       NEGATIVE_RULE_SET_NAME,&lt;br /&gt;       STATUS&lt;br /&gt;  FROM DBA_APPLY;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;COLUMN APPLY_NAME HEADING 'Apply Process Name' FORMAT A20&lt;br /&gt;COLUMN APPLY_CAPTURED HEADING 'Type of Messages Applied' FORMAT A25&lt;br /&gt;COLUMN APPLY_USER HEADING 'Apply User' FORMAT A30&lt;br /&gt;&lt;br /&gt;SELECT APPLY_NAME, &lt;br /&gt;       DECODE(APPLY_CAPTURED,&lt;br /&gt;              'YES', 'Captured',&lt;br /&gt;              'NO',  'User-Enqueued') APPLY_CAPTURED,&lt;br /&gt;       APPLY_USER&lt;br /&gt;  FROM DBA_APPLY;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;List Parameter Settings for Each Apply Process&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;COLUMN APPLY_NAME HEADING 'Apply Process|Name' FORMAT A15&lt;br /&gt;COLUMN PARAMETER HEADING 'Parameter' FORMAT A25&lt;br /&gt;COLUMN VALUE HEADING 'Value' FORMAT A20&lt;br /&gt;COLUMN SET_BY_USER HEADING 'Set by User?' FORMAT A15&lt;br /&gt;&lt;br /&gt;SELECT APPLY_NAME,&lt;br /&gt;       PARAMETER, &lt;br /&gt;       VALUE,&lt;br /&gt;       SET_BY_USER  &lt;br /&gt;  FROM DBA_APPLY_PARAMETERS;&lt;br /&gt;&lt;br /&gt;Displays All of the Error Handlers for Local Apply Processes&lt;br /&gt;&lt;br /&gt;COLUMN OBJECT_OWNER HEADING 'Table|Owner' FORMAT A5&lt;br /&gt;COLUMN OBJECT_NAME HEADING 'Table Name' FORMAT A10&lt;br /&gt;COLUMN OPERATION_NAME HEADING 'Operation' FORMAT A10&lt;br /&gt;COLUMN USER_PROCEDURE HEADING 'Handler Procedure' FORMAT A30&lt;br /&gt;COLUMN APPLY_NAME HEADING 'Apply Process|Name' FORMAT A15&lt;br /&gt;&lt;br /&gt;SELECT OBJECT_OWNER, &lt;br /&gt;       OBJECT_NAME, &lt;br /&gt;       OPERATION_NAME, &lt;br /&gt;       USER_PROCEDURE,&lt;br /&gt;       APPLY_NAME &lt;br /&gt;  FROM DBA_APPLY_DML_HANDLERS&lt;br /&gt;  WHERE ERROR_HANDLER = 'Y'&lt;br /&gt;  ORDER BY OBJECT_OWNER, OBJECT_NAME;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Displays the Message Handler for Each Apply Process&lt;br /&gt;&lt;br /&gt;COLUMN APPLY_NAME HEADING 'Apply Process Name' FORMAT A20&lt;br /&gt;COLUMN MESSAGE_HANDLER HEADING 'Message Handler' FORMAT A20&lt;br /&gt;&lt;br /&gt;SELECT APPLY_NAME, MESSAGE_HANDLER FROM DBA_APPLY&lt;br /&gt;  WHERE MESSAGE_HANDLER IS NOT NULL;&lt;br /&gt;&lt;br /&gt;Displays Precommit Handler for Each Apply Process&lt;br /&gt;&lt;br /&gt;COLUMN APPLY_NAME HEADING 'Apply Process Name' FORMAT A20&lt;br /&gt;COLUMN PRECOMMIT_HANDLER HEADING 'Precommit Handler' FORMAT A30&lt;br /&gt;COLUMN APPLY_CAPTURED HEADING 'Type of|Messages|Applied' FORMAT A15&lt;br /&gt;&lt;br /&gt;SELECT APPLY_NAME, &lt;br /&gt;       PRECOMMIT_HANDLER,&lt;br /&gt;       DECODE(APPLY_CAPTURED,&lt;br /&gt;              'YES', 'Captured',&lt;br /&gt;              'NO',  'User-Enqueued') APPLY_CAPTURED&lt;br /&gt;  FROM DBA_APPLY&lt;br /&gt;  WHERE PRECOMMIT_HANDLER IS NOT NULL;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Displays Information About the Reader Server for Each Apply Process&lt;br /&gt;&lt;br /&gt;COLUMN APPLY_NAME HEADING 'Apply Process|Name' FORMAT A15&lt;br /&gt;COLUMN APPLY_CAPTURED HEADING 'Apply Type' FORMAT A22&lt;br /&gt;COLUMN PROCESS_NAME HEADING 'Process|Name' FORMAT A7&lt;br /&gt;COLUMN STATE HEADING 'State' FORMAT A17&lt;br /&gt;COLUMN TOTAL_MESSAGES_DEQUEUED HEADING 'Total Messages|Dequeued' FORMAT 99999999&lt;br /&gt;&lt;br /&gt;SELECT r.APPLY_NAME,&lt;br /&gt;       DECODE(ap.APPLY_CAPTURED,&lt;br /&gt;                'YES','Captured LCRS',&lt;br /&gt;                'NO','User-enqueued messages','UNKNOWN') APPLY_CAPTURED,&lt;br /&gt;       SUBSTR(s.PROGRAM,INSTR(s.PROGRAM,'(')+1,4) PROCESS_NAME,&lt;br /&gt;       r.STATE,&lt;br /&gt;       r.TOTAL_MESSAGES_DEQUEUED&lt;br /&gt;       FROM V$STREAMS_APPLY_READER r, V$SESSION s, DBA_APPLY ap &lt;br /&gt;       WHERE r.SID = s.SID AND &lt;br /&gt;             r.SERIAL# = s.SERIAL# AND &lt;br /&gt;             r.APPLY_NAME = ap.APPLY_NAME;&lt;br /&gt;&lt;br /&gt;Monitoring Transactions and Messages Spilled by Each Apply Process&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;COLUMN APPLY_NAME HEADING 'Apply Name' FORMAT A20&lt;br /&gt;COLUMN 'Transaction ID' HEADING 'Transaction ID' FORMAT A15&lt;br /&gt;COLUMN FIRST_SCN HEADING 'First SCN'   FORMAT 99999999&lt;br /&gt;COLUMN MESSAGE_COUNT HEADING 'Message Count' FORMAT 99999999&lt;br /&gt; &lt;br /&gt;SELECT APPLY_NAME,&lt;br /&gt;       XIDUSN ||'.'|| &lt;br /&gt;       XIDSLT ||'.'||&lt;br /&gt;       XIDSQN "Transaction ID",&lt;br /&gt;       FIRST_SCN,&lt;br /&gt;       MESSAGE_COUNT&lt;br /&gt;  FROM DBA_APPLY_SPILL_TXN;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;COLUMN APPLY_NAME HEADING 'Apply Name' FORMAT A15&lt;br /&gt;COLUMN TOTAL_MESSAGES_SPILLED HEADING 'Total|Spilled Messages' FORMAT 99999999&lt;br /&gt;COLUMN ELAPSED_SPILL_TIME HEADING 'Elapsed Time|Spilling Messages' FORMAT 99999999.99&lt;br /&gt;&lt;br /&gt;SELECT APPLY_NAME,&lt;br /&gt;       TOTAL_MESSAGES_SPILLED,&lt;br /&gt;       (ELAPSED_SPILL_TIME/100) ELAPSED_SPILL_TIME&lt;br /&gt;  FROM V$STREAMS_APPLY_READER;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Displaying General Information About Each Coordinator Process&lt;br /&gt;&lt;br /&gt;COLUMN APPLY_NAME HEADING 'Apply Process|Name' FORMAT A17&lt;br /&gt;COLUMN LATENCY HEADING 'Latency|in|Seconds' FORMAT 9999&lt;br /&gt;COLUMN CREATION HEADING 'Message Creation' FORMAT A17&lt;br /&gt;COLUMN LAST_DEQUEUE HEADING 'Last Dequeue Time' FORMAT A20&lt;br /&gt;COLUMN DEQUEUED_MESSAGE_NUMBER HEADING 'Dequeued|Message Number' FORMAT 999999&lt;br /&gt;&lt;br /&gt;SELECT APPLY_NAME,&lt;br /&gt;     (DEQUEUE_TIME-DEQUEUED_MESSAGE_CREATE_TIME)*86400 LATENCY,&lt;br /&gt;     TO_CHAR(DEQUEUED_MESSAGE_CREATE_TIME,'HH24:MI:SS MM/DD/YY') CREATION,&lt;br /&gt;     TO_CHAR(DEQUEUE_TIME,'HH24:MI:SS MM/DD/YY') LAST_DEQUEUE,&lt;br /&gt;     DEQUEUED_MESSAGE_NUMBER  &lt;br /&gt;  FROM V$STREAMS_APPLY_READER;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Displaying Information About Transactions Received and Applied&lt;br /&gt;&lt;br /&gt;COLUMN APPLY_NAME HEADING 'Apply Process Name' FORMAT A25&lt;br /&gt;COLUMN TOTAL_RECEIVED HEADING 'Total|Trans|Received' FORMAT 99999999&lt;br /&gt;COLUMN TOTAL_APPLIED HEADING 'Total|Trans|Applied' FORMAT 99999999&lt;br /&gt;COLUMN TOTAL_ERRORS HEADING 'Total|Apply|Errors' FORMAT 9999&lt;br /&gt;COLUMN BEING_APPLIED HEADING 'Total|Trans Being|Applied' FORMAT 99999999&lt;br /&gt;COLUMN TOTAL_IGNORED HEADING 'Total|Trans|Ignored' FORMAT 99999999&lt;br /&gt;&lt;br /&gt;SELECT APPLY_NAME,&lt;br /&gt;       TOTAL_RECEIVED,&lt;br /&gt;       TOTAL_APPLIED,&lt;br /&gt;       TOTAL_ERRORS,&lt;br /&gt;       (TOTAL_ASSIGNED - (TOTAL_ROLLBACKS + TOTAL_APPLIED)) BEING_APPLIED,&lt;br /&gt;       TOTAL_IGNORED &lt;br /&gt;       FROM V$STREAMS_APPLY_COORDINATOR;&lt;br /&gt;&lt;br /&gt;V$STREAMS_APPLY_COORDINATOR Query for Latency&lt;br /&gt;&lt;br /&gt;COLUMN APPLY_NAME HEADING 'Apply Process|Name' FORMAT A17&lt;br /&gt;COLUMN 'Latency in Seconds' FORMAT 999999&lt;br /&gt;COLUMN 'Message Creation' FORMAT A17&lt;br /&gt;COLUMN 'Apply Time' FORMAT A17&lt;br /&gt;COLUMN HWM_MESSAGE_NUMBER HEADING 'Applied|Message|Number' FORMAT 999999&lt;br /&gt;&lt;br /&gt;SELECT APPLY_NAME,&lt;br /&gt;     (HWM_TIME-HWM_MESSAGE_CREATE_TIME)*86400 "Latency in Seconds",&lt;br /&gt;     TO_CHAR(HWM_MESSAGE_CREATE_TIME,'HH24:MI:SS MM/DD/YY') &lt;br /&gt;        "Message Creation",&lt;br /&gt;     TO_CHAR(HWM_TIME,'HH24:MI:SS MM/DD/YY') "Apply Time",&lt;br /&gt;     HWM_MESSAGE_NUMBER  &lt;br /&gt;  FROM V$STREAMS_APPLY_COORDINATOR;&lt;br /&gt;&lt;br /&gt;DBA_APPLY_PROGRESS Query for Latency&lt;br /&gt;&lt;br /&gt;COLUMN APPLY_NAME HEADING 'Apply Process|Name' FORMAT A17&lt;br /&gt;COLUMN 'Latency in Seconds' FORMAT 999999&lt;br /&gt;COLUMN 'Message Creation' FORMAT A17&lt;br /&gt;COLUMN 'Apply Time' FORMAT A17&lt;br /&gt;COLUMN APPLIED_MESSAGE_NUMBER HEADING 'Applied|Message|Number' FORMAT 999999&lt;br /&gt;&lt;br /&gt;SELECT APPLY_NAME,&lt;br /&gt;     (APPLY_TIME-APPLIED_MESSAGE_CREATE_TIME)*86400 "Latency in Seconds",&lt;br /&gt;     TO_CHAR(APPLIED_MESSAGE_CREATE_TIME,'HH24:MI:SS MM/DD/YY') &lt;br /&gt;        "Message Creation",&lt;br /&gt;     TO_CHAR(APPLY_TIME,'HH24:MI:SS MM/DD/YY') "Apply Time",&lt;br /&gt;     APPLIED_MESSAGE_NUMBER  &lt;br /&gt;  FROM DBA_APPLY_PROGRESS;&lt;br /&gt;&lt;br /&gt;Checking for Apply Errors&lt;br /&gt;&lt;br /&gt;COLUMN APPLY_NAME HEADING 'Apply|Process|Name' FORMAT A10&lt;br /&gt;COLUMN SOURCE_DATABASE HEADING 'Source|Database' FORMAT A10&lt;br /&gt;COLUMN LOCAL_TRANSACTION_ID HEADING 'Local|Transaction|ID' FORMAT A11&lt;br /&gt;COLUMN ERROR_NUMBER HEADING 'Error Number' FORMAT 99999999&lt;br /&gt;COLUMN ERROR_MESSAGE HEADING 'Error Message' FORMAT A20&lt;br /&gt;COLUMN MESSAGE_COUNT HEADING 'Messages in|Error|Transaction' FORMAT 99999999&lt;br /&gt;&lt;br /&gt;SELECT APPLY_NAME, &lt;br /&gt;       SOURCE_DATABASE, &lt;br /&gt;       LOCAL_TRANSACTION_ID, &lt;br /&gt;       ERROR_NUMBER,&lt;br /&gt;       ERROR_MESSAGE,&lt;br /&gt;       MESSAGE_COUNT&lt;br /&gt;  FROM DBA_APPLY_ERROR;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635855396776353582-662490634449271263?l=harioracledba.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://harioracledba.blogspot.com/feeds/662490634449271263/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635855396776353582&amp;postID=662490634449271263' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/662490634449271263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/662490634449271263'/><link rel='alternate' type='text/html' href='http://harioracledba.blogspot.com/2008/07/oracle-streams-schema-replication.html' title='Oracle Streams Schema Replication'/><author><name>Hari</name><uri>http://www.blogger.com/profile/08163699296840233717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635855396776353582.post-8808375352377342377</id><published>2008-07-03T05:10:00.000-07:00</published><updated>2008-07-11T10:03:34.837-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL scripts'/><title type='text'>SQL scripts</title><content type='html'>To know SID and other information from sqlplus session&lt;br /&gt;======================================================&lt;br /&gt;&lt;br /&gt;SELECT userenv('SID') SID,sys_context('USERENV', 'CURRENT_SCHEMA') SCHEMA,sys_context('USERENV', 'OS_USER') OSUSER,sys_context('USERENV', 'HOST') HOSTNAME FROM DUAL;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Tracing&lt;br /&gt;=======&lt;br /&gt;&lt;br /&gt;At session level&lt;br /&gt;================&lt;br /&gt;&lt;br /&gt;exec dbms_system.set_sql_trace_in_session(1473, 32781, TRUE);&lt;br /&gt;&lt;br /&gt;select 'exec dbms_system.set_sql_trace_in_session('||s.sid||','||s.serial#||', TRUE);' from v$session s,v$process p&lt;br /&gt;where s.paddr = p.addr and &lt;br /&gt;s.username='SCOTT';&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;At DB level&lt;br /&gt;===========&lt;br /&gt;&lt;br /&gt;ALTER SYSTEM SET trace_enabled = TRUE;&lt;br /&gt;&lt;br /&gt;Execute below if trace shows bind variables and wait events&lt;br /&gt;&lt;br /&gt;ALTER SYSTEM SET EVENT=’10046 trace name context forever, level 12’ scope=memory;&lt;br /&gt;&lt;br /&gt;tkprof dbname_ora_17776.trc testtrace.txt explain=dev/dev@dbname sys=no waits=yes sort=exeela,userid&lt;br /&gt;&lt;br /&gt;ls -l dbname_ora*.trc | awk '{print "tkprof "$9" "$9".txt explain=dev/dev@dbname sys=no waits=yes sort=exeela,userid"}'&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;User session as per Logon time&lt;br /&gt;==============================&lt;br /&gt;&lt;br /&gt;set pages 50000;&lt;br /&gt;set linesize 160;&lt;br /&gt;col username for a15&lt;br /&gt;col osuser for a10&lt;br /&gt;col machine for a20&lt;br /&gt;col program for a35&lt;br /&gt;select s.sid,s.serial#,p.spid,s.status,s.username,s.osuser,s.machine,s.program,to_char(s.logon_time,'DD-MON-YYYY HH24:MI:SS') logged_on from v$session s,v$process p where s.paddr = p.addr and s.username='SCOTT' &lt;br /&gt;order by s.osuser;&lt;br /&gt;&lt;br /&gt;To kill all Session for user&lt;br /&gt;============================&lt;br /&gt;&lt;br /&gt;select 'alter system kill session '''||sid||','||serial#||''';' from v$session where username in ('SCOTT');&lt;br /&gt;&lt;br /&gt;Current active session's and sql they are running&lt;br /&gt;================================================&lt;br /&gt;&lt;br /&gt;set pages 10000&lt;br /&gt;col username form a20&lt;br /&gt;col machine form a30&lt;br /&gt;col osuser form a10&lt;br /&gt;select s.username,s.sid,s.serial#,s.osuser,p.spid,s.machine,&lt;br /&gt;sql_text,buffer_gets,executions&lt;br /&gt;from v$sqlarea , v$session s,v$process p&lt;br /&gt;where s.sql_address = address&lt;br /&gt;and s.status = 'ACTIVE'&lt;br /&gt;and s.paddr = p.addr&lt;br /&gt;and s.username is not null&lt;br /&gt;order by buffer_gets desc;&lt;br /&gt;&lt;br /&gt;List all open cursor&lt;br /&gt;====================&lt;br /&gt;&lt;br /&gt;SELECT SID,USER_NAME,SQL_TEXT FROM V$OPEN_CURSOR ORDER BY 1;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Tablespace Usage and freespace&lt;br /&gt;==============================&lt;br /&gt;&lt;br /&gt;SET SERVEROUTPUT ON&lt;br /&gt;SET PAGESIZE 1000&lt;br /&gt;SET LINESIZE 160&lt;br /&gt;&lt;br /&gt;SELECT Substr(df.tablespace_name,1,20) "Tablespace Name",&lt;br /&gt;       Substr(df.file_name,1,40) "File Name",&lt;br /&gt;       Round(df.bytes/1024/1024,2) "Size (M)",&lt;br /&gt;       Round(e.used_bytes/1024/1024,2) "Used (M)",&lt;br /&gt;       Round(f.free_bytes/1024/1024,2) "Free (M)"&lt;br /&gt;FROM   DBA_DATA_FILES DF,&lt;br /&gt;       (SELECT file_id,&lt;br /&gt;               Sum(Decode(bytes,NULL,0,bytes)) used_bytes&lt;br /&gt;        FROM dba_extents&lt;br /&gt;        GROUP by file_id) E,&lt;br /&gt;       (SELECT Max(bytes) free_bytes,&lt;br /&gt;               file_id&lt;br /&gt;        FROM dba_free_space&lt;br /&gt;        GROUP BY file_id) f&lt;br /&gt;WHERE  e.file_id (+) = df.file_id&lt;br /&gt;AND    df.file_id  = f.file_id (+)&lt;br /&gt;ORDER BY df.tablespace_name,&lt;br /&gt;         df.file_name;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Undo Information&lt;br /&gt;================&lt;br /&gt;&lt;br /&gt;column "UserName" format a8&lt;br /&gt;column "DB Sid" format 999999&lt;br /&gt;column "Unix Pid" format 99999999&lt;br /&gt;column "Trnx_start_time" format a19&lt;br /&gt;column "Current Time" format a19&lt;br /&gt;column "Elapsed(mins)" format 999999999.99&lt;br /&gt;column "Undo Name" format a09&lt;br /&gt;column "Used Undo Blks" format a13&lt;br /&gt;column "Used Undo Size(Kb)" format a17&lt;br /&gt;column "Logical I/O(Blks)" format 99999999999999999&lt;br /&gt;column "Logical I/O(Kb)" format 999999999999999&lt;br /&gt;column "Physical I/O(Blks)" format 999999999999999999&lt;br /&gt;column "Physical I/O(Kb)" format 999999999999999999&lt;br /&gt;&lt;br /&gt;SELECT&lt;br /&gt;    a.username  "UserName"&lt;br /&gt;  , a.sid       "DB Sid"&lt;br /&gt;  , e.spid      "Unix Pid"&lt;br /&gt;  , TO_CHAR(TO_DATE(b.start_time,'mm/dd/yy hh24:mi:ss'),'yyyy/mm/dd hh24:mi:ss') "Trnx_start_time"&lt;br /&gt;  , TO_CHAR(sysdate,'yyyy/mm/dd hh24:mi:ss') "Current Time"&lt;br /&gt;  , ROUND(60*24*(sysdate-to_date(b.start_time,'mm/dd/yy hh24:mi:ss')),2) "Elapsed(mins)"&lt;br /&gt;  , c.segment_name "Undo Name"&lt;br /&gt;  , TO_CHAR(b.used_ublk*d.value/1024) "Used Undo Size(Kb)"&lt;br /&gt;  , TO_CHAR(b.used_ublk) "Used Undo Blks"&lt;br /&gt;  , b.log_io "Logical I/O(Blks)"&lt;br /&gt;  , b.log_io*d.value/1024 "Logical I/O(Kb)"&lt;br /&gt;  , b.phy_io "Physical I/O(Blks)"&lt;br /&gt;  , b.phy_io*d.value/1024 "Physical I/O(Kb)"&lt;br /&gt;  , a.program&lt;br /&gt;FROM&lt;br /&gt;    v$session         a&lt;br /&gt;  , v$transaction     b&lt;br /&gt;  , dba_rollback_segs c&lt;br /&gt;  , v$parameter       d&lt;br /&gt;  , v$process         e&lt;br /&gt;WHERE&lt;br /&gt;      b.ses_addr = a.saddr&lt;br /&gt;  AND b.xidusn   = c.segment_id&lt;br /&gt;  AND d.name     = 'db_block_size'&lt;br /&gt;  AND e.ADDR     = a.PADDR&lt;br /&gt;ORDER BY 4&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;select   e.sid,e.serial#, substr(a.os_user_name,1,8)    "OS User"&lt;br /&gt; , substr(a.oracle_username,1,8) "DB User"&lt;br /&gt;       , substr(b.owner,1,8)  "Schema"&lt;br /&gt; , substr(b.object_name,1,20)    "Object Name"&lt;br /&gt;    , substr(b.object_type,1,10)    "Type"&lt;br /&gt;       , substr(c.segment_name,1,15)  "RBS"&lt;br /&gt;       , substr(d.used_urec,1,12)      "# of Records"&lt;br /&gt;,e.program&lt;br /&gt;from v$locked_object      a&lt;br /&gt;     , dba_objects b&lt;br /&gt;     , dba_rollback_segs  c&lt;br /&gt;     , v$transaction      d&lt;br /&gt; , v$session e&lt;br /&gt;where   a.object_id =  b.object_id&lt;br /&gt; and a.xidusn    =  c.segment_id&lt;br /&gt;    and a.xidusn    =  d.xidusn&lt;br /&gt;    and a.xidslot   =  d.xidslot&lt;br /&gt; and d.addr      =  e.taddr&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;select  e.sid&lt;br /&gt;       , oracle_username&lt;br /&gt;       , b.owner&lt;br /&gt;       , b.object_name&lt;br /&gt;       , b.object_type&lt;br /&gt;       , segment_name&lt;br /&gt;       , d.used_urec&lt;br /&gt;       , sysdate&lt;br /&gt;from v$locked_object      a&lt;br /&gt;     , dba_objects        b&lt;br /&gt;     , dba_rollback_segs  c&lt;br /&gt;     , v$transaction      d&lt;br /&gt;     , v$session          e&lt;br /&gt;where   a.object_id =  b.object_id&lt;br /&gt;       and a.xidusn =  c.segment_id&lt;br /&gt;    and a.xidusn    =  d.xidusn&lt;br /&gt;    and a.xidslot   =  d.xidslot&lt;br /&gt;    and d.addr      =  e.taddr&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;TEMP Tablespace Usage&lt;br /&gt;=====================&lt;br /&gt;&lt;br /&gt;SELECT b.sid,b.serial#,a.sql_text&lt;br /&gt;FROM   v$sqltext a,&lt;br /&gt;       v$session b&lt;br /&gt;WHERE  a.address = b.sql_address&lt;br /&gt;AND    a.hash_value = b.sql_hash_value&lt;br /&gt;AND    b.sid in (select se.sid&lt;br /&gt;from v$sort_usage so,v$session se&lt;br /&gt;where so.session_addr = se.saddr&lt;br /&gt;and   se.USERNAME not in ('SYSTEM')&lt;br /&gt;and so.blocks*8/1024 &gt;100)&lt;br /&gt;ORDER BY b.sid,a.piece;&lt;br /&gt;&lt;br /&gt;Active session&lt;br /&gt;==============&lt;br /&gt;&lt;br /&gt;select s.sid,s.serial#,p.spid,s.username,s.osuser,s.machine, sql_text,v$sqlarea.hash_value,&lt;br /&gt;logon_time,last_call_et,sysdate&lt;br /&gt;       from v$sqlarea , v$session s,v$process p&lt;br /&gt;       where s.sql_address = address&lt;br /&gt;       and s.status = 'ACTIVE'&lt;br /&gt;       and s.paddr = p.addr&lt;br /&gt;       and s.username is not null&lt;br /&gt;       and last_call_et &gt; 0&lt;br /&gt;order by last_call_et&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;select s.username,s.sid,s.serial#,s.osuser,p.spid,s.machine, sql_text,buffer_gets,executions,buffer_gets/executions "gets_per_exec" ,v$sqlarea.hash_value&lt;br /&gt;       from v$sqlarea , v$session s,v$process p&lt;br /&gt;       where s.sql_address = address&lt;br /&gt;       and s.status = 'ACTIVE'&lt;br /&gt;       and s.paddr = p.addr&lt;br /&gt;       and s.username is not null&lt;br /&gt;       and executions &gt; 0&lt;br /&gt;       order by buffer_gets desc&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Locks and Blocking information&lt;br /&gt;==============================&lt;br /&gt;&lt;br /&gt;SET LINESIZE 145&lt;br /&gt;SET PAGESIZE 66&lt;br /&gt;&lt;br /&gt;COLUMN owner        FORMAT a5      HEADING 'Owner'&lt;br /&gt;COLUMN object_type  FORMAT a10     HEADING 'Type'&lt;br /&gt;COLUMN object_name  FORMAT a25     HEADING 'Name'&lt;br /&gt;COLUMN locked_mode  FORMAT a9      HEADING 'Locked Mode'&lt;br /&gt;COLUMN sid          FORMAT 999     HEADING 'SID'&lt;br /&gt;COLUMN username     FORMAT a15     HEADING 'Database User'&lt;br /&gt;COLUMN osuser       FORMAT a10     HEADING 'O/S User'&lt;br /&gt;COLUMN logon_time                  HEADING 'Login Time'&lt;br /&gt;&lt;br /&gt;SELECT&lt;br /&gt;    SUBSTR(b.owner, 1, 8)           owner&lt;br /&gt;  , b.object_type                   object_type&lt;br /&gt;  , SUBSTR(b.object_name, 1, 18)    object_name&lt;br /&gt;  , DECODE(a.locked_mode&lt;br /&gt;             , 0, 'None'&lt;br /&gt;             , 1, 'Null'&lt;br /&gt;             , 2, 'Row-S'&lt;br /&gt;             , 3, 'Row-X'&lt;br /&gt;             , 4, 'Share'&lt;br /&gt;             , 5, 'S/Row-X'&lt;br /&gt;             , 6, 'Exclusive')      locked_mode&lt;br /&gt;  , a.session_id                    sid&lt;br /&gt;  ,a.oracle_username                username&lt;br /&gt;  , a.os_user_name                  osuser&lt;br /&gt;  , TO_CHAR(c.logon_time,'YYYY/MM/DD HH24:MI:SS') logon_time&lt;br /&gt;FROM&lt;br /&gt;    v$locked_object a&lt;br /&gt;  , dba_objects b&lt;br /&gt;  , v$session c&lt;br /&gt;WHERE&lt;br /&gt;      a.object_id  = b.object_id&lt;br /&gt;  AND a.session_id = c.sid&lt;br /&gt;ORDER BY&lt;br /&gt;    b.owner&lt;br /&gt;  , b.object_type&lt;br /&gt;  , b.object_name&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;col USERNAME for a20&lt;br /&gt;&lt;br /&gt;select &lt;br /&gt;s.sid,s.serial#,s.username, s.status,&lt;br /&gt;s.osuser,o.object_name, q.sql_text&lt;br /&gt;from v$session s, v$sqlarea q,v$locked_object l,dba_objects o&lt;br /&gt;where s.sql_hash_value = q.hash_value&lt;br /&gt;and s.sql_address = q.address&lt;br /&gt;and l.object_id=o.object_id&lt;br /&gt;and l.session_id=s.sid&lt;br /&gt;and s.username = 'SCOTT';&lt;br /&gt;&lt;br /&gt;select &lt;br /&gt;s.sid,s.serial#,s.username, s.status,&lt;br /&gt;s.osuser,o.object_name&lt;br /&gt;from v$session s,v$locked_object l,dba_objects o&lt;br /&gt;where&lt;br /&gt;l.object_id=o.object_id&lt;br /&gt;and l.session_id=s.sid&lt;br /&gt;and s.username = 'SCOTT';&lt;br /&gt;&lt;br /&gt;Few scripts to identify Blocking locks.&lt;br /&gt;=======================================&lt;br /&gt;&lt;br /&gt;$ORACLE_HOME/rdbms/admin/utllockt.sql&lt;br /&gt;&lt;br /&gt;The above script provided by oracle will give you a "tree" structure of&lt;br /&gt;which sessions are holding locks that are affecting other users.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;select * from v$lock ;&lt;br /&gt;&lt;br /&gt;To identify the blocking/blocked sessions.&lt;br /&gt;==========================================&lt;br /&gt;select l1.sid, ' IS BLOCKING ', l2.sid from v$lock l1, v$lock l2&lt;br /&gt;where l1.block =1 and l2.request &gt; 0 and l1.id1=l2.id1 and l1.id2=l2.id2;&lt;br /&gt;&lt;br /&gt;or&lt;br /&gt;&lt;br /&gt;Same in a readable format.&lt;br /&gt;============================&lt;br /&gt;select s1.username || '@' || s1.machine || ' ( SID=' || s1.sid || ' )  is blocking '  || s2.username || '@' || s2.machine || ' ( SID=' || s2.sid || ' ) ' AS blocking_status&lt;br /&gt;from v$lock l1, v$session s1, v$lock l2, v$session s2&lt;br /&gt;where s1.sid=l1.sid and s2.sid=l2.sid and l1.BLOCK=1 and l2.request &gt; 0&lt;br /&gt;and l1.id1 = l2.id1&lt;br /&gt;and l2.id2 = l2.id2 ;&lt;br /&gt;&lt;br /&gt;To Identify the locked object and row&lt;br /&gt;======================================&lt;br /&gt;select do.object_name, row_wait_obj#, row_wait_file#, row_wait_block#, row_wait_row#,&lt;br /&gt;dbms_rowid.rowid_create ( 1, ROW_WAIT_OBJ#, ROW_WAIT_FILE#, ROW_WAIT_BLOCK#, ROW_WAIT_ROW# )&lt;br /&gt;from v$session s, dba_objects do where sid=122 and s.ROW_WAIT_OBJ# = do.OBJECT_ID ;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Identify deadlock&lt;br /&gt;=================&lt;br /&gt;&lt;br /&gt;select sid,DECODE(block,0,'NO','YES') BLOCKER,&lt;br /&gt;DECODE(request,0,'NO','YES') WAITER&lt;br /&gt;from v$lock&lt;br /&gt;Where request &gt; 0 or block &gt; 0&lt;br /&gt;order by block desc;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Session Wait&lt;br /&gt;============&lt;br /&gt;&lt;br /&gt;col sid form 9999&lt;br /&gt;col osuser form a14&lt;br /&gt;col username form a15&lt;br /&gt;col wait form 9999999&lt;br /&gt;col event form a30&lt;br /&gt;select w.sid,s.username,s.osuser,w.seconds_in_wait wait,&lt;br /&gt;w.event&lt;br /&gt;from v$session_wait w,v$session s&lt;br /&gt;where lower(w.event) not in (&lt;br /&gt;'null event',&lt;br /&gt;'client message',&lt;br /&gt;'pmon timer',&lt;br /&gt;'rdbms ipc message',&lt;br /&gt;'rdbms ipc reply',&lt;br /&gt;'smon timer',&lt;br /&gt;lower('WMON goes to sleep'),&lt;br /&gt;'virtual circuit status',&lt;br /&gt;'dispatcher timer',&lt;br /&gt;lower('SQL*Net message from client'),&lt;br /&gt;'parallel query dequeue wait',&lt;br /&gt;lower('Parallel Query Idle Wait - Slaves'),&lt;br /&gt;lower('KXFX: Execution Message Dequeue - Slave'),&lt;br /&gt;'slave wait')&lt;br /&gt;and s.sid = w.sid&lt;br /&gt;order by wait;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MTS&lt;br /&gt;===&lt;br /&gt;&lt;br /&gt;select paddr,type,queued,wait,totalq, decode(totalq,0,0,(wait/totalq)) "AVG WAIT" from v$queue&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;select name "NAME", substr(network,1,15) "PROTOCOL",status "STATUS", (busy/(busy + idle)) * 100 "% TIME BUSY"      from v$dispatcher&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;select name, status, requests, (busy/(busy+idle)) * 100 "% TIME BUSY" from v$shared_server&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Performance tuninng&lt;br /&gt;===================&lt;br /&gt;&lt;br /&gt;#REM#Buffer cache hit ratio&lt;br /&gt;&lt;br /&gt;/***********************************************&lt;br /&gt;This script is used to calculate hit ratio of data buffer.&lt;br /&gt;If the hit ratio is less than 80%-90%, increase the db_buffer_buffers by using&lt;br /&gt;alter system set db_cache_size=”bigger size” scope=both;&lt;br /&gt;&lt;br /&gt;************************************************/&lt;br /&gt;&lt;br /&gt;column xn1 format a50&lt;br /&gt;column xn2 format a50&lt;br /&gt;column xn3 format a50&lt;br /&gt;column xv1 new_value xxv1 noprint&lt;br /&gt;column xv2 new_value xxv2 noprint&lt;br /&gt;column xv3 new_value xxv3 noprint&lt;br /&gt;column d1 format a50&lt;br /&gt;column d2 format a50&lt;br /&gt;&lt;br /&gt;prompt HIT RATIO:&lt;br /&gt;prompt&lt;br /&gt;prompt Values Hit Ratio is calculated against:&lt;br /&gt;prompt&lt;br /&gt;&lt;br /&gt;select lpad(name,20,' ')||' = '||value xn1, value xv1&lt;br /&gt;from v$sysstat&lt;br /&gt;where name = 'db block gets'&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;select lpad(name,20,' ')||' = '||value xn2, value xv2&lt;br /&gt;from v$sysstat&lt;br /&gt;where name = 'consistent gets'&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;select lpad(name,20,' ')||' = '||value xn3, value xv3&lt;br /&gt;from v$sysstat b&lt;br /&gt;where name = 'physical reads'&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;set pages 60&lt;br /&gt;&lt;br /&gt;select 'Logical reads = db block gets + consistent gets ',&lt;br /&gt;lpad ('Logical Reads = ',24,' ')||to_char(&amp;xxv1+&amp;xxv2) d1&lt;br /&gt;from dual&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;select 'Hit Ratio = (logical reads - physical reads) / logical reads',&lt;br /&gt;lpad('Hit Ratio = ',24,' ')||&lt;br /&gt;round( (((&amp;xxv2+&amp;xxv1) - &amp;xxv3) / (&amp;xxv2+&amp;xxv1))*100,2 )||'%' d2&lt;br /&gt;from dual&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;column "Consistent Gets" format 9,999,999,999,999&lt;br /&gt;column "DB Block Gets" format 9,999,999,999,999&lt;br /&gt;column "Hit Ratio" format 999.99&lt;br /&gt;&lt;br /&gt;  SELECT (1 - (phys.value / (db.value + cons.value))) * 100&lt;br /&gt;  FROM   v$sysstat phys,&lt;br /&gt;         v$sysstat db,&lt;br /&gt;         v$sysstat cons&lt;br /&gt;  WHERE  phys.name  = 'physical reads'&lt;br /&gt;  AND    db.name    = 'db block gets'&lt;br /&gt;  AND    cons.name  = 'consistent gets';&lt;br /&gt;&lt;br /&gt;set serveroutput on;&lt;br /&gt;variable g char(10);&lt;br /&gt;variable d number;&lt;br /&gt;variable c number;&lt;br /&gt;variable r number;&lt;br /&gt;begin&lt;br /&gt;  select  substr(global_name,1,10) into :g&lt;br /&gt;   from  global_name;&lt;br /&gt;  select value into :c&lt;br /&gt;  from v$sysstat&lt;br /&gt;  where name = 'consistent gets';&lt;br /&gt;  select value into :d&lt;br /&gt;  from v$sysstat&lt;br /&gt;  where name = 'db block gets';&lt;br /&gt;  select to_number(substr((1- value/( :c + :d)),1,5))*100 into :r&lt;br /&gt;  from v$sysstat&lt;br /&gt;  where name in ( 'physical reads');&lt;br /&gt;  dbms_output.put_line('Buffer cache hit ratio for '||:g||' is '||:r||'%');&lt;br /&gt;end;&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#REM#Dict. Cache Hit Ratio&lt;br /&gt;&lt;br /&gt;SELECT (1 - (Sum(getmisses)/(Sum(gets) + Sum(getmisses)))) * 100&lt;br /&gt;FROM   v$rowcache;&lt;br /&gt;&lt;br /&gt;#REM#Library Cache Hit Ratio&lt;br /&gt;&lt;br /&gt;SELECT (1 -(Sum(reloads)/(Sum(pins) + Sum(reloads)))) * 100 from v$librarycache;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#REM#Latch Hit Ratio&lt;br /&gt;&lt;br /&gt;SELECT (1 - (Sum(misses) / Sum(gets))) * 100 FROM   v$latch;&lt;br /&gt;&lt;br /&gt;#REM# Sort Ratio&lt;br /&gt;&lt;br /&gt;select (disk.value/mem.value) * 100 from v$sysstat disk, v$sysstat mem where disk.name='sorts(disk)'&lt;br /&gt;and mem.name='sorts(memory)';&lt;br /&gt;&lt;br /&gt;#REM#Rollback segment Waits&lt;br /&gt;&lt;br /&gt;select (sum(waits)/sum(gets)) * 100 from v$rollstat;&lt;br /&gt;&lt;br /&gt;#REM#Shared Pool Size (Execution Misses)&lt;br /&gt;&lt;br /&gt;select sum(pins) "Executions" , sum(reloads) "Cache Misses Executing", (sum(reloads)/sum(pins) * 100) "% Ratio"&lt;br /&gt;from v$librarycache;&lt;br /&gt;&lt;br /&gt;#REM#Shared Pool Size (Dictionary Gets)&lt;br /&gt;&lt;br /&gt;select sum(gets) "Data Dictonary Gets", sum(getmisses) "Get Misses" , 100*(sum(getmisses)/sum(gets)) "% Ratio"&lt;br /&gt;from v$rowcache;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#REM#If % Ratio is above 1%, increase SHARED_POOL_SIZE&lt;br /&gt;&lt;br /&gt;select sum(pins) "Executions",&lt;br /&gt;       sum(reloads) "Cache Misses Executing",&lt;br /&gt;       (sum(reloads)/sum(pins)*100) "% Ratio"&lt;br /&gt;from v$librarycache&lt;br /&gt;&lt;br /&gt;#REM#If % Ratio is above 12%, increase SHARED_POOL_SIZE&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;select sum(gets) "Data Dictionary Gets",&lt;br /&gt;       sum(getmisses) "Get Misses",&lt;br /&gt;       100*(sum(getmisses)/sum(gets)) "% Ratio"&lt;br /&gt;from v$rowcache&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;#REM#If the Value is not near 0, increase LOG_BUFFER&lt;br /&gt;&lt;br /&gt;select  substr(name,1,25) Name,&lt;br /&gt;        substr(value,1,15) "VALUE (Near 0?)"&lt;br /&gt;from v$sysstat&lt;br /&gt;where name = 'redo log space requests';&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#REM# Physical read and write (IO)&lt;br /&gt;&lt;br /&gt;SET PAGESIZE 1000&lt;br /&gt;&lt;br /&gt;SELECT Substr(d.name,1,50) "File Name",&lt;br /&gt;       f.phyblkrd "Blocks Read",&lt;br /&gt;       f.phyblkwrt "Blocks Writen",&lt;br /&gt;       f.phyblkrd + f.phyblkwrt "Total I/O"&lt;br /&gt;FROM   v$filestat f,&lt;br /&gt;       v$datafile d&lt;br /&gt;WHERE  d.file# = f.file#&lt;br /&gt;ORDER BY f.phyblkrd + f.phyblkwrt DESC;&lt;br /&gt;&lt;br /&gt;#REM# Session IO&lt;br /&gt;&lt;br /&gt;SELECT * FROM v$sess_io WHERE SID=117;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#REM#Pls substitute the value for no of top SQL's consuming resources&lt;br /&gt;&lt;br /&gt;SET LINESIZE 500&lt;br /&gt;SET PAGESIZE 1000&lt;br /&gt;SET FEEDBACK OFF&lt;br /&gt;SET VERIFY OFF&lt;br /&gt;SET SERVEROUTPUT ON&lt;br /&gt;PROMPT&lt;br /&gt;&lt;br /&gt;DECLARE&lt;br /&gt;&lt;br /&gt;  CURSOR c_sql IS&lt;br /&gt;    SELECT Substr(a.sql_text,1,50) sql_text,&lt;br /&gt;           Trunc(a.disk_reads/Decode(a.executions,0,1,a.executions)) reads_per_execution,&lt;br /&gt;           a.buffer_gets,&lt;br /&gt;           a.disk_reads,&lt;br /&gt;           a.executions,&lt;br /&gt;           a.sorts,&lt;br /&gt;           a.address&lt;br /&gt;    FROM   v$sqlarea a&lt;br /&gt;    ORDER BY 2 DESC;&lt;br /&gt;&lt;br /&gt;BEGIN&lt;br /&gt;&lt;br /&gt;  Dbms_Output.Enable(1000000);&lt;br /&gt;&lt;br /&gt;  Dbms_Output.Put_Line(Rpad('SQL Text',50,' ') ||&lt;br /&gt;                       Lpad('Reads/Execution',16,' ') ||&lt;br /&gt;                       Lpad('Buffer Gets',12,' ') ||&lt;br /&gt;                       Lpad('Disk Reads',12,' ') ||&lt;br /&gt;                       Lpad('Executions',12,' ') ||&lt;br /&gt;                       Lpad('Sorts',12,' ') ||&lt;br /&gt;                       Lpad('Address',10,' '));&lt;br /&gt;  Dbms_Output.Put_Line(Rpad('-',50,'-') || ' ' ||&lt;br /&gt;                       Lpad('-',15,'-') || ' ' ||&lt;br /&gt;                       Lpad('-',11,'-') || ' ' ||&lt;br /&gt;                       Lpad('-',11,'-') || ' ' ||&lt;br /&gt;                       Lpad('-',11,'-') || ' ' ||&lt;br /&gt;                       Lpad('-',11,'-') || ' ' ||&lt;br /&gt;                       Lpad('-',9,'-'));&lt;br /&gt;&lt;br /&gt;  &lt;&lt; top_sql &gt;&gt;&lt;br /&gt;  FOR cur_rec IN c_sql LOOP&lt;br /&gt;    Dbms_Output.Put_Line(Rpad(cur_rec.sql_text,50,' ') ||&lt;br /&gt;                         Lpad(cur_rec.reads_per_execution,16,' ') ||&lt;br /&gt;                         Lpad(cur_rec.buffer_gets,12,' ') ||&lt;br /&gt;                         Lpad(cur_rec.disk_reads,12,' ') ||&lt;br /&gt;                         Lpad(cur_rec.executions,12,' ') ||&lt;br /&gt;                         Lpad(cur_rec.sorts,12,' ') ||&lt;br /&gt;                         Lpad(cur_rec.address,10,' '));&lt;br /&gt;&lt;br /&gt;    IF c_sql%ROWCOUNT = &amp;&amp;1 THEN&lt;br /&gt;      EXIT top_sql;&lt;br /&gt;    END IF;&lt;br /&gt;  END LOOP;&lt;br /&gt;&lt;br /&gt;END;&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;OVERALL CPU USAGE&lt;br /&gt;=================&lt;br /&gt;&lt;br /&gt;select  distinct a.name, a.value "Total CPU",&lt;br /&gt; b.value "Parse CPU",&lt;br /&gt; c.value "Recursive CPU",&lt;br /&gt; (a.value - b.value - c.value) "Other"&lt;br /&gt;from v$sysstat a, v$sysstat b, v$sysstat c&lt;br /&gt;where a.name = 'CPU used by this session'&lt;br /&gt;  and b.name = 'parse CPU time'&lt;br /&gt;  and c.name = 'recursive CPU';&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SID which has taken maximum CPU&lt;br /&gt;===============================&lt;br /&gt;&lt;br /&gt;col username form a15&lt;br /&gt;set pages 10000&lt;br /&gt;col name form a30&lt;br /&gt;select s.username,se.sid,st.name,se.value/(60*100) "In Minutes"&lt;br /&gt;from v$sesstat se,v$statname st,v$session s&lt;br /&gt;where se.STATISTIC#=st.STATISTIC#&lt;br /&gt;and st.name like '%CPU%'&lt;br /&gt;and se.value &gt; 12000&lt;br /&gt;and s.sid=se.sid&lt;br /&gt;order by se.value/(60*100);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CPU USAGE PER SESSION&lt;br /&gt;====================&lt;br /&gt;&lt;br /&gt;select  distinct a.name, a.value "Total CPU",&lt;br /&gt; b.value "Parse CPU",&lt;br /&gt; c.value "Recursive CPU",&lt;br /&gt; (a.value - b.value - c.value) "Other CPU"&lt;br /&gt;from v$sysstat a, v$sysstat b, v$sysstat c&lt;br /&gt;where a.statistic#=12&lt;br /&gt;  and b.statistic#=150&lt;br /&gt;  and c.statistic#=8;&lt;br /&gt;&lt;br /&gt;Memory used by non applicaton user&lt;br /&gt;==================================&lt;br /&gt;&lt;br /&gt;SELECT A.username, COUNT(*), SUM (B.sharable_mem) sharable_mem,&lt;br /&gt;SUM (B.persistent_mem) persistent_mem,&lt;br /&gt;SUM (B.runtime_mem) runtime_mem,&lt;br /&gt;SUM (B.sharable_mem + B.persistent_mem + B.runtime_mem) total_mem&lt;br /&gt;FROM dba_users A, v$sql B&lt;br /&gt;WHERE A.username IN ('DBSNMP', 'SYS', 'SYSTEM', 'SYSMAN')&lt;br /&gt;AND B.parsing_user_id = A.user_id&lt;br /&gt;GROUP BY A.username;&lt;br /&gt;&lt;br /&gt;Latch Contention&lt;br /&gt;================&lt;br /&gt;&lt;br /&gt;col name form A25&lt;br /&gt;col gets form 999,999,999&lt;br /&gt;col misses form 999.99&lt;br /&gt;col spins form 999.99&lt;br /&gt;col igets form 999,999,999&lt;br /&gt;col imisses form 999.99&lt;br /&gt;&lt;br /&gt;select name,gets,misses*100/decode(gets,0,1,gets) misses,&lt;br /&gt;spin_gets*100/decode(misses,0,1,misses) spins, immediate_gets igets&lt;br /&gt;,immediate_misses*100/decode(immediate_gets,0,1,immediate_gets) imisses&lt;br /&gt;from v$latch order by gets + immediate_gets&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Analyze&lt;br /&gt;=======&lt;br /&gt;&lt;br /&gt;Validate structure&lt;br /&gt;&lt;br /&gt;Select 'Analyze '||object_type||' '||object_name||' validate structure;'&lt;br /&gt;  from dba_objects&lt;br /&gt;  where owner='SYS'&lt;br /&gt;  and object_type in ('INDEX','TABLE','CLUSTER');&lt;br /&gt;  &lt;br /&gt;Gather stats with Histograms&lt;br /&gt;============================&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;dbms_stats.gather_schema_stats(&lt;br /&gt;ownname =&gt; 'HR', &lt;br /&gt;estimate_percent =&gt; dbms_stats.auto_sample_size, &lt;br /&gt;method_opt =&gt; 'FOR ALL INDEXED COLUMNS SIZE AUTO', &lt;br /&gt;cascade =&gt; true, &lt;br /&gt;degree =&gt; 2&lt;br /&gt;);&lt;br /&gt;end;&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;Script to do collect statistics for HR schema at 9 PM&lt;br /&gt;=====================================================&lt;br /&gt;&lt;br /&gt;BEGIN&lt;br /&gt;DBMS_SCHEDULER.DROP_JOB (&lt;br /&gt;job_name =&gt; 'HR_STATS_REFRESH'&lt;br /&gt;,force =&gt; TRUE);&lt;br /&gt;DBMS_SCHEDULER.CREATE_JOB (&lt;br /&gt;job_name =&gt; 'HR_STATS_REFRESH'&lt;br /&gt;,job_type =&gt; 'PLSQL_BLOCK'&lt;br /&gt;,job_action =&gt; 'BEGIN DBMS_STATS.GATHER_SCHEMA_STATS(''HR'');END;'&lt;br /&gt;,start_date =&gt; '09/01/2004 09:00:00.000000'&lt;br /&gt;,repeat_interval =&gt; 'FREQ=DAILY'&lt;br /&gt;,enabled =&gt; FALSE&lt;br /&gt;,comments =&gt; 'Refreshes the HR Schema every night at 9 PM'&lt;br /&gt;);&lt;br /&gt;END;&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;Archiver&lt;br /&gt;========&lt;br /&gt;&lt;br /&gt;#REM# show db in archive log mode or not&lt;br /&gt;&lt;br /&gt;archive log list&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#REM Arciver gap&lt;br /&gt;&lt;br /&gt;SELECT MAX(R.SEQUENCE#) LAST_SEQ_RECD, MAX(L.SEQUENCE#) LAST_SEQ_SENT FROM V$ARCHIVED_LOG R, V$LOG L WHERE R.DEST_ID=2 AND L.ARCHIVED='YES'&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Hanganalyze&lt;br /&gt;===========&lt;br /&gt;&lt;br /&gt;SQL&gt; ALTER SESSION SET MAX_DUMP_FILE_SIZE=UNLIMITED;&lt;br /&gt;&lt;br /&gt;Session altered.&lt;br /&gt;&lt;br /&gt;SQL&gt; oradebug setmypid&lt;br /&gt;Statement processed.&lt;br /&gt;SQL&gt; oradebug hanganalyze 3&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Usefull SQL's&lt;br /&gt;=============&lt;br /&gt;&lt;br /&gt;#REM# delete duplicate rows from table&lt;br /&gt;&lt;br /&gt;delete from dummy where rowid not in (select min(rowid) from dummy group by n1);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#REM Total db size&lt;br /&gt;&lt;br /&gt;select sum(bytes)/1024/1024 allocated_space from dba_data_files;&lt;br /&gt;select name from v$database;&lt;br /&gt;select sum(bytes)/1024/1024 from dba_temp_files;&lt;br /&gt;&lt;br /&gt;Find the primary key column&lt;br /&gt;===========================&lt;br /&gt;&lt;br /&gt;set linesize 160;&lt;br /&gt;set pages 50000;&lt;br /&gt;col table_name for a45;&lt;br /&gt;col column_name for a60;&lt;br /&gt;col constraint_name for a45;&lt;br /&gt;select t.TABLE_NAME,t.COLUMN_NAME,t.CONSTRAINT_NAME,c.CONSTRAINT_TYPE from USER_CONSTRAINTS c,user_cons_columns t where t.CONSTRAINT_NAME=c.CONSTRAINT_NAME and t.TABLE_NAME=c.TABLE_NAME and constraint_type='P' order by t.COLUMN_NAME;&lt;br /&gt;&lt;br /&gt;SELECT CON.TABLE_NAME,COL.COLUMN_NAME,CON.CONSTRAINT_TYPE FROM DBA_CONSTRAINTS CON,DBA_CONS_COLUMNS COL &lt;br /&gt;WHERE CON.TABLE_NAME=COL.TABLE_NAME AND CON.CONSTRAINT_NAME=COL.CONSTRAINT_NAME AND CON.OWNER='SCOTT' AND COL.OWNER='SCOTT' AND CON.CONSTRAINT_TYPE IN ('P','U') ORDER BY CON.TABLE_NAME;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635855396776353582-8808375352377342377?l=harioracledba.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://harioracledba.blogspot.com/feeds/8808375352377342377/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635855396776353582&amp;postID=8808375352377342377' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/8808375352377342377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/8808375352377342377'/><link rel='alternate' type='text/html' href='http://harioracledba.blogspot.com/2008/07/sql-scripts.html' title='SQL scripts'/><author><name>Hari</name><uri>http://www.blogger.com/profile/08163699296840233717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635855396776353582.post-6267905219486428216</id><published>2008-06-25T12:30:00.000-07:00</published><updated>2008-06-25T12:33:38.511-07:00</updated><title type='text'>Database Upgrade</title><content type='html'>For 9i/10g&lt;br /&gt;&lt;br /&gt;Shutdown database to do patch installation&lt;br /&gt;&lt;br /&gt;Use runinstaller to upgrade the binary it to higher version&lt;br /&gt;&lt;br /&gt;Ensure SHARED_POOL_SIZE and JAVA_POOL_SIZE are atleast 150M &lt;br /&gt;&lt;br /&gt;SQL&gt; SHOW PARAMETER SHARED_POOL_SIZE&lt;br /&gt;SQL&gt; SHOW PARAMETER JAVA_POOL_SIZE&lt;br /&gt;&lt;br /&gt;If not set as below&lt;br /&gt;&lt;br /&gt;SQL&gt; ALTER SYSTEM SET SHARED_POOL_SIZE='150M' SCOPE=spfile; &lt;br /&gt;&lt;br /&gt;SQL&gt; ALTER SYSTEM SET JAVA_POOL_SIZE='150M' SCOPE=spfile; &lt;br /&gt;&lt;br /&gt;Shut down database: &lt;br /&gt;&lt;br /&gt;SQL&gt; SHUTDOWN&lt;br /&gt;&lt;br /&gt;Start upgrade: [10g]&lt;br /&gt;&lt;br /&gt;SQL&gt; STARTUP UPGRADE&lt;br /&gt;SQL&gt; SPOOL upgrade.log&lt;br /&gt;SQL&gt; @?/rdbms/admin/catupgrd.sql&lt;br /&gt;SQL&gt; SPOOL OFF&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Start upgrade: [9i]&lt;br /&gt;&lt;br /&gt;SQL&gt; startup migrate &lt;br /&gt;SQL&gt; spool upgrade.log&lt;br /&gt;SQL&gt; @?/rdbms/admin/catpatch.sql&lt;br /&gt;SQL&gt; spool off&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;Review the upgrade.log file for any errors &lt;br /&gt;&lt;br /&gt;Restart the database: &lt;br /&gt;&lt;br /&gt;SQL&gt; SHUTDOWN IMMEDIATE&lt;br /&gt;&lt;br /&gt;SQL&gt; STARTUP&lt;br /&gt;&lt;br /&gt;Run the utlrp.sql script to recompile all invalid PL/SQL packages &lt;br /&gt;SQL&gt; @?/rdbms/admin/utlrp.sql&lt;br /&gt;&lt;br /&gt;Start listener&lt;br /&gt;&lt;br /&gt;$lsnrctl start LISTENER&lt;br /&gt;&lt;br /&gt;Check database connectivity&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635855396776353582-6267905219486428216?l=harioracledba.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://harioracledba.blogspot.com/feeds/6267905219486428216/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635855396776353582&amp;postID=6267905219486428216' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/6267905219486428216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/6267905219486428216'/><link rel='alternate' type='text/html' href='http://harioracledba.blogspot.com/2008/06/database-upgrade.html' title='Database Upgrade'/><author><name>Hari</name><uri>http://www.blogger.com/profile/08163699296840233717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635855396776353582.post-2966055018645979108</id><published>2008-06-20T11:39:00.000-07:00</published><updated>2008-06-25T05:44:30.961-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Performance Tuning'/><title type='text'>SQL Optimizers (RBO &amp; CBO)</title><content type='html'>&lt;p class="Body"&gt;Whenever you execute a SQL statement, a component of the&lt;br /&gt;database known as the &lt;em class="Emphasis"&gt;optimizer&lt;/em&gt; must decide how best&lt;br /&gt;to access the data operated on by that statement. Oracle supports two&lt;br /&gt;optimizers: the rule-base optimizer (which was the original), and the cost-based&lt;br /&gt;optimizer. &lt;/p&gt;&lt;p class="Body"&gt;To figure out the optimal execution path for a statement, the&lt;br /&gt;optimizers consider the following:&lt;/p&gt;&lt;ul&gt;&lt;br /&gt;&lt;li class="ListBullet"&gt;The syntax you've specified for the statement &lt;/li&gt;&lt;li class="ListBullet"&gt;Any conditions that the data must satisfy (the WHERE&lt;br /&gt;clauses) &lt;/li&gt;&lt;li class="ListBullet"&gt;The database tables your statement will need to access &lt;/li&gt;&lt;li class="ListBullet"&gt;All possible indexes that can be used in retrieving&lt;br /&gt;data from the table &lt;/li&gt;&lt;li class="ListBullet"&gt;The Oracle RDBMS version &lt;/li&gt;&lt;li class="ListBullet"&gt;The current optimizer mode&lt;/li&gt;&lt;li class="ListBullet"&gt;SQL statement hints &lt;/li&gt;&lt;li class="ListBullet"&gt;All available object statistics (generated via the&lt;br /&gt;ANALYZE command) &lt;/li&gt;&lt;li class="ListBullet"&gt;The physical table location (distributed SQL) &lt;/li&gt;&lt;li class="ListBullet"&gt;INIT.ORA settings (parallel query, async I/O, etc.)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p class="Body"&gt;Oracle gives you a choice of two optimizing alternatives: the&lt;br /&gt;predictable rule-based optimizer and the more intelligent cost-based optimizer.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;h3 class="HeadB"&gt;Understanding the Rule-Based Optimizer&lt;/h3&gt;&lt;br /&gt;&lt;p class="Body"&gt;The rule-based optimizer (RBO) uses a predefined set of&lt;br /&gt;precedence rules to figure out which path it will use to access the database.&lt;br /&gt;The RDBMS kernel defaults to the rule-based optimizer under a number of&lt;br /&gt;conditions, including:&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li class="ListBullet"&gt;OPTIMIZER_MODE = RULE is specified in your INIT.ORA&lt;br /&gt;file &lt;/li&gt;&lt;li class="ListBullet"&gt;OPTIMIZER_MODE = CHOOSE is specified in your INIT.ORA&lt;br /&gt;file, and&lt;b class="EmphasisBold"&gt; &lt;/b&gt;no statistics exist for&lt;br /&gt;&lt;em class="Emphasis"&gt;any&lt;/em&gt; table involved in the statement &lt;/li&gt;&lt;li class="ListBullet"&gt;An ALTER SESSION SET OPTIMIZER_MODE = RULE command has&lt;br /&gt;been issued &lt;/li&gt;&lt;li class="ListBullet"&gt;An ALTER SESSION SET OPTIMIZER_MODE = CHOOSE&lt;b class="EmphasisBold"&gt;&lt;br /&gt;&lt;/b&gt;command has been issued, and no statistics exist for &lt;em class="Emphasis"&gt;&lt;br /&gt;any&lt;/em&gt; table involved in the statement &lt;/li&gt;&lt;li class="ListBullet"&gt;The rule hint (e.g., SELECT /*+ RULE */. . .) has been&lt;br /&gt;used in the statement &lt;/li&gt;&lt;/ul&gt;&lt;p class="ListBullet"&gt;Using the RBO, the optimizer chooses an execution plan based on the access paths available and the ranks of these access paths. Oracle's ranking of the access paths is heuristic. If there is more than one way to execute a SQL statement, then the RBO always uses the operation with the lower rank. Usually, operations of lower rank execute faster than those associated with constructs of higher rank.&lt;/p&gt;&lt;p class="ListBullet"&gt;&lt;strong&gt;Rule-based optimizer condition rankings&lt;/strong&gt; &lt;/p&gt;&lt;p class="ListBullet"&gt;RBO Path 1: Single Row by Rowid&lt;br /&gt;RBO Path 2: Single Row by Cluster Join&lt;br /&gt;RBO Path 3: Single Row by Hash Cluster Key with Unique or Primary Key&lt;br /&gt;RBO Path 4: Single Row by Unique or Primary Key&lt;br /&gt;RBO Path 5: Clustered Join&lt;br /&gt;RBO Path 6: Hash Cluster Key&lt;br /&gt;RBO Path 7: Indexed Cluster Key&lt;br /&gt;RBO Path 8: Composite Index&lt;br /&gt;RBO Path 9: Single-Column Indexes&lt;br /&gt;RBO Path 10: Bounded Range Search on Indexed Columns&lt;br /&gt;RBO Path 11: Unbounded Range Search on Indexed Columns&lt;br /&gt;RBO Path 12: Sort Merge Join&lt;br /&gt;RBO Path 13: MAX or MIN of Indexed Column&lt;br /&gt;RBO Path 14: ORDER BY on Indexed Column&lt;br /&gt;&lt;span style="font-size:0;"&gt;RBO Path 15: Full Table Scan&lt;/span&gt;&lt;/p&gt;&lt;p class="ListBullet"&gt;&lt;a href="http://www.oracle.com.cn/other/9ionlinedoc/server.920/a96533/rbo.htm"&gt;http://www.oracle.com.cn/other/9ionlinedoc/server.920/a96533/rbo.htm&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;h3 class="HeadB"&gt;Understanding the Cost-Based Optimizer&lt;/h3&gt;&lt;br /&gt;&lt;p class="ListBullet"&gt;The CBO determines which execution plan is most efficient by considering available access paths and by factoring in information based on statistics for the schema objects (tables or indexes) accessed by the SQL statement. The CBO also considers hints, which are optimization suggestions placed in a comment in the statement.&lt;/p&gt;&lt;p class="ListBullet"&gt;The CBO performs the following steps:&lt;br /&gt;The optimizer generates a set of potential plans for the SQL statement based on available access paths and hints. The optimizer estimates the cost of each plan based on statistics in the data dictionary for the data distribution and storage characteristics of the tables, indexes, and partitions accessed by the statement.&lt;br /&gt;The cost is an estimated value proportional to the expected resource use needed to execute the statement with a particular plan. The optimizer calculates the cost of access paths and join orders based on the estimated computer resources, which includes I/O, CPU, and memory.&lt;br /&gt;Serial plans with higher costs take more time to execute than those with smaller costs. When using a parallel plan, however, resource use is not directly related to elapsed time.&lt;br /&gt;The optimizer compares the costs of the plans and chooses the one with the lowest cost&lt;/p&gt;&lt;p class="ListBullet"&gt;&lt;strong&gt;CBO Statistics in the Data Dictionary&lt;/strong&gt;&lt;/p&gt;&lt;p class="ListBullet"&gt;The statistics used by the CBO are stored in the data dictionary. You can collect exact or estimated statistics about physical storage characteristics and data distribution in these schema objects by using the DBMS_STATS package or the ANALYZE statement.&lt;br /&gt;Oracle strongly recommends that you use the DBMS_STATS package rather than ANALYZE to collect optimizer statistics. That package lets you collect statistics in parallel, collect global statistics for partitioned objects, and fine tune your statistics collection in other ways. Further, the cost-based optimizer will eventually use only statistics that have been collected by DBMS_STATS. However, you must use the ANALYZE statement rather than DBMS_STATS for statistics collection not related to the cost-based optimizer, such as:&lt;br /&gt;To use the VALIDATE or LIST CHAINED ROWS clauses To collect information on freelist blocks&lt;br /&gt;To maintain the effectiveness of the CBO, you must have statistics that are representative of the data. For table columns that contain values with large variations in number of duplicates, called skewed data, you should collect histograms.&lt;br /&gt;The resulting statistics provide the CBO with information about data uniqueness and distribution. Using this information, the CBO is able to compute plan costs with a high degree of accuracy. This enables the CBO to choose the best execution plan based on the least cost. &lt;/p&gt;&lt;p class="ListBullet"&gt;&lt;strong&gt;How the CBO Optimizes SQL Statements for Fast Response&lt;/strong&gt;&lt;/p&gt;&lt;p class="ListBullet"&gt;&lt;br /&gt;The CBO can optimize a SQL statement for fast response when the parameter OPTIMIZER_MODE is set to FIRST_ROWS_n, where n is 1, 10, 100, or 1000, or FIRST_ROWS. A hint FIRST_ROWS(n), where n is any positive integer, or FIRST_ROWS can be used to optimize an individual SQL statement for fast response.&lt;br /&gt;Fast-response optimization is suitable for online users, such as those using Oracle Forms or Web access. Typically, online users are interested in seeing the first few rows and seldom look at the entire query result, especially when the result size is large. For such users, it makes sense to optimize the query to produce the first few rows as quickly as possible, even if the time to produce the entire query result is not minimized.&lt;br /&gt;With fast-response optimization, the CBO generates a plan with the lowest cost to produce the first row or the first few rows. The CBO employs two different fast-response optimizations, referred to here as the old and new methods. The old method is used with the FIRST_ROWS hint or parameter value. With the old method, the CBO uses a mixture of costs and rules to produce a plan. It is retained for backward compatibility reasons.&lt;br /&gt;The new method is totally based on costs, and it is sensitive to the value of n. With small values of n, the CBO tends to generate plans that consist of nested loop joins with index lookups. With large values of n, the CBO tends to generate plans that consist of hash joins and full table scans.&lt;br /&gt;The value of n should be chosen based on the online user requirement and depends specifically on how the result is displayed to the user. Generally, Oracle Forms users see the result one row at a time and they are typically interested in seeing the first few screens. Other online users see the result one group of rows at a time.&lt;br /&gt;With the fast-response method, the CBO explores different plans and computes the cost to produce the first n rows for each. It picks the plan that produces the first n rows at lowest cost. Remember that with fast-response optimization, a plan that produces the first n rows at lowest cost might not be the optimal plan to produce the entire result. If the requirement is to obtain the entire result of a query, then fast-response optimization should not be used. Instead use the ALL_ROWS parameter value or hint.&lt;/p&gt;&lt;p class="ListBullet"&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635855396776353582-2966055018645979108?l=harioracledba.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://harioracledba.blogspot.com/feeds/2966055018645979108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635855396776353582&amp;postID=2966055018645979108' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/2966055018645979108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/2966055018645979108'/><link rel='alternate' type='text/html' href='http://harioracledba.blogspot.com/2008/06/sql-optimizers-rbo-cbo.html' title='SQL Optimizers (RBO &amp; CBO)'/><author><name>Hari</name><uri>http://www.blogger.com/profile/08163699296840233717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635855396776353582.post-7502955894662501194</id><published>2008-06-20T11:07:00.000-07:00</published><updated>2008-06-20T11:26:20.306-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Performance Tuning'/><title type='text'>SQL Tuning Tips</title><content type='html'>&lt;ul&gt;  &lt;p&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;TIP 1 :&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:85%;"&gt; SQL cannot be shared   within Oracle unless it is &lt;b&gt;&lt;i&gt;absolutely&lt;/i&gt;&lt;/b&gt; identical.  Statements   must have match exactly in case, white space and underlying schema objects to   be shared within Oracle's memory.  Oracle avoids the parsing step for each   subsequent use of an identical statement. &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;  &lt;/span&gt;&lt;/p&gt;  &lt;center&gt;  &lt;table cellspacing="5" cellpadding="5" width="92%" border="1"&gt;    &lt;tr&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;sql&amp;gt; SELECT NAME FROM S_CUSTOMER WHERE ID = 212;&lt;/span&gt;&lt;/td&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;statement to match&lt;/span&gt;&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;sql&amp;gt; SELECT NAME FROM s_customer WHERE ID = 212;&lt;/span&gt;&lt;/td&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;lower case&lt;/span&gt;&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;sql&amp;gt; SELECT NAME FROM S_CUSTOMER WHERE ID=212;&lt;/span&gt;&lt;/td&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;white space&lt;/span&gt;&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;sql&amp;gt; SELECT NAME  &lt;br /&gt;                      FROM S_CUSTOMER  &lt;br /&gt;              WHERE ID=212; &lt;/span&gt;&lt;/td&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;white space&lt;/span&gt;&lt;/td&gt;    &lt;/tr&gt;  &lt;/table&gt;  &lt;/center&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/p&gt;  &lt;ul&gt;    &lt;li&gt;&lt;span style="font-size:85%;"&gt;Use SQL standards within an application.  Rules like the     following are easy to implement and will allow more sharing within Oracle's     memory. &lt;/span&gt;&lt;/li&gt;  &lt;/ul&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;  &lt;/span&gt;&lt;/p&gt;  &lt;ul&gt;    &lt;ul&gt;      &lt;p&gt;&lt;span style="font-size:85%;"&gt;-  Using a single case for all SQL verbs &lt;br /&gt;      -  Beginning all SQL verbs on a new line &lt;br /&gt;      -  Right or left aligning verbs within the initial SQL verb &lt;br /&gt;      -  Separating all words with a single space&lt;/span&gt;&lt;/p&gt;    &lt;/ul&gt;  &lt;/ul&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;  &lt;br /&gt;    &lt;/span&gt;&lt;/p&gt;  &lt;ul&gt;    &lt;li&gt;&lt;span style="font-size:85%;"&gt;Use bind variables.  The values of bind variables do not     need to be the same for two statements to be considered identical.  Bind     variables are not substituted until a statement has been successfully     parsed. &lt;/span&gt;&lt;/li&gt;  &lt;/ul&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;  &lt;/span&gt;&lt;/p&gt;  &lt;table cellspacing="5" cellpadding="5" width="92%" border="1"&gt;    &lt;tr&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;Sharable SQL&lt;/span&gt;&lt;/td&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT * FROM emp WHERE emp_no = :B1;&lt;/span&gt;&lt;/td&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;Bind value: 123&lt;/span&gt;&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt; &lt;/td&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT * FROM emp WHERE emp_no = :B1;&lt;/span&gt;&lt;/td&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;Bind value: 987&lt;/span&gt;&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;Non-sharable SQL&lt;/span&gt;&lt;/td&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT * FROM emp WHERE emp_no = 123;&lt;/span&gt;&lt;/td&gt;      &lt;td&gt; &lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt; &lt;/td&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT * FROM emp WHERE emp_no = 987;&lt;/span&gt;&lt;/td&gt;      &lt;td&gt; &lt;/td&gt;    &lt;/tr&gt;  &lt;/table&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;  &lt;br /&gt;    &lt;/span&gt;&lt;/p&gt;  &lt;ul&gt;    &lt;li&gt;&lt;span style="font-size:85%;"&gt;Use a standard approach to table aliases.  If two     identical SQL statements vary because an identical table has two different     aliases, then the SQL is different and will not be shared. &lt;/span&gt;&lt;/li&gt;  &lt;/ul&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;  &lt;/span&gt;&lt;/p&gt;  &lt;ul&gt;    &lt;li&gt;&lt;span style="font-size:85%;"&gt;Use table aliases and prefix all column names by their     aliases when more than one table is involved in a query.  This reduces parse     time AND prevents future syntax errors if someone adds a column to one of     the tables with the same name as a column in another table.  (ORA-00918:     COLUMN AMBIGUOUSLY DEFINED) &lt;/span&gt;&lt;/li&gt;  &lt;/ul&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;/ul&gt;&lt;ul&gt;  &lt;p&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;TIP 2: &lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:85%;"&gt; Beware of WHERE clauses   which do not use indexes at all.  Even if there is an index over a column that   is referenced by a WHERE clause included in this section, Oracle will ignore   the index.  All of these WHERE clauses can be re-written to use an index while   returning the same values.  In other words,&lt;b&gt; &lt;/b&gt;&lt;i&gt;don't perform operations   on database objects referenced in the WHERE clause.&lt;/i&gt; &lt;br /&gt;    &lt;br /&gt;    &lt;/span&gt;&lt;/p&gt;  &lt;table cellspacing="5" cols="2" cellpadding="5" width="93%" border="1"&gt;    &lt;tr align="middle"&gt;      &lt;td&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;Do Not Use&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;      &lt;td&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;Use&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT account_name, trans_date, amount  &lt;br /&gt;      FROM transaction  &lt;br /&gt;      WHERE &lt;b&gt;SUBSTR(account_name,1,7)&lt;/b&gt; = 'CAPITAL';&lt;/span&gt;&lt;/td&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT account_name, trans_date, amount  &lt;br /&gt;      FROM transaction  &lt;br /&gt;      WHERE account_name &lt;b&gt;LIKE 'CAPITAL%'&lt;/b&gt;;&lt;/span&gt;&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT account_name, trans_date, amount  &lt;br /&gt;      FROM transaction  &lt;br /&gt;      WHERE &lt;b&gt;account_name = &lt;/b&gt;NVL ( :acc_name, &lt;b&gt;account_name&lt;/b&gt;);&lt;/span&gt;&lt;/td&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT account_name, trans_date, amount  &lt;br /&gt;      FROM transaction  &lt;br /&gt;      WHERE &lt;b&gt;account_name&lt;/b&gt; LIKE NVL ( :acc_name, '%');&lt;/span&gt;&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT account_name, trans_date, amount  &lt;br /&gt;      FROM transaction  &lt;br /&gt;      WHERE &lt;b&gt;TRUNC (trans_date)&lt;/b&gt; = TRUNC (SYSDATE);&lt;/span&gt;&lt;/td&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT account_name, trans_date, amount  &lt;br /&gt;      FROM transaction  &lt;br /&gt;      WHERE trans_date &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;BETWEEN TRUNC (SYSDATE) AND       TRUNC (SYSDATE) + .99999;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT account_name, trans_date, amount  &lt;br /&gt;      FROM transaction  &lt;br /&gt;      WHERE &lt;b&gt;account_name  account_type &lt;/b&gt;= 'AMEXA';&lt;/span&gt;&lt;/td&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT account_name, trans_date, amount  &lt;br /&gt;      FROM transaction  &lt;br /&gt;      WHERE &lt;b&gt;account_name = 'AMEX'&lt;/b&gt;  &lt;br /&gt;      &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;AND account_type = 'A';&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT account_name, trans_date, amount  &lt;br /&gt;      FROM transaction  &lt;br /&gt;      WHERE &lt;b&gt;amount + 3000 &lt;/b&gt;&amp;lt; 5000;&lt;/span&gt;&lt;/td&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT account_name, trans_date, amount  &lt;br /&gt;      FROM transaction  &lt;br /&gt;      WHERE &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;amount &amp;lt; 2000;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT account_name, trans_date, amount  &lt;br /&gt;      FROM transaction  &lt;br /&gt;      WHERE amount &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;!= 0;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT account_name, trans_date, amount  &lt;br /&gt;      FROM transaction  &lt;br /&gt;      WHERE amount &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;&amp;gt; 0;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT account_name, trans_date, amount  &lt;br /&gt;      FROM transaction  &lt;br /&gt;      WHERE amount  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;NOT = 0;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT account_name, trans_date, amount  &lt;br /&gt;      FROM transaction  &lt;br /&gt;      WHERE amount &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;&amp;gt; 0;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;    &lt;/tr&gt;  &lt;/table&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;  &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;TIP 3:&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:85%;"&gt;  Don't forget to tune   views.  Views are SELECT statements and can be tuned in just the same way as   any other type of SELECT statement can be.  All tuning applicable to any SQL   statement are equally applicable to views. &lt;br /&gt;    &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;TIP 4:&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:85%;"&gt;  Avoid including a   HAVING clause in SELECT statements.  The HAVING clause filters selected rows   only after all rows have been fetched.  Using a WHERE clause helps reduce   overheads in sorting, summing, etc.  HAVING clauses should only be used when   columns with summary operations applied to them are restricted by the clause.  &lt;br /&gt;    &lt;br /&gt;    &lt;/span&gt;&lt;/p&gt;  &lt;table cellspacing="5" cols="2" cellpadding="5" width="92%" border="1"&gt;    &lt;tr align="middle"&gt;      &lt;td&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;Do Not Use&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;      &lt;td&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;Use&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT region, AVG (loc_size)  &lt;br /&gt;      FROM location  &lt;br /&gt;      GROUP BY region  &lt;br /&gt;      &lt;b&gt;HAVING&lt;/b&gt; region != 'SYDNEY'  &lt;br /&gt;      AND region != 'PERTH';&lt;/span&gt;&lt;/td&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT region, AVG (loc_size)  &lt;br /&gt;      FROM location  &lt;br /&gt;      &lt;b&gt;WHERE&lt;/b&gt; region != 'SYDNEY'  &lt;br /&gt;      AND region != 'PERTH';  &lt;br /&gt;      GROUP BY region;&lt;/span&gt;&lt;/td&gt;    &lt;/tr&gt;  &lt;/table&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;  &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;TIP 5:&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:85%;"&gt;  Minimize the number of   table lookups (subquery blocks) in queries, particularly if your statements   include subquery SELECTs or multicolumn UPDATEs. &lt;br /&gt;    &lt;br /&gt;    &lt;/span&gt;&lt;/p&gt;  &lt;table cellspacing="5" cellpadding="5" width="92%" border="1"&gt;    &lt;tr&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;Separate  &lt;br /&gt;      Subqueries&lt;/span&gt;&lt;/td&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT emp_name  &lt;br /&gt;      FROM emp  &lt;br /&gt;      WHERE &lt;b&gt;emp_cat&lt;/b&gt; = (&lt;b&gt;SELECT&lt;/b&gt; MAX (category)  &lt;br /&gt;                                       FROM emp_categories)  &lt;br /&gt;      AND &lt;b&gt;emp_range&lt;/b&gt; = (&lt;b&gt;SELECT&lt;/b&gt; MAX (sal_range)  &lt;br /&gt;                                       FROM emp_categories)  &lt;br /&gt;      AND emp_dept = 0020;&lt;/span&gt;&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;Combined  &lt;br /&gt;      Subqueries&lt;/span&gt;&lt;/td&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT emp_name  &lt;br /&gt;      FROM emp  &lt;br /&gt;      WHERE (&lt;b&gt;emp_cat, sal_range&lt;/b&gt;)  &lt;br /&gt;              = (&lt;b&gt;SELECT&lt;/b&gt; MAX (category), MAX (sal_range)  &lt;br /&gt;                         FROM emp_categories)  &lt;br /&gt;      AND emp_dept = 0020;&lt;/span&gt;&lt;/td&gt;    &lt;/tr&gt;  &lt;/table&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;  &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;TIP 6:&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:85%;"&gt;  Consider the   alternatives EXISTS, IN and table joins when doing multiple table joins.  None   of these are consistently faster; it depends on your data.  If there is a poor   performer here, it's likely the IN clause. &lt;br /&gt;    &lt;br /&gt;   (Note, this query returns the employee names from each department in   department category 'A'.) &lt;/span&gt;&lt;/p&gt;  &lt;table cellspacing="5" cols="1" cellpadding="5" width="92%" border="1"&gt;    &lt;tr&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT emp_name  &lt;br /&gt;      FROM emp E  &lt;br /&gt;      WHERE &lt;b&gt;EXISTS&lt;/b&gt; ( SELECT 'X'  &lt;br /&gt;                                     FROM dept  &lt;br /&gt;                                     WHERE dept_no = E.dept_no  &lt;br /&gt;                                     AND dept_cat = 'A');&lt;/span&gt;&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT emp_name  &lt;br /&gt;      FROM emp E  &lt;br /&gt;      WHERE dept_no &lt;b&gt;IN&lt;/b&gt; ( SELECT dept_no  &lt;br /&gt;                            FROM dept  &lt;br /&gt;                            WHERE dept_no = E.dept_no  &lt;br /&gt;                             AND dept_cat = 'A');&lt;/span&gt;&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT emp_name  &lt;br /&gt;      FROM dept D, emp E  &lt;br /&gt;      WHERE E.dept_no = D.dept_no  &lt;br /&gt;      AND D.dept_cat = 'A';&lt;/span&gt;&lt;/td&gt;    &lt;/tr&gt;  &lt;/table&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;  &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;TIP 7:&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:85%;"&gt;  Avoid joins that   require the DISTINCT qualifier on the SELECT list in queries which are used to   determine information at the owner end of a one-to-many relationship.  The   DISTINCT operator causes Oracle to fetch all rows satisfying the table join   and then sort and filter out duplicate values.  EXISTS is a faster   alternative, because the Oracle optimizer realizes when the subquery has been   satisfied once, there is no need to proceed further and the next matching row   can be fetched. &lt;br /&gt;    &lt;br /&gt;   (Note:  This query returns all department numbers and names which have at   least one employee.) &lt;/span&gt;&lt;/p&gt;  &lt;table cellspacing="5" cols="2" cellpadding="5" width="92%" border="1"&gt;    &lt;tr align="middle"&gt;      &lt;td&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;Do Not Use&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;      &lt;td&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;Use&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT &lt;b&gt;DISTINCT dept_no, dept_name&lt;/b&gt;  &lt;br /&gt;      FROM dept D,  &lt;br /&gt;                  emp E  &lt;br /&gt;      WHERE D.dept_no = E.dept_no;&lt;/span&gt;&lt;/td&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT dept_no, dept_name  &lt;br /&gt;      FROM dept D  &lt;br /&gt;      WHERE &lt;b&gt;EXISTS&lt;/b&gt; (  &lt;br /&gt;                            SELECT 'X'  &lt;br /&gt;                            FROM emp E  &lt;br /&gt;                            WHERE E.dept_no = D.dept_no);&lt;/span&gt;&lt;/td&gt;    &lt;/tr&gt;  &lt;/table&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;  &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;TIP 8:&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:85%;"&gt;  Consider whether a   UNION ALL will suffice in place of a UNION.  The UNION clause forces all rows   returned by each portion of the UNION to be sorted and merged and duplicates   to be filtered before the first row is returned.  A UNION ALL simply returns   all rows including duplicates and does not have to perform any sort, merge or   filter.  If your tables are mutually exclusive (include no duplicate records),   or you don't care if duplicates are returned, the UNION ALL is much more   efficient. &lt;br /&gt;    &lt;br /&gt;    &lt;/span&gt;&lt;/p&gt;  &lt;table cellspacing="5" cols="2" cellpadding="5" width="92%" border="1"&gt;    &lt;tr align="middle"&gt;      &lt;td&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;UNION&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;      &lt;td&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;UNION ALL&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT acct_num, balance_amt  &lt;br /&gt;      FROM debit_transactions  &lt;br /&gt;      WHERE tran_date = '31-DEC-95'  &lt;br /&gt;      &lt;b&gt;UNION&lt;/b&gt;  &lt;br /&gt;      SELECT acct_num, balance_amt  &lt;br /&gt;      FROM credit_transactions  &lt;br /&gt;      WHERE tran_date = '31-DEC-95';&lt;/span&gt;&lt;/td&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT acct_num, balance_amt  &lt;br /&gt;      FROM debit_transactions  &lt;br /&gt;      WHERE tran_date = '31-DEC-95'  &lt;br /&gt;      &lt;b&gt;UNION ALL&lt;/b&gt;  &lt;br /&gt;      SELECT acct_num, balance_amt  &lt;br /&gt;      FROM credit_transactions  &lt;br /&gt;      WHERE tran_date = '31-DEC-95';&lt;/span&gt;&lt;/td&gt;    &lt;/tr&gt;  &lt;/table&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;&lt;/ul&gt;&lt;ul&gt;  &lt;p&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;TIP 9:&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:85%;"&gt;  Consider using DECODE   to avoid having to scan the same rows repetitively or join the same table   repetitively.  Note, DECODE is not necessarily faster as it depends on your   data and the complexity of the resulting query. Also, using DECODE requires   you to change your code when new values are allowed in the field. &lt;br /&gt;    &lt;br /&gt;    &lt;/span&gt;&lt;/p&gt;  &lt;table cellspacing="5" cols="1" cellpadding="5" width="92%" border="1"&gt;    &lt;tr&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT COUNT(*)  &lt;br /&gt;      FROM emp  &lt;br /&gt;      WHERE status = 'Y'  &lt;br /&gt;      AND emp_name LIKE 'SMITH%';  &lt;br /&gt;      ----------  &lt;br /&gt;      SELECT COUNT(*)  &lt;br /&gt;      FROM emp  &lt;br /&gt;      WHERE status = 'N'  &lt;br /&gt;      AND emp_name LIKE 'SMITH%';&lt;/span&gt;&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT COUNT(&lt;b&gt;DECODE&lt;/b&gt;(status, 'Y', 'X', NULL))       Y_count,  &lt;br /&gt;                     COUNT(&lt;b&gt;DECODE&lt;/b&gt;(status, 'N', 'X', NULL)) N_count  &lt;br /&gt;      FROM emp  &lt;br /&gt;      WHERE emp_name LIKE 'SMITH%';&lt;/span&gt;&lt;/td&gt;    &lt;/tr&gt;  &lt;/table&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;  &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;TIP 10: &lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:85%;"&gt; Oracle automatically   performs simple column type conversions (or casting) when it compares columns   of different types.  Depending on the type of conversion, indexes may not be   used.  Make sure you declare your program variables as the same type as your   Oracle columns, if the type is supported in the programming language you are   using. &lt;br /&gt;    &lt;br /&gt;    &lt;/span&gt;&lt;/p&gt;  &lt;table cellspacing="5" cellpadding="5" width="92%" border="1"&gt;    &lt;tr align="middle"&gt;      &lt;td&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;Datatype &lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:85%;"&gt;  &lt;br /&gt;      &lt;b&gt;of &lt;/b&gt;  &lt;br /&gt;      &lt;b&gt;field in&lt;/b&gt;  &lt;br /&gt;      &lt;b&gt;where &lt;/b&gt;  &lt;br /&gt;      &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;clause&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;      &lt;td&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;Your Query&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;      &lt;td&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;After Implicit Conversion&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;      &lt;td&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;Index&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:85%;"&gt;  &lt;br /&gt;      &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;Used?&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;emp_no  &lt;br /&gt;      indexed  &lt;br /&gt;      numeric&lt;/span&gt;&lt;/td&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT ...  &lt;br /&gt;      FROM emp  &lt;br /&gt;      WHERE emp_no = '123';&lt;/span&gt;&lt;/td&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT ...  &lt;br /&gt;      FROM emp  &lt;br /&gt;      WHERE emp_no = &lt;b&gt;TO_NUMBER&lt;/b&gt;('123');&lt;/span&gt;&lt;/td&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;YES&lt;/span&gt;&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;emp_type  &lt;br /&gt;      indexed  &lt;br /&gt;      varchar2&lt;/span&gt;&lt;/td&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT ...  &lt;br /&gt;      FROM emp  &lt;br /&gt;      WHERE emp_type = 123;&lt;/span&gt;&lt;/td&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;SELECT ...  &lt;br /&gt;      FROM emp  &lt;br /&gt;      WHERE &lt;b&gt;TO_NUMBER&lt;/b&gt; (emp_type) = 123;&lt;/span&gt;&lt;/td&gt;      &lt;td&gt;&lt;span style="font-size:85%;"&gt;NO!  &lt;br /&gt;       &lt;/span&gt;&lt;/td&gt;    &lt;/tr&gt;  &lt;/table&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635855396776353582-7502955894662501194?l=harioracledba.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://harioracledba.blogspot.com/feeds/7502955894662501194/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635855396776353582&amp;postID=7502955894662501194' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/7502955894662501194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/7502955894662501194'/><link rel='alternate' type='text/html' href='http://harioracledba.blogspot.com/2008/06/sql-tuning-tips.html' title='SQL Tuning Tips'/><author><name>Hari</name><uri>http://www.blogger.com/profile/08163699296840233717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635855396776353582.post-2979362750201399205</id><published>2008-06-20T10:39:00.000-07:00</published><updated>2008-06-20T10:45:43.998-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Performance Tuning'/><title type='text'>Predicate Selectivity</title><content type='html'>&lt;p&gt;&lt;font size="2"&gt;Purpose&lt;br /&gt;~~~~~~~&lt;br /&gt;&lt;br /&gt;This article explains how the CBO determines the selectivity for various &lt;br /&gt;predicates.&lt;br /&gt;&lt;br /&gt;Audience&lt;br /&gt;~~~~~~~~&lt;br /&gt;This article is aimed at Application Developers, DBA's and support analysts &lt;br /&gt;interested in understanding how the CBO determines how selective a &lt;br /&gt;particular access path is.&lt;br /&gt;&lt;br /&gt;Selectivity&lt;br /&gt;~~~~~~~~~~~&lt;br /&gt;Selectivity is a measure of the proportion of a row source retrieved by &lt;br /&gt;application of a particular predicate or combination of predicates.&lt;br /&gt;&lt;br /&gt;Within the Oracle kernel it is expressed as a value between 0 and 1. &lt;br /&gt;The closer the value is to 0 the more selective the predicate is. &lt;br /&gt;Selectivity is only used by the CBO.&lt;br /&gt;&lt;br /&gt;Basic Selectivity formula:&lt;br /&gt;~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;br /&gt;&lt;br /&gt;Number of records satisfying a condition&lt;br /&gt;Selectivity = -----------------------------------------&lt;br /&gt;Total Number of records &lt;br /&gt;&lt;br /&gt;In the optimizer, selectivity is used to compare the usefulness of various &lt;br /&gt;predicates in combination with base object costs. &lt;br /&gt;&lt;br /&gt;Knowing the proportion of the total data set that a column predicate defines &lt;br /&gt;is very helpful in defining actual access costs. &lt;br /&gt;&lt;br /&gt;By default, column selectivity is based on the high and low values and the &lt;br /&gt;number of values in the column with an assumption of even distribution of &lt;br /&gt;data between these two points. &lt;br /&gt;&lt;br /&gt;Histogram data can give better selectivity estimates for unevenly distributed&lt;br /&gt;&lt;br /&gt;column data. There is more discussion regarding Histograms later.&lt;br /&gt;&lt;br /&gt;Selectivity is also used to define the cardinality of a particular row source&lt;br /&gt;once predicates have been applied. Cardinality is the expected number of rows&lt;br /&gt;&lt;br /&gt;that will be retrieved from a row source. Cardinality is useful in determining&lt;br /&gt;&lt;br /&gt;nested loop join and sort costs. Application of selectivity to the original &lt;br /&gt;cardinality of the row source will produce the expected (computed) cardinality&lt;br /&gt;&lt;br /&gt;for the row source.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Glossary of Terms:&lt;br /&gt;~~~~~~~~~~~~~~~~~~&lt;br /&gt;&lt;br /&gt;NDV Number of Distinct Values&lt;br /&gt;Cardinality Number of rows &lt;br /&gt;Selectivity Proportion of a dataset returned by a particular predicate(or&lt;br /&gt;group of predicates)&lt;br /&gt;&lt;br /&gt;In the following illustrations there are 2 tables (T1 &amp;amp; T2) with columns (c1)&lt;br /&gt;&lt;br /&gt;Selectivities:&lt;br /&gt;~~~~~~~~~~~~~~&lt;br /&gt;Without histograms &lt;br /&gt;~~~~~~~~~~~~~~~~~~&lt;br /&gt;c1 = '4076' 1/NDV &lt;br /&gt;c1 &amp;gt; '4076' 1 - (High - Value / High - Low) &lt;br /&gt;c1 &amp;gt;= '4076' 1 - (High - Value / High - Low) + 1/NDV&lt;br /&gt;c1 like '4076' 1/NDV&lt;br /&gt;&lt;br /&gt;Join selectivity&lt;br /&gt;~~~~~~~~~~~~~~~~&lt;br /&gt;&lt;br /&gt;The selectivity of a join is defined as the selectivity of the most selective&lt;br /&gt;&lt;br /&gt;join column adjusted by the proportion of not null values in each join column.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Sel = 1/max[NDV(t1.c1),NDV(t2.c2)] * &lt;br /&gt;( (Card t1 - # t1.c1 NULLs) / Card t1) * &lt;br /&gt;( (Card t2 - # t2.c2 NULLs) / Card t2)&lt;br /&gt;&lt;br /&gt;Bind Variable selectivity&lt;br /&gt;~~~~~~~~~~~~~~~~~~~~~~~~~&lt;br /&gt;&lt;br /&gt;Bind variables present a special case because the optimizer has no idea what &lt;br /&gt;the bind variable value is prior to query optimization. This does not present&lt;br /&gt;a problem with equality predicates since a uniform distribution of data is &lt;br /&gt;assumed and the selectivity is taken as 1/NDV for the column. However for&lt;br /&gt;range predicates it presents a major issue because the optimizer does not&lt;br /&gt;know where the range starts or stops. Because of this the optimizer has to &lt;br /&gt;make some assumptions as follows:&lt;br /&gt;&lt;br /&gt;c1 = :bind1 1/NDV &lt;br /&gt;c1 &amp;gt; :bind1 Default of 5%&lt;br /&gt;c1 &amp;gt;= :bind1 Default of 5%&lt;br /&gt;c1 like :bind1 Default of 25%&lt;br /&gt;&lt;br /&gt;For more information on bind variables see Note 70075.1&lt;br /&gt;&lt;br /&gt;Selectivity With Histograms&lt;br /&gt;~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;br /&gt;Histograms provide additional information about column selectivity for &lt;br /&gt;columns whose distribution is non uniform. Histograms store information about&lt;br /&gt;column data value ranges. Each range is stored in a single row and is often &lt;br /&gt;called a 'bucket'. There are 2 different methods for storing histograms in &lt;br /&gt;Oracle. If there are a small number of distinct&lt;br /&gt;column values (i.e. less than the number of buckets), the column value &lt;br /&gt;and the count of that value is stored. If not then a series of endpoints&lt;br /&gt;are stored to enable more accurate selectivity to be determined.&lt;br /&gt;&lt;br /&gt;The first method allows the accurate figures to be used. However with &lt;br /&gt;inexact histograms the terms popular and non-popular value are introduced&lt;br /&gt;and are used to help determine selectivity. A popular value is a value that&lt;br /&gt;spans multiple endpoints whereas a non-popular value does not. &lt;br /&gt;See Note 72539.1 for more information on histograms.&lt;br /&gt;Exact histograms&lt;br /&gt;~~~~~~~~~~~~~~~~&lt;br /&gt;c1 = '4706' count of value '4076' / Total Number of Rows &lt;br /&gt;c1 &amp;gt; value count of values &amp;gt; '4076' / Total Number of Rows &lt;br /&gt;&lt;br /&gt;InExact Histograms&lt;br /&gt;~~~~~~~~~~~~~~~~~~&lt;br /&gt;col = pop value # popular buckets / # buckets &lt;br /&gt;col = non pop (Density)&lt;br /&gt;col &amp;gt; value # buckets &amp;gt; value / # buckets&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Rules for combining selectivity&lt;br /&gt;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;br /&gt;&lt;br /&gt;Let P1 and P2 be 2 distinct predicates of query Q&lt;br /&gt;&lt;br /&gt;P1 AND P2&lt;br /&gt;S(P1&amp;amp;P2) = S(P1) * S(P2)&lt;br /&gt;P1 OR P2&lt;br /&gt;S(P1|P2) = S(P1) + S(P2) -[S(P1) * S(P2)]&lt;br /&gt;&lt;br /&gt;Index Selectivity for concatenated indexes&lt;br /&gt;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;br /&gt;&lt;br /&gt;Starting with 10.2, when a concatenated index, with all its columns having&lt;br /&gt;equality predicates, is used as an access path, the optimizer uses 1/NDK as&lt;br /&gt;the selectivity (where NDK is the number of distinct keys in the index).&lt;br /&gt;&lt;br /&gt;On 9.2.0.7 and 9.2.0.8 this may be enabled with event 38060 level 1.&lt;br /&gt;On 10.1.0.4 and 10.1.0.5 this may be enabled with event 38059 level 1.&lt;br /&gt;On 10.2 adjustments will be made to the selectivity to account for nulls&lt;br /&gt;in the index keys. This also occurs on 10.1.0.5 (with event 38059.)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Join cardinality&lt;br /&gt;~~~~~~~~~~~~~~~~&lt;br /&gt;&lt;br /&gt;Card(Pj) = Card(T1) * Card(T2) * Sel(Pj)&lt;br /&gt;&amp;nbsp;&lt;/font&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635855396776353582-2979362750201399205?l=harioracledba.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://harioracledba.blogspot.com/feeds/2979362750201399205/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635855396776353582&amp;postID=2979362750201399205' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/2979362750201399205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/2979362750201399205'/><link rel='alternate' type='text/html' href='http://harioracledba.blogspot.com/2008/06/predicate-selectivity.html' title='Predicate Selectivity'/><author><name>Hari</name><uri>http://www.blogger.com/profile/08163699296840233717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635855396776353582.post-2395185057525740640</id><published>2008-06-20T10:26:00.000-07:00</published><updated>2008-06-20T10:38:14.131-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Performance Tuning'/><title type='text'>Bind variables in queries</title><content type='html'>&lt;p&gt;&lt;font size="2"&gt;Purpose&lt;br /&gt;~~~~~~~&lt;br /&gt;This article is intended to provide more information on the usage of bind&lt;br /&gt;variables in queries.&lt;br /&gt;&lt;br /&gt;Scope &amp;amp; Application&lt;br /&gt;~~~~~~~~~~~~~~~~~~~&lt;br /&gt;This article is aimed at application designers/users who may not understand&lt;br /&gt;some of the implications for them and the database in the usage of bind &lt;br /&gt;variables.&lt;br /&gt;&lt;br /&gt;Bind variables&lt;br /&gt;~~~~~~~~~~~~~~&lt;br /&gt;&lt;br /&gt;Bind variables are place holders for query input values. They are a pointer to&lt;br /&gt;a memory location where data value(s) will be placed.&lt;br /&gt;&lt;br /&gt;Note that the prescence of bind variables has no effect on queries that are &lt;br /&gt;optimised using the RBO. They only affect CBO query optimization because the &lt;br /&gt;CBO attempts to use column value information to determine the optimal access &lt;br /&gt;path for the query.&lt;br /&gt;When no values are supplied, the CBO may make a sub-optimal plan choice.&lt;br /&gt;&lt;br /&gt;Advantages of bind variables:&lt;br /&gt;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;br /&gt;&lt;br /&gt;o When a bind variable as opposed to a hardcoded value is placed in a query,&lt;br /&gt;the query code does not have to change each time the query is run. This means&lt;br /&gt;that the code does not need to be reparsed and can be shared between sessions&lt;br /&gt;and you do not need to maintain a copy of the statement for each value used&lt;br /&gt;in the query. The effect of this is to reduce the amount of space used in the&lt;br /&gt;&lt;br /&gt;shared pool to store almost identical copies of sql statements.&lt;br /&gt;&lt;br /&gt;NB sharing also depends on other factors e.g.&lt;br /&gt;o identical objects and object owners must be referenced&lt;br /&gt;o bind variables must have the same datatype&lt;br /&gt;o etc.&lt;br /&gt;&lt;br /&gt;Disadvantages of bind variables:&lt;br /&gt;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;br /&gt;&lt;br /&gt;o When a SQL statement is optimized, the optimizer is unable to use the current&lt;br /&gt;&lt;br /&gt;bind value. If it did then the plan chosen for that value may be excessively &lt;br /&gt;poor for other values. Also the plan chosen would depend on which value was&lt;br /&gt;supplied first. Because of this the optimizer must either choose the average&lt;br /&gt;selectivity fo that column (the density) or use defaults. This may result in&lt;br /&gt;the generation of a sub-optimal plan.&lt;br /&gt;&lt;br /&gt;The CBO is unable to determine accurate selectivities for range predicate &lt;br /&gt;containing bind variables. The CBO uses column value data to adjust &lt;br /&gt;selectivities. If it does not have any data values to do this with &lt;br /&gt;(such as if bind variables are used) then this is not possible and assumptions&lt;br /&gt;&lt;br /&gt;have to be made.&lt;br /&gt;For queries with range predicates using bind variables, we have no way of &lt;br /&gt;calculating the selectivity, so we use a hardcoded default value of 5%&lt;br /&gt;This is true irrespective of histograms as CBO does not know the value of &lt;br /&gt;the bind variable.&lt;br /&gt;&lt;br /&gt;Selectivity for bind variables with 'like' predicates defaults to 25%&lt;br /&gt;&lt;br /&gt;Range Predicate Example:&lt;br /&gt;~~~~~~~~~~~~~~~~~~~~~~~~&lt;br /&gt;SELECT ename FROM emp WHERE empno &amp;gt; 9999;&lt;br /&gt;SELECT ename FROM emp WHERE empno &amp;gt; :bind1;&lt;br /&gt;&lt;br /&gt;Assuming the table has been analyzed, CBO knows the HIGH and LOW values for &lt;br /&gt;empno and that the values are evenly distributed between these points.&lt;br /&gt;For the first statement, CBO can determine the selectivity for the &lt;br /&gt;where clause 'where empno &amp;gt;9999' - it uses the assumption that values &lt;br /&gt;are evenly distributed to enable it to estimate the number of values between&lt;br /&gt;the supplied value and the HIGH value. &lt;br /&gt;&lt;br /&gt;For the second statement, it does not know what the value of :bind1 is, &lt;br /&gt;so it is unable to use the same assumption and uses the default selectivity &lt;br /&gt;of 5%. &lt;br /&gt;&lt;br /&gt;It is possible to test the affect of using bind variables as opposed to literals&lt;br /&gt;by setting up a variable in sqlplus. You can also assign a value to the &lt;br /&gt;variable.&lt;br /&gt;Setup details for a numeric bind variable called bindvar:&lt;br /&gt;&lt;br /&gt;variable bindvar number;&lt;br /&gt;begin&lt;br /&gt;:bindvar:=10;&lt;br /&gt;end;&lt;br /&gt;/&lt;br /&gt;SELECT * FROM emp WHERE deptno = :bindvar;&lt;br /&gt;&lt;br /&gt;Bind variable selectivities:&lt;br /&gt;~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;br /&gt;See Note 68992.1&lt;br /&gt;&lt;br /&gt;Advice&lt;br /&gt;~~~~~~&lt;br /&gt;&lt;br /&gt;o Use bind variables for queries which are executed many times &lt;br /&gt;e.g. OLTP environments&lt;br /&gt;o Use literals where queries are not repeatedly executed and where the query&lt;br /&gt;is sensitive to column sectivities.&lt;br /&gt;o If bind variables are being used then use hints to force the desired access&lt;br /&gt;path.&lt;br /&gt;o Balance the use of bind variables and shareable code with the need to &lt;br /&gt;produce accurate plans.&lt;br /&gt;&amp;nbsp;&lt;/font&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635855396776353582-2395185057525740640?l=harioracledba.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://harioracledba.blogspot.com/feeds/2395185057525740640/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635855396776353582&amp;postID=2395185057525740640' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/2395185057525740640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/2395185057525740640'/><link rel='alternate' type='text/html' href='http://harioracledba.blogspot.com/2008/06/bind-variables-in-queries.html' title='Bind variables in queries'/><author><name>Hari</name><uri>http://www.blogger.com/profile/08163699296840233717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635855396776353582.post-2239101197022771142</id><published>2008-06-15T05:06:00.000-07:00</published><updated>2008-08-31T09:08:39.958-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Critical Patch Update (CPU)'/><title type='text'>How to apply Critical Patch Update using Opatch</title><content type='html'>&lt;span style="font-family:times new roman;"&gt;1. Download interim patch to /home/patchnumber (ftp updates.oracle.com with metalink user id and password)&lt;br /&gt;&lt;br /&gt;2. Shutdown the databases and listener&lt;br /&gt;&lt;br /&gt;3. Set env variables&lt;br /&gt;&lt;br /&gt;setenv ORACLE_HOME /oracle/10.2.0&lt;br /&gt;setenv LD_LIBRARY_PATH ${ORACLE_HOME}/lib&lt;br /&gt;setenv TNS_ADMIN ${ORACLE_HOME}/network/admin&lt;br /&gt;set filec&lt;br /&gt;setenv PATH .:/usr/sbin:/usr/bin:$ORACLE_HOME/Opatch:$ORACLE_HOME/bin&lt;br /&gt;&lt;br /&gt;4. Install patch&lt;br /&gt;&lt;br /&gt;cd /home/4567866&lt;br /&gt;opatch apply&lt;br /&gt;&lt;br /&gt;5. Start the affected database and complete the post installation steps&lt;br /&gt;&lt;br /&gt;cd $ORACLE_HOME/cpu/CPUOct2005&lt;br /&gt;sqlplus "/as sysdba"&lt;br /&gt;sql&gt; startup&lt;br /&gt;sql&gt; @catcpu.sql&lt;br /&gt;SQL&gt; @?/rdbms/admin/utlrp.sql&lt;br /&gt;6. Start listener&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;&lt;strong&gt;Patch Deinstallation Instructions&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;To de-install the patch, set your current directory to the directory where the patch is located and then run opatch by entering the following command:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:times new roman;"&gt;&lt;/span&gt;&lt;span style="font-family:times new roman;"&gt;cd 4567866&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;opatch rollback -id 4567866&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;Start up all database instances running out of the ORACLE_HOME being patched.For each database instance running out of the ORACLE_HOME being patched, connect to the database using Sqlplus as sysdba and run catcpu_rollback.sql as follows -&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;&lt;br /&gt;cd $ORACLE_HOME/cpu/CPUOct2005&lt;br /&gt;sqlplus /nolog&lt;br /&gt;SQL&gt; connect / as sysdba&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:times new roman;"&gt;SQL&gt; STARTUP&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;SQL&gt; @catcpu_rollback.sql&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;SQL&gt; QUIT&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;&lt;br /&gt;Inspect the logfile and utlrplog files for any errors.&lt;br /&gt;If catcpu.sql reports any Invalid Objects, Oracle recommends that you compile the invalid objects using the following;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;&lt;br /&gt;cd $ORACLE_HOME/rdbms/admin&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;sqlplus /nolog&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;SQL&gt; connect / as sysdba&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;SQL&gt; @utlrp.sql&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;SQL&gt; QUIT&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;&lt;br /&gt;You can check for any invalid objects by executing following statement;&lt;br /&gt;select OBJECT_NAME from DBA_OBJECTS where status = 'INVALID';&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;&lt;strong&gt;Functions within Opatch&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;If you type opatch -h you will get a helplist over commands that can be used in opatch.&lt;br /&gt;Here are some of them :&lt;br /&gt;&lt;br /&gt;opatch apply -- Used to apply a patch&lt;br /&gt;&lt;br /&gt;opatch apply -force --Used to apply patch even if there is a conflict due to previous applied interim patch. This will deinstall the previous one and install this one.&lt;br /&gt;&lt;br /&gt;opatch lsinventory --Used to list the inventory for a particular $ORACLE_HOME or display all installations that can be found.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:times new roman;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;Opatch version Used to provide the version of the opatch utility.&lt;br /&gt;&lt;br /&gt;If applying -report to any command everything will be printed on screen without executing the actions&lt;br /&gt;To every command there is a number of arguments that can be used. To see the arguments issue the command -help along with the command to display the options.&lt;br /&gt;Ex. opatch apply -help&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:times new roman;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635855396776353582-2239101197022771142?l=harioracledba.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://harioracledba.blogspot.com/feeds/2239101197022771142/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635855396776353582&amp;postID=2239101197022771142' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/2239101197022771142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/2239101197022771142'/><link rel='alternate' type='text/html' href='http://harioracledba.blogspot.com/2008/06/how-to-apply-critical-patch-update.html' title='How to apply Critical Patch Update using Opatch'/><author><name>Hari</name><uri>http://www.blogger.com/profile/08163699296840233717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635855396776353582.post-1403278553580681327</id><published>2008-06-15T02:19:00.000-07:00</published><updated>2008-06-17T09:28:57.632-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Partitioning'/><title type='text'>Oracle Partitioning</title><content type='html'>&lt;b&gt;&lt;span style="font-size:85%;"&gt;RANGE PARTITION&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;CREATE TABLE SCOTT.SALESTAB&lt;br /&gt;( PROD_ID NUMBER ,&lt;br /&gt;CUST_ID NUMBER ,&lt;br /&gt;TIME_ID DATE ,&lt;br /&gt;CHANNEL_ID CHAR(1) ,&lt;br /&gt;PROMO_ID NUMBER ,&lt;br /&gt;QUANTITY_SOLD NUMBER(10,2),&lt;br /&gt;AMOUNT_SOLD NUMBER(10,2)&lt;br /&gt;)&lt;br /&gt;PARTITION BY RANGE (TIME_ID)&lt;br /&gt;(&lt;br /&gt;PARTITION SALES_1998 VALUES LESS THAN (TO_DATE('1999-01-01','YYYY-MM-DD')),&lt;br /&gt;PARTITION SALES_1999 VALUES LESS THAN (TO_DATE('2000-01-01', 'YYYY-MM-DD')), &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;PARTITION SALES_2000 VALUES LESS THAN (TO_DATE('2001-07-01','YYYY-MM-DD')),&lt;br /&gt;PARTITION SALES_DEFT VALUES LESS THAN (MAXVALUE)&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;&lt;b&gt;LIST PARTITION&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;CREATE TABLE SCOTT.SALESTAB&lt;br /&gt;( PROD_ID NUMBER ,&lt;br /&gt;CUST_ID NUMBER ,&lt;br /&gt;TIME_ID DATE ,&lt;br /&gt;CHANNEL_ID CHAR(1) ,&lt;br /&gt;PROMO_ID NUMBER ,&lt;br /&gt;QUANTITY_SOLD NUMBER(10,2),&lt;br /&gt;AMOUNT_SOLD NUMBER(10,2)&lt;br /&gt;)&lt;br /&gt;PARTITION BY LIST (PROD_ID)&lt;br /&gt;(&lt;br /&gt;PARTITION P1 VALUES (13, 14, 15, 16, 17, 18, 19, 20, 21),&lt;br /&gt;PARTITION P2 VALUES (33, 34, 35, 36, 37, 38, 39, 40, 41),&lt;br /&gt;PARTITION P3 VALUES (117,118, 119, 120, 121, 122, 123, 124),&lt;br /&gt;PARTITION P4 VALUES (134, 135, 136, 137, 138, 139, 140),&lt;br /&gt;PARTITION PD VALUES (DEFAULT)&lt;br /&gt;);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;HASH PARTITION&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;CREATE TABLE SCOTT.SALESTAB&lt;br /&gt;( PROD_ID NUMBER ,&lt;br /&gt;CUST_ID NUMBER ,&lt;br /&gt;TIME_ID DATE ,&lt;br /&gt;CHANNEL_ID CHAR(1) ,&lt;br /&gt;PROMO_ID NUMBER ,&lt;br /&gt;QUANTITY_SOLD NUMBER(10,2),&lt;br /&gt;AMOUNT_SOLD NUMBER(10,2)&lt;br /&gt;)&lt;br /&gt;PARTITION BY HASH (PROD_ID)&lt;br /&gt;(&lt;br /&gt;PARTITION P1 TABLESPACE USERS,&lt;br /&gt;PARTITION P2 TABLESPACE USERS,&lt;br /&gt;PARTITION P3 TABLESPACE USERS,&lt;br /&gt;PARTITION P4 TABLESPACE USERS&lt;br /&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;OR&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;CREATE TABLE SCOTT.SALESTAB&lt;br /&gt;( PROD_ID NUMBER ,&lt;br /&gt;CUST_ID NUMBER ,&lt;br /&gt;TIME_ID DATE ,&lt;br /&gt;CHANNEL_ID CHAR(1) ,&lt;br /&gt;PROMO_ID NUMBER ,&lt;br /&gt;QUANTITY_SOLD NUMBER(10,2),&lt;br /&gt;AMOUNT_SOLD NUMBER(10,2)&lt;br /&gt;)&lt;br /&gt;PARTITION BY HASH (PROD_ID)&lt;br /&gt;PARTITIONS 4 STORE IN (USERS, USERS, USERS, USERS);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;COMPOSITE RANGE HASH PARTITIONING&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;CREATE TABLE SCOTT.SALESTAB&lt;br /&gt;( PROD_ID NUMBER ,&lt;br /&gt;CUST_ID NUMBER ,&lt;br /&gt;TIME_ID DATE ,&lt;br /&gt;CHANNEL_ID CHAR(1) ,&lt;br /&gt;PROMO_ID NUMBER ,&lt;br /&gt;QUANTITY_SOLD NUMBER(10,2),&lt;br /&gt;AMOUNT_SOLD NUMBER(10,2)&lt;br /&gt;)&lt;br /&gt;PARTITION BY RANGE (TIME_ID)&lt;br /&gt;SUBPARTITION BY HASH (PROD_ID)&lt;br /&gt;SUBPARTITION TEMPLATE&lt;br /&gt;(&lt;br /&gt;SUBPARTITION P1 TABLESPACE USERS,&lt;br /&gt;SUBPARTITION P2 TABLESPACE USERS,&lt;br /&gt;SUBPARTITION P3 TABLESPACE USERS,&lt;br /&gt;SUBPARTITION P4 TABLESPACE USERS&lt;br /&gt;)&lt;br /&gt;(&lt;br /&gt;PARTITION SALES_1998 VALUES LESS THAN (TO_DATE('1999-01-01','YYYY-MM-DD')),&lt;br /&gt;PARTITION SALES_1999 VALUES LESS THAN (TO_DATE('2000-01-01', 'YYYY-MM-DD')),&lt;br /&gt;PARTITION SALES_2000 VALUES LESS THAN (TO_DATE('2001-07-01','YYYY-MM-DD')),&lt;br /&gt;PARTITION SALES_DEFT VALUES LESS THAN (MAXVALUE)&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;&lt;b&gt;COMPOSITE RANGE LIST PARTITIONING&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;CREATE TABLE SCOTT.SALESTAB&lt;br /&gt;( PROD_ID NUMBER ,&lt;br /&gt;CUST_ID NUMBER ,&lt;br /&gt;TIME_ID DATE ,&lt;br /&gt;CHANNEL_ID CHAR(1) ,&lt;br /&gt;PROMO_ID NUMBER ,&lt;br /&gt;QUANTITY_SOLD NUMBER(10,2),&lt;br /&gt;AMOUNT_SOLD NUMBER(10,2)&lt;br /&gt;)&lt;br /&gt;PARTITION BY RANGE (TIME_ID)&lt;br /&gt;SUBPARTITION BY LIST (PROD_ID)&lt;br /&gt;SUBPARTITION TEMPLATE&lt;br /&gt;(&lt;br /&gt;SUBPARTITION P1 VALUES (13, 14, 15, 16, 17, 18, 19, 20, 21),&lt;br /&gt;SUBPARTITION P2 VALUES (33, 34, 35, 36, 37, 38, 39, 40, 41),&lt;br /&gt;SUBPARTITION P3 VALUES (117,118, 119, 120, 121, 122, 123, 124),&lt;br /&gt;SUBPARTITION P4 VALUES (134, 135, 136, 137, 138, 139, 140),&lt;br /&gt;SUBPARTITION PD VALUES (DEFAULT)&lt;br /&gt;)&lt;br /&gt;(&lt;br /&gt;PARTITION SALES_1998 VALUES LESS THAN (TO_DATE('1999-01-01','YYYY-MM-DD')),&lt;br /&gt;PARTITION SALES_1999 VALUES LESS THAN (TO_DATE('2000-01-01', 'YYYY-MM-DD')),&lt;br /&gt;PARTITION SALES_2000 VALUES LESS THAN (TO_DATE('2001-07-01','YYYY-MM-DD')),&lt;br /&gt;PARTITION SALES_DEFT VALUES LESS THAN (MAXVALUE)&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;&lt;b&gt;INDEX ORGANIZED TABLES PARTITIONING&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;CREATE TABLE SCOTT.SALESIOT&lt;br /&gt;( PROD_ID NUMBER ,&lt;br /&gt;CUST_ID NUMBER ,&lt;br /&gt;TIME_ID DATE ,&lt;br /&gt;CHANNEL_ID CHAR(1) ,&lt;br /&gt;PROMO_ID NUMBER ,&lt;br /&gt;QUANTITY_SOLD NUMBER(10,2),&lt;br /&gt;AMOUNT_SOLD NUMBER(10,2),&lt;br /&gt;CONSTRAINT PK_CONS_SALESIOT PRIMARY&lt;br /&gt;KEY(PROD_ID,CUST_ID,CHANNEL_ID,PROMO_ID,TIME_ID)&lt;br /&gt;)&lt;br /&gt;ORGANIZATION INDEX&lt;br /&gt;PARTITION BY LIST (PROD_ID)&lt;br /&gt;(&lt;br /&gt;PARTITION P1 VALUES (13, 14, 15, 16, 17, 18, 19, 20, 21),&lt;br /&gt;PARTITION P2 VALUES (33, 34, 35, 36, 37, 38, 39, 40, 41),&lt;br /&gt;PARTITION P3 VALUES (117,118, 119, 120, 121, 122, 123, 124),&lt;br /&gt;PARTITION P4 VALUES (134, 135, 136, 137, 138, 139, 140),&lt;br /&gt;PARTITION PD VALUES (DEFAULT)&lt;br /&gt;);&lt;br /&gt;LOCAL INDEXES&lt;br /&gt;CREATE INDEX SALESIDX_LOCAL ON SALESTAB(TIME_ID)&lt;br /&gt;LOCAL&lt;br /&gt;(&lt;br /&gt;PARTITION SALES_1998_IDX,&lt;br /&gt;PARTITION SALES_1999_IDX,&lt;br /&gt;PARTITION SALES_2000_IDX,&lt;br /&gt;PARTITION SALES_DEFT_IDX&lt;br /&gt;);&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;GLOBAL PARTITIONED INDEXES&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;CREATE INDEX SALESIDX_GLOBAL ON SALESTAB(TIME_ID)&lt;br /&gt;GLOBAL PARTITION BY RANGE(TIME_ID)&lt;br /&gt;(&lt;br /&gt;PARTITION SALES_LT_2000 VALUES LESS THAN (TO_DATE('2001-07-01','YYYY-MM-DD')),&lt;br /&gt;PARTITION SALES_DEFAULT VALUES LESS THAN (MAXVALUE)&lt;br /&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;GLOBAL NON-PARTITIONED INDEXES&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;CREATE INDEX SALESIDX_GLOBAL_NP ON SALESTAB(TIME_ID);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;CREATE INDEX SALESIDX_PROMO ON SALESTAB(PROMO_ID);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;INSERT INTO SALESTAB SELECT * FROM SALES;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;COMMIT;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT','SALESTAB');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;SELECT TABLE_NAME,PARTITION_NAME,NUM_ROWS FROM&lt;br /&gt;USER_IND_PARTITIONS WHERE TABLE_NAME='SALESTAB';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;SELECT TABLE_NAME,PARTITION_NAME,SUBPARTITION_NAME,NUM_ROWS&lt;br /&gt;FROM USER_TAB_SUBPARTITIONS WHERE TABLE_NAME='SALESIOT';&lt;br /&gt;&lt;br /&gt;SELECT INDEX_NAME,PARTITION_NAME,NUM_ROWS,STATUS FROM USER_IND_PARTITIONS WHERE&lt;br /&gt;INDEX_NAME='SALESIDX_LOCAL';&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CREATE TABLE SCOTT.SALESTAB&lt;br /&gt;( PROD_ID NUMBER ,&lt;br /&gt;CUST_ID NUMBER ,&lt;br /&gt;TIME_ID DATE ,&lt;br /&gt;CHANNEL_ID CHAR(1) ,&lt;br /&gt;PROMO_ID NUMBER ,&lt;br /&gt;QUANTITY_SOLD NUMBER(10,2),&lt;br /&gt;AMOUNT_SOLD NUMBER(10,2)&lt;br /&gt;)&lt;br /&gt;PARTITION BY RANGE (TIME_ID)&lt;br /&gt;(&lt;br /&gt;PARTITION SALES_1998 VALUES LESS THAN (TO_DATE('1999-01-01','YYYY-MM-DD')),&lt;br /&gt;PARTITION SALES_1999 VALUES LESS THAN (TO_DATE('2000-01-01', 'YYYY-MM-DD')),&lt;br /&gt;PARTITION SALES_2000 VALUES LESS THAN (TO_DATE('2001-07-01','YYYY-MM-DD')),&lt;br /&gt;PARTITION SALES_DEFT VALUES LESS THAN (MAXVALUE)&lt;br /&gt;);&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;SELECT INDEX_NAME,INDEX_TYPE,STATUS FROM USER_INDEXES WHERE&lt;br /&gt;STATUS='UNUSABLE';&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;SQL&amp;gt; ALTER TABLE SALESTAB TRUNCATE PARTITION SALES_1998;&lt;br /&gt;Table truncated.&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;SQL&amp;gt; ALTER TABLE SALESTAB DROP PARTITION SALES_1999;&lt;br /&gt;Table altered.&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;SQL&amp;gt; SELECT INDEX_NAME,INDEX_TYPE,STATUS FROM USER_INDEXES&lt;br /&gt;WHERE STATUS&amp;lt;&amp;gt;'VALID';&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;INDEX_NAME INDEX_TYPE STATUS&lt;br /&gt;------------------------------ --------------------------- --------&lt;br /&gt;SALESIDX_PROMO NORMAL UNUSABLE&lt;br /&gt;PK_CONS_SALESTAB NORMAL UNUSABLE&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;SQL&amp;gt; ALTER INDEX SALESIDX_PROMO REBUILD;&lt;br /&gt;Index altered.&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;SQL&amp;gt; ALTER INDEX PK_CONS_SALESTAB REBUILD;&lt;br /&gt;Index altered.&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;SQL&amp;gt; SELECT INDEX_NAME,PARTITION_NAME,NUM_ROWS,STATUS FROM&lt;br /&gt;USER_IND_PARTITIONS WHERE INDEX_NAME='SALESIDX_LOCAL';&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;INDEX_NAME PARTITION_NAME NUM_ROWS STATUS&lt;br /&gt;------------------------------ ------------------------------ ----------&lt;br /&gt;--------&lt;br /&gt;SALESIDX_LOCAL SALES_1998_IDX 178834 USABLE&lt;br /&gt;SALESIDX_LOCAL SALES_1999_IDX 247945 USABLE&lt;br /&gt;SALESIDX_LOCAL SALES_2000_IDX 356546 USABLE&lt;br /&gt;SALESIDX_LOCAL SALES_DEFT_IDX 135518 USABLE&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;SQL&amp;gt; ALTER TABLE SALESTAB TRUNCATE PARTITION SALES_2000 UPDATE&lt;br /&gt;GLOBAL INDEXES;&lt;br /&gt;Table truncated.&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;SQL&amp;gt; ALTER TABLE SALESTAB DROP PARTITION SALES_2000 UPDATE&lt;br /&gt;GLOBAL INDEXES;&lt;br /&gt;Table altered.&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;SQL&amp;gt; SELECT INDEX_NAME,INDEX_TYPE,STATUS FROM USER_INDEXES&lt;br /&gt;WHERE STATUS='UNUSABLE';&lt;br /&gt;no rows selected&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;ADD PARTITION&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;SQL&amp;gt; ALTER TABLE SCOTT.SALESTAB ADD PARTITION SALES_DEFT&lt;br /&gt;VALUES LESS THAN (MAXVALUE);&lt;br /&gt;Table altered.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;EXCHANGE&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;SQL&amp;gt; CREATE TABLE SALESTAB_SALES_1998 AS SELECT * FROM&lt;br /&gt;SALESTAB WHERE 1=2;&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; ALTER TABLE SALESTAB EXCHANGE PARTITION SALES_1998 WITH TABLE&lt;br /&gt;SALESTAB_SALES_1998;&lt;br /&gt;Table altered.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;MERGE&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;ALTER TABLE SALESTAB MERGE PARTITIONS SALES_1998, SALES_1999&lt;br /&gt;INTO PARTITION SALES_1999;&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; alter index SALESIDX_PROMO rebuild;&lt;br /&gt;Index altered.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; ALTER INDEX SALESIDX_LOCAL REBUILD PARTITION SALES_1999_IDX;&lt;br /&gt;Index altered.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;SPLIT&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;SQL&amp;gt; ALTER TABLE SALESTAB SPLIT PARTITION SALES_1999 AT (TO_DATE('1999-01-01','YYYY-MM-DD'))&lt;br /&gt;INTO (PARTITION SALES_1998 ,PARTITION SALES_1999);&lt;br /&gt;Table altered.&lt;br /&gt;&lt;br /&gt;ALTER TABLE SALESTAB SPLIT PARTITION SALES_DEFT AT (TO_DATE('2001-01-01','YYYY-MM-DD'))&lt;br /&gt;INTO (PARTITION SALES_2001 ,PARTITION SALES_DEFT);&lt;br /&gt;&lt;br /&gt;&lt;b&gt;MOVE&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;SQL&amp;gt; ALTER TABLE SALESTAB MOVE PARTITION SALES_1998 TABLESPACE&lt;br /&gt;TESTDATA3;&lt;br /&gt;Table altered.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; alter index SALESIDX_LOCAL rebuild partition SALES_1998;&lt;br /&gt;Index altered.&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;SQL&amp;gt; alter index SALESIDX_PROMO rebuild;&lt;br /&gt;Index altered.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;REDEFINE PARTITION ONLINE&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;BEGIN&lt;br /&gt;DBMS_REDEFINITION.START_REDEF_TABLE (&lt;br /&gt;UNAME =&amp;gt; 'SCOTT',&lt;br /&gt;ORIG_TABLE =&amp;gt; 'SALESTAB',&lt;br /&gt;INT_TABLE =&amp;gt; 'SALESTAB_NEW',&lt;br /&gt;PART_NAME =&amp;gt; 'SALES_2000'&lt;br /&gt;);&lt;br /&gt;END;&lt;br /&gt;/&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;BEGIN&lt;br /&gt;DBMS_REDEFINITION.SYNC_INTERIM_TABLE (&lt;br /&gt;UNAME =&amp;gt; 'SCOTT',&lt;br /&gt;ORIG_TABLE =&amp;gt; 'SALESTAB',&lt;br /&gt;INT_TABLE =&amp;gt; 'SALESTAB_NEW',&lt;br /&gt;PART_NAME =&amp;gt; 'SALES_2000'&lt;br /&gt;);&lt;br /&gt;END;&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;BEGIN&lt;br /&gt;DBMS_REDEFINITION.FINISH_REDEF_TABLE (&lt;br /&gt;UNAME =&amp;gt; 'SCOTT',&lt;br /&gt;ORIG_TABLE =&amp;gt; 'SALESTAB',&lt;br /&gt;INT_TABLE =&amp;gt; 'SALESTAB_NEW',&lt;br /&gt;PART_NAME =&amp;gt; 'SALES_2000'&lt;br /&gt;);&lt;br /&gt;END;&lt;br /&gt;/&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635855396776353582-1403278553580681327?l=harioracledba.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://harioracledba.blogspot.com/feeds/1403278553580681327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635855396776353582&amp;postID=1403278553580681327' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/1403278553580681327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/1403278553580681327'/><link rel='alternate' type='text/html' href='http://harioracledba.blogspot.com/2008/06/oracle-partitioning.html' title='Oracle Partitioning'/><author><name>Hari</name><uri>http://www.blogger.com/profile/08163699296840233717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635855396776353582.post-4195013876509154413</id><published>2008-06-03T07:26:00.000-07:00</published><updated>2008-06-17T09:30:07.048-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Database Security'/><title type='text'>Transparent Data Encryption</title><content type='html'>&lt;p&gt;Encrypt the sensitive data in the database using transparent data encrption , when an insert happens on column which is protected, the database transparently encrypts it and stores it in the column and similarly the database decrypts when selected &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Specify Wallet location in sqlnet.ora&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;ENCRYPTION_WALLET_LOCATION =&lt;/p&gt;&lt;p&gt;(SOURCE= &lt;/p&gt;&lt;p&gt;(METHOD=file)&lt;/p&gt;&lt;p&gt;(METHOD_DATA= &lt;/p&gt;&lt;p&gt;(DIRECTORY=G:\oracle11g\wallet))) &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Create the wallet and set the password to access it.&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;alter system set encryption key authenticated by "wallet"; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Open the wallet must be opened explicitly for operation, Whenever database is opened the wallet also need to be opened using the same password&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;alter system set encryption wallet open authenticated by "wallet"; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Close the wallet using&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;alter system set encryption wallet close; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Use the below commands to encrypt sal column on emp table&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;alter table emp modify(sal encrypt); &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;For indexing a column which has been encrypted, we need to remove salt from the column.&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;SQL&gt; create index idx_emp on emp(sal);&lt;/p&gt;&lt;p&gt;create index idx_emp on emp(sal)&lt;/p&gt;&lt;p&gt;*ERROR at line 1:ORA-28338: cannot encrypt indexed column(s) with salt&lt;br /&gt;&lt;/p&gt;&lt;p&gt;SQL&gt; alter table emp modify sal encrypt no salt;&lt;br /&gt;Table altered.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;SQL&gt; create index idx_emp on emp(sal);&lt;br /&gt;Index created. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;To decrypt the column Use&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;SQL&gt; alter table emp modify(sal decrypt);&lt;br /&gt;Table altered.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Exporting Encrypted data&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;To export data from emp with encrypted sal column, the data in the resulting dump file will be in clear text even the encrypted column data with exception in the logfile&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&gt;expdp scott/tiger dumpfile=scott.dmp logfile=scott.log directory=dumpdir&lt;br /&gt;Export: Release 11.1.0.6.0 - Production on Tuesday, 03 June, 2008 21:55:27&lt;br /&gt;Copyright (c) 2003, 2007, Oracle. All rights reserved.&lt;br /&gt;Connected to: Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsStarting "SCOTT"."SYS_EXPORT_SCHEMA_01": scott/******** dumpfile=scott.dmp logfile=scott.log directory=dumpdirEstimate in progress using BLOCKS method...Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATATotal estimation using BLOCKS method: 192 KBProcessing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMAProcessing object type SCHEMA_EXPORT/TABLE/TABLEProcessing object type SCHEMA_EXPORT/TABLE/INDEX/INDEXProcessing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINTProcessing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICSProcessing object type SCHEMA_EXPORT/TABLE/COMMENTProcessing object type SCHEMA_EXPORT/VIEW/VIEWProcessing object type SCHEMA_EXPORT/VIEW/GRANT/OWNER_GRANT/OBJECT_GRANTProcessing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINTProcessing object type SCHEMA_EXPORT/TABLE/TRIGGERProcessing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICSProcessing object type SCHEMA_EXPORT/POST_SCHEMA/PROCACT_SCHEMA. . exported "SCOTT"."DEPT" 5.937 KB 4 rows. . exported "SCOTT"."EMP" 8.609 KB 15 rows. . exported "SCOTT"."SALGRADE" 5.867 KB 5 rows. . exported "SCOTT"."BONUS" 0 KB 0 rowsORA-39173: Encrypted data has been stored unencrypted in dump file set.Master table "SCOTT"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded******************************************************************************Dump file set for SCOTT.SYS_EXPORT_SCHEMA_01 is: G:\ORACLE11G\BACKUP\SCOTT.DMPJob "SCOTT"."SYS_EXPORT_SCHEMA_01" completed with 1 error(s) at 21:56:53&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Use ENCRPTION_PASSWORD parameter in expdp to export with the data encryption and while import the same password needs to be provided&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&gt;expdp scott/tiger dumpfile=scott.dmp logfile=scott.log directory=dumpdir encryption_password=mywallet&lt;br /&gt;Export: Release 11.1.0.6.0 - Production on Tuesday, 03 June, 2008 22:10:57&lt;br /&gt;Copyright (c) 2003, 2007, Oracle. All rights reserved.&lt;br /&gt;Connected to: Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsStarting "SCOTT"."SYS_EXPORT_SCHEMA_01": scott/******** dumpfile=scott.dmp logfile=scott.log directory=dumpdir encryption_password=********Estimate in progress using BLOCKS method...Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATATotal estimation using BLOCKS method: 192 KBProcessing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMAProcessing object type SCHEMA_EXPORT/TABLE/TABLEProcessing object type SCHEMA_EXPORT/TABLE/INDEX/INDEXProcessing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINTProcessing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICSProcessing object type SCHEMA_EXPORT/TABLE/COMMENTProcessing object type SCHEMA_EXPORT/VIEW/VIEWProcessing object type SCHEMA_EXPORT/VIEW/GRANT/OWNER_GRANT/OBJECT_GRANTProcessing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINTProcessing object type SCHEMA_EXPORT/TABLE/TRIGGERProcessing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICSProcessing object type SCHEMA_EXPORT/POST_SCHEMA/PROCACT_SCHEMA. . exported "SCOTT"."DEPT" 5.945 KB 4 rows. . exported "SCOTT"."EMP" 8.617 KB 15 rows. . exported "SCOTT"."SALGRADE" 5.875 KB 5 rows. . exported "SCOTT"."BONUS" 0 KB 0 rowsMaster table "SCOTT"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded******************************************************************************Dump file set for SCOTT.SYS_EXPORT_SCHEMA_01 is: G:\ORACLE11G\BACKUP\SCOTT.DMPJob "SCOTT"."SYS_EXPORT_SCHEMA_01" successfully completed at 22:12:09&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635855396776353582-4195013876509154413?l=harioracledba.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://harioracledba.blogspot.com/feeds/4195013876509154413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635855396776353582&amp;postID=4195013876509154413' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/4195013876509154413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635855396776353582/posts/default/4195013876509154413'/><link rel='alternate' type='text/html' href='http://harioracledba.blogspot.com/2008/06/transparent-data-encryption.html' title='Transparent Data Encryption'/><author><name>Hari</name><uri>http://www.blogger.com/profile/08163699296840233717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
