Upload
agnes-wood
View
217
Download
0
Embed Size (px)
Citation preview
1
Forgotten Features
Julian Dyke
Independent Consultant
Web Version
juliandyke.com
© 2005 Julian Dyke
2
© 2005 Julian Dykejuliandyke.com
Agenda
Introduction Forgotten Features
Tracing and Auditing Testing and Benchmarking Administration Execution Plans Tables Indexes SQL PL/SQL
Conclusion
3
© 2005 Julian Dykejuliandyke.com
Criteria for an Oracle feature Easy to understand
Easy to implement
Works in first release
Documented in first release
Compatible with other features
Improves Productivity or Manageability Saves resources / money
Intellectually stimulating
4
© 2005 Julian Dykejuliandyke.com
Tracing and
Auditing
5
© 2005 Julian Dykejuliandyke.com
TRACEFILE_IDENTIFIER Initialisation Parameter Introduced in Oracle 8.1.7
tracefile_identifier = '<identifier>'
e.g. in Oracle 9.2 if a trace file is called
ss92001_ora_1760.trc
ss92001_ora_1760_test.trc
then the statement
will change the file name to
ALTER SESSION SET tracefile_identifier = 'test';
6
© 2005 Julian Dykejuliandyke.com
DBMS_SYSTEM.KSDWRT DBMS_SYSTEM
undocumented package installed in all databases owned by SYS
To write messages to trace files and/or alert log use
DBMS_SYSTEM.KSDWRT(
DEST NUMBER, -- 1 = Trace File, 2 = Alert Log, 3 = BothTST VARCHAR2 -- Message
);
For example
BEGINDBMS_SYSTEM.KSDWRT (1, ‘Output to trace file’);DBMS_SYSTEM.KSDWRT (2, ‘Output to alert log’);DBMS_SYSTEM.KSDWRT (3, ’Output to both’);
END;/
7
© 2005 Julian Dykejuliandyke.com
BITAND Initially undocumented built-in function Performs a bit-wise AND between two operators
SELECT BITAND (42,1) FROM dual;
Can be used as basis for OR and XOR functions
CREATE OR REPLACE FUNCTION bitor (x NUMBER, y NUMBER)RETURN NUMBER ISBEGIN
RETURN x + y - BITAND (x,y);END;/
CREATE OR REPLACE FUNCTION bitxor (x NUMBER, y NUMBER) RETURN NUMBER ISBEGIN
RETURN BITOR (x,y) - BITAND (x,y);END;/
Beware of overflows
8
© 2005 Julian Dykejuliandyke.com
Hexadecimal Format Masks Introduced in Oracle 8.1.5 Convert decimal numbers to and from hexadecimal To convert from decimal to hex
SELECT TO_CHAR (1048576,’XXXXXXXX’) FROM dual;
returns 100000
To convert from hex to decimal
SELECT TO_NUMBER (100000,‘XXXXXXXX’) FROM dual;
returns 1048576
9
© 2005 Julian Dykejuliandyke.com
System Triggers Introduced in Oracle 8.1.5 Must be created by SYS (as SYSDBA)
CREATE OR REPLACE TRIGGER us01_logonAFTER LOGON ON us01.SCHEMABEGIN
dbms_session.set_sql_trace (TRUE);END;
CREATE OR REPLACE TRIGGER us01_logoffBEFORE LOGOFF ON us01.SCHEMABEGIN
dbms_session.set_sql_trace (FALSE);END;
ALTER TRIGGER us01_login ENABLE;
ALTER TRIGGER us01_login DISABLE;
10
© 2005 Julian Dykejuliandyke.com
DBMS_MONITOR Introduced in Oracle 10.1 To enable trace in another session use
DBMS_MONITOR.SESSION_TRACE_ENABLE( SESSION_ID NUMBER, -- SID
SERIAL_NUM NUMBER, -- Serial Number WAITS BOOLEAN, -- Include Waits BINDS BOOLEAN -- Include Binds
);
To disable trace in another session use
DBMS_MONITOR.SESSION_TRACE_DISABLE( SESSION_ID NUMBER, -- SID
SERIAL_NUM NUMBER -- Serial Number );
Waits (event 10046 level 8) are enabled by default Binds (event 10046 level 4) are disabled by default
11
© 2005 Julian Dykejuliandyke.com
DBMS_MONITOR Can be enabled at database level in Oracle 10.2 To enable trace for all database sessions use
DBMS_MONITOR.DATABASE_TRACE_ENABLE( WAITS BOOLEAN, -- Include Waits
BINDS BOOLEAN -- Include BindsINSTANCE_NAME VARCHAR2 -- Instance Name
);
To disable trace for all database sessions use
DBMS_MONITOR.DATABASE_TRACE_DISABLE( INSTANCE_NAME VARCHAR2 -- Instance Name );
12
© 2005 Julian Dykejuliandyke.com
Autonomous Transactions Introduced in Oracle 8.1.5 Recursive transaction started by main transaction Can commit or rollback independently of main transaction Committed data unaffected if main transaction rolls back Often used for auditing
CREATE OR REPLACE TRIGGER trigger1BEFORE INSERT ON table1 FOR EACH ROWDECLARE
PRAGMA AUTONOMOUS_TRANSACTION;BEGIN
INSERT INTO log1 VALUES (:new.col1,:new.col2,SYSDATE);COMMIT;
END;/
13
© 2005 Julian Dykejuliandyke.com
SYS Auditing In Oracle 9.2 and above, operations performed by the SYS
user can be audited.
To enable SYS auditing set AUDIT_SYS_OPERATIONS parameter to TRUE
Auditing information will be written to text file in directory specified by AUDIT_DUMP_DEST parameter
Default directory is $ORACLE_HOME/rdbms/audit
Filename is ora_<pid>.aud where pid is the operating system process ID
14
© 2005 Julian Dykejuliandyke.com
Testing and
Benchmarking
15
© 2005 Julian Dykejuliandyke.com
Fixed Date Initialization Parameter Useful for deterministic testing In Oracle 8.0 and above can be set dynamically using
ALTER SYSTEM To set date only use
FIXED_DATE = ‘DD-MON-YY’
Sets time to 00:00:00
To set date and time use
FIXED_DATE = YYYY-MM-DD-HH24:MI:SS
16
© 2005 Julian Dykejuliandyke.com
Random Functions To guarantee consistent tests, random functions should
return deterministic results
DBMS_RANDOM package Seed can be specified using DBMS_RANDOM.SEED
procedure
SAMPLE clause Can be made deterministic by enabling event 10193 Level specifies seed
ALTER SESSION SET EVENTS ‘10193 trace name context forever, level 42’;
17
© 2005 Julian Dykejuliandyke.com
Checkpoints and Logfiles To force a checkpoint
ALTER SYSTEM CHECKPOINT;
To force a log file switch
To force a log file switch and archive the log file
ALTER SYSTEM SWITCH LOGFILE;
Useful when dumping log files
ALTER SYSTEM ARCHIVE LOG CURRENT;
Useful for testing archive log creation with Physical standby database Logical standby database
18
© 2005 Julian Dykejuliandyke.com
Flushing the Shared Pool Introduced in Oracle 8.0 Flushes all unpinned objects from library cache
ALTER SYSTEM FLUSH SHARED_POOL;
Useful for deterministic testing but… After issuing this statement
All unpinned cursors need reparsing All unpinned packages need recompilation
19
© 2005 Julian Dykejuliandyke.com
Flushing the Buffer Cache Introduced in Oracle 10.1 Flushes all unpinned buffers from the buffer cache
ALTER SYSTEM FLUSH BUFFER_CACHE;
In Oracle 9.0.1 and above the following command has the same effect
ALTER SESSION SET EVENTS ‘IMMEDIATE TRACE NAME FLUSH_CACHE’;
Useful for deterministic testing but… After issuing this statement
Warm up the cache before testing workloads
20
© 2005 Julian Dykejuliandyke.com
PerformanceTuning
21
© 2005 Julian Dykejuliandyke.com
V$SQL_PLAN Introduced in Oracle 9.0.1
Shows actual execution plan in memory
Enhanced in Oracle 9.2 to include Access Predicates (Joins) Filter Predicates
Related views include V$SQL_PLAN_WORKAREA V$SQL_PLAN_STATISTICS V$SQL_PLAN_STATISTICS_ALL
22
© 2005 Julian Dykejuliandyke.com
V$SQL_PLAN
ADDRESS RAW(4)HASH_VALUE NUMBERCHILD_NUMBER NUMBEROPERATION VARCHAR2(30)OPTIONS VARCHAR2(30)OBJECT_NODE VARCHAR2(10)OBJECT# NUMBEROBJECT_OWNER VARCHAR2(30)OBJECT_NAME VARCHAR2(64)OPTIMIZER VARCHAR2(20)ID NUMBERPARENT_ID NUMBERDEPTH NUMBERPOSITION NUMBERCOST NUMBERCARDINALITY NUMBER
BYTES NUMBEROTHER_TAG VARCHAR(35)PARTITION_START VARCHAR2(5)PARTITION_STOP VARCHAR2(5)PARTITION_ID NUMBEROTHER VARCHAR2(4000)DISTRIBUTION VARCHAR2(20)CPU_COST NUMBERIO_COST NUMBERTEMP_SPACE NUMBERACCESS_PREDICATES VARCHAR2(4000)FILTER_PREDICATES VARCHAR2(4000)PROJECTION VARCHAR2(4000)TIME NUMBERQBLOCK_NAME VARCHAR2(31)REMARKS VARCHAR2(4000)
23
© 2005 Julian Dykejuliandyke.com
Optimizer Environment Variables In Oracle 10.1 and above, optimizer environment variables are
externalized at :
instance level - V$SYS_OPTIMIZER_ENV session level - V$SES_OPTIMIZER_ENV statement level - V$SQL_OPTIMIZER_ENV
Use the values in these views when determining why execution plans differ
24
© 2005 Julian Dykejuliandyke.com
Optimizer Environment Variables Optimizer Environment Variable values reported by the
dynamic performance views include:
active_instance_count parallel_dml_mode
bitmap_merge_area_size parallel_execution_enabled
cpu_count parallel_query_mode
cursor_sharing parallel_threads_per_cpu
db_file_multiblock_read_count pga_aggregate_target
hash_area_size query_rewrite_enabled
optimizer_dynamic_sampling query_rewrite_integrity
optimizer_features_enable skip_unusable_indexes
optimizer_index_caching sort_area_retained_size
optimizer_index_cost_adj sort_area_size
optimizer_mode star_transformation_enabled
optimizer_mode_hinted statistics_level
parallel_ddl_mode workarea_size_policy
25
© 2005 Julian Dykejuliandyke.com
DBMS_XPLAN Introduced in Oracle 9.2 Formats PLAN_TABLE contents generated by EXPLAIN PLAN
SELECT * FROM TABLE (dbms_xplan.display);
DISPLAY function parameters include TABLE_NAME – name of plan table STATEMENT_ID – statement ID in plan table FORMAT – as below
Value Description
BASIC Operation ID, object name and operation/option only
TYPICAL (Default) Most relevant information including partition pruning, parallelism and predicates where appropriate
ALL As TYPICAL plus parallel execution server statements
SERIAL As TYPICAL without parallel execution server statements
26
© 2005 Julian Dykejuliandyke.com
DBMS_XPLAN For example explain a query
EXPLAIN PLAN FOR SET STATEMENT_ID = 'STATEMENT1' FORSELECT t1.c2, t2.c2FROM t1, t2WHERE t1.c1 = t2.c1AND t1.c2 = 10;
SELECT * FROM TABLE (
dbms_xplan.display ('PLAN_TABLE','STATEMENT1'));
The plan table can be queried using
27
© 2005 Julian Dykejuliandyke.com
DBMS_XPLAN Example output with predicates
Id Operation Name Rows Bytes Cost
0 SELECT STATEMENT 10 590 66
* 1 HASH JOIN 10 590 66
* 2 TABLE ACCESS FULL T1 10 60 58
3 TABLE ACCESS FULL T2 1000 53000 7
Predicate Information (identified by operation id):
1 - access("T1"."C1"="T2"."C1")2 - filter("T1"."C2"=10)
28
© 2005 Julian Dykejuliandyke.com
DBMS_XPLAN Parallel execution queries are automatically formatted e.g.
EXPLAIN PLAN FOR SELECT /*+ ORDERED PARALLEL (t1 2) USE_MERGE (t1 t2) */
t1.c2, t2.c2FROM t1, t2WHERE t1.c1 = t2.c1AND t1.c2 = 10;
SELECT * FROM TABLE (dbms_xplan.display);
The plan table can be queried using
29
© 2005 Julian Dykejuliandyke.com
DBMS_XPLAN Example output for parallel execution
Id Operation Name Rows Bytes Cost TQ IN-OUT PQ Distrib
0 SELECT STATEMENT 10 590 79
1 MERGE JOIN 10 590 79 78,02 P->S QC(RANDOM)
2 SORT JOIN 10 60 33 78,02 PCWP
* 3 TABLE ACCESS FULL T1 10 60 29 78,01 P->P HASH
* 4 SORT JOIN 1000 53000 47 78,02 PCWP
5 TABLE ACCESS FULL T2 1000 53000 7 78,00 S->P HASH
Predicate Information (identified by operation id):
3 - filter("T1"."C2"=10)4 - access("T1"."C1"="T2"."C1") filter("T1"."C1"="T2"."C1")
30
© 2005 Julian Dykejuliandyke.com
DBMS_XPLAN Partition pruning information can also be included e.g. for a
range partitioned table
EXPLAIN PLAN FOR SELECT c2 FROM t1 WHERE c1 >= 150 AND c1 < 250;
CREATE TABLE t1 (c1 NUMBER,c2 NUMBER,c3 CHAR(50))PARTITION BY RANGE (c1)(
PARTITION p1 VALUES LESS THAN (100),PARTITION p2 VALUES LESS THAN (200),PARTITION p3 VALUES LESS THAN (300),PARTITION p4 VALUES LESS THAN (400)
);
SELECT * FROM TABLE (dbms_xplan.display);
31
© 2005 Julian Dykejuliandyke.com
DBMS_XPLAN Example output for partition pruning
Id Operation Name Rows Bytes Cost PStart PStop
0 SELECT STATEMENT 1 26 2
1 PARTITION RANGE ITERATOR 2 3
* 2 TABLE ACCESS FULL T1 1 26 2 2 3
Predicate Information (identified by operation id):
2 - filter("T1"."C1">=150 AND "T1"."C1"<250)
32
© 2005 Julian Dykejuliandyke.com
DBMS_XPLAN In Oracle 10.1 and above
New DISPLAY_CURSOR function By default displays plan for last statement executed in
session
SQL> SELECT COUNT(*) FROM t1;
SQL > SELECT * FROM TABLE (dbms_xplan.display_cursor);
Id Operation Name Rows Cost (%CPU) Time
0 SELECT STATEMENT 160 (100)
1 SORT AGGREGATE 1
2 TABLE ACCESS FULL T1 51809 160 (2) 00:00:02
33
© 2005 Julian Dykejuliandyke.com
V$SESSION_WAIT_HISTORY Introduced in Oracle 10.1
SID NUMBERSEQ# NUMBEREVENT NUMBEREVENT VARCHAR2(64)P1TEXT VARCHAR2(64)P1 NUMBERP2TEXT VARCHAR2(64)P2 NUMBERP3TEXT VARCHAR2(64)P3 NUMBERWAIT_TIME NUMBERWAIT_COUNT NUMBER
Externalises last 10 wait events for each session Similar information to V$SESSION_WAIT – but much more
user friendly
34
© 2005 Julian Dykejuliandyke.com
Administration
35
© 2005 Julian Dykejuliandyke.com
Kill Session For example to kill a session for user US01
Identify the SID and serial number
SELECT sid, serial# FROM v$sessionWHERE username = ‘US01’;
Kill the session using
ALTER SYSTEM KILL SESSION ‘<sid>,<serial#>’;
For example
ALTER SYSTEM KILL SESSION ‘133,523’;
Next command issued by killed session will return error
ORA-00028: your session has been killed
36
© 2005 Julian Dykejuliandyke.com
Renaming Database Objects To rename a table:
RENAME oldname TO newname;
In Oracle 9.2 and above to rename a column
ALTER TABLE t1 RENAME COLUMN oldname TO newname;
ALTER TABLE t1 RENAME CONSTRAINT oldname TO newname;
In Oracle 10.1 and above to rename a tablespaceALTER TABLESPACE oldname RENAME TO newname;
In Oracle 9.2 and above to rename a constraint
To rename an index
ALTER INDEX oldname RENAME TO newname;
37
© 2005 Julian Dykejuliandyke.com
Dropping Columns Introduced in 8.1.5
Columns can be dropped from a table using the ALTER TABLE statement
Columns can be marked unused immediately and deleted at a later time deleted immediately
If the delete operation fails at any point it can be restarted from the point of failure
38
© 2005 Julian Dykejuliandyke.com
Dropping Columns To drop a column immediately use
ALTER TABLE table1 DROP COLUMN column2;
Columns can also be marked unused immediately and subsequently dropped
To mark a column unused use
ALTER TABLE table1 SET UNUSED COLUMN column2;
ALTER TABLE table1 DROP UNUSED COLUMNS;
To drop all unused columns from a table use
39
© 2005 Julian Dykejuliandyke.com
Dropping Columns If instance is shutdown while column is being dropped, drop
column statement can be continued when instance restarted
ALTER TABLE table1 DROP COLUMNS CONTINUE;
DBA_PARTIAL_DROP_TABS describes partially dropped columns
DBA_UNUSED_COL_TABS describes columns marked unused, but not yet dropped
40
© 2005 Julian Dykejuliandyke.com
Default Tablespaces In Oracle 9.0.1 and above a default temporary tablespace can
be defined
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE <tablespace>;
In Oracle 10.1 and above a default permanent tablespace can be defined
ALTER DATABASE DEFAULT TABLESPACE <tablespace>;
41
© 2005 Julian Dykejuliandyke.com
Resumable Statements Oracle 9.0.1 and above long running operations encountering
out of space errors can be resumed
Resumable operations include Queries DML Statements SQL*Loader operations Import operations DDL statements
Out of space errors include Tablespace full Maximum number of extents reached for object Tablespace quota exceeded for a user
42
© 2005 Julian Dykejuliandyke.com
Resumable Statements When resumable space allocation is enabled
Operation suspends if an out of space error occurs Details of the error are written to DBA_RESUMABLE DBA can optionally be alerted DBA can either
fix the error abort the operation
Operation automatically resumes execution when error is fixed
If a further error is detected, operation will suspend again
43
© 2005 Julian Dykejuliandyke.com
Resumable Statements1 – Resumable space allocation is enabled
ALTER SESSION ENABLE RESUMABLENAME ‘Batch Update’ TIMEOUT 3600;
2 – Resumable operation starts
INSERT INTO t2SELECT * FROM t1;
3 – Out of space error occurs
ORA-01653: unable to extend table US01.T2 by 210 in tablespace ‘TS99’
4 – Error is written to alert log
44
© 2005 Julian Dykejuliandyke.com
Resumable Statements5 – (Optional) DBA is notified by message generated by AFTER SUSPEND trigger
6 – DBA queries DBA_RESUMABLE view for details of suspended operation
7 – DBA fixes error condition e.g.
ALTER TABLESPACE TS99ADD DATAFILE <filename> SIZE <size>;
8 – Suspended operation resumes automatically
9 – Operation completes successfully
45
© 2005 Julian Dykejuliandyke.com
Resumable Statements In Oracle 10.1 and above resumable statements can be
enabled at instance levelALTER SYSTEM SET resumable_timeout = <timeout>;
Resumable statements can be disabled at instance level using
ALTER SYSTEM SET resumable_timeout = 0;
Resumable statements can be enabled at session level using
ALTER SESSION SET resumable_timeout = <timeout>;
Resumable statements can be disabled at session level using
ALTER SESSION SET resumable_timeout = 0;
46
© 2005 Julian Dykejuliandyke.com
Automatic Datafile Deletion In Oracle 9.0.1 and above, DROP TABLESPACE has been
extended to optionally delete its datafiles
DROP TABLESPACE tablespace_nameINCLUDING CONTENTS AND DATAFILES;
The DROP TABLESPACE command automatically deletes Oracle Managed Files
47
© 2005 Julian Dykejuliandyke.com
Database Level Backups In Oracle 10.1 and above to enable/disable backup mode for
all tablespaces in single statement use:
Useful with three-way mirror or snapshot backups
ALTER DATABASE BEGIN BACKUP;ALTER DATABASE END BACKUP;
In Oracle 9.2 to disable backup mode for all tablespaces following a database restart use:
ALTER DATABASE END BACKUP;
48
© 2005 Julian Dykejuliandyke.com
Tables
49
© 2005 Julian Dykejuliandyke.com
Row Movement In Oracle 8.0 updating the partition key columns in a range
partitioned table fails if it would cause the row to be migrated to another partition
ORA-14402: updating partition key column would cause a partition change
In Oracle 8.1.5 and above row movement can be enabled a row may be migrated to another partition if its partition key
columns are updated
By default row movement is disabled
50
© 2005 Julian Dykejuliandyke.com
Row Movement
ALTER TABLE table1 ENABLE ROW MOVEMENT;ALTER TABLE table1 DISABLE ROW MOVEMENT;
Row movement can be enabled when the partitioned table is created e.g.
CREATE TABLE table1 (
column1 NUMBER,column2 NUMBER
)PARTITION BY ….ENABLE ROW MOVEMENT;
Row movement can be also be enabled and disabled from an existing table e.g.
51
© 2005 Julian Dykejuliandyke.com
External Tables External tables
read-only tables definition is stored in data dictionary data is stored outside the database in operating system
flat files can be queried using SQL can be queried in parallel can be included in DML statement subqueries
No DML operations are allowed on external table No indexes can be created on external table
52
© 2005 Julian Dykejuliandyke.com
External Tables Example
CREATE DIRECTORY ext_dir AS '/v01/external';
CREATE TABLE transactions(
account NUMBER,value NUMBER
)ORGANIZATION EXTERNAL(
TYPE ORACLE_LOADERDEFAULT DIRECTORY ext_dirACCESS PARAMETERS(
RECORDS DELIMITED BY NEWLINEFIELDS TERMINATED BY ‘,’
)LOCATION (‘transactions.csv’)
);
53
© 2005 Julian Dykejuliandyke.com
External Tables The following tests were based on a 1,000,000 row flat file.
Each row contained 74 bytes of data and 4 bytes of separators Tests were performed in NOARCHIVING and ARCHIVING
modes
Description Time in seconds
NoArchiving Archiving
Use SQL*Loader with CONVENTIONAL path load to INSERT rows
318 322
Use SQL*Loader with DIRECT load to INSERT rows 28 285
Use CREATE TABLE AS SELECT to copy data from external table to internal table
20 290
Use CREATE TABLE AS SELECT to copy data from internal table to internal table
15 283
54
© 2005 Julian Dykejuliandyke.com
Data Segment Compression Introduced in Oracle 9.2
Data is compressed when it is written to a block decompressed when it is read from the block
Compression is applied at block level
Blocks will only be compressed if data is sufficiently large to fill the block rows have low enough cardinality
Columns can be reordered within each block to achieve optimal compression ratios
A segment may contain compressed and uncompressed blocks
55
© 2005 Julian Dykejuliandyke.com
Data Segment Compression Compression can be specified for new tables
CREATE TABLE t1 (c01 NUMBER,c02 VARCHAR2(30)) COMPRESS;
Compression can also be specified for existing tables
ALTER TABLE t2 COMPRESS;
Existing tables can be compressed using
ALTER TABLE t3 MOVE COMPRESS;
Compression can also be specified for range and list partitioned tables materialized views nested tables
56
© 2005 Julian Dykejuliandyke.com
Data Segment Compression Only works with direct path inserts
For example CREATE TABLE AS SELECT INSERT /*+ APPEND */ ALTER TABLE MOVE Materialized View Refresh SQL*Loader Online Reorganization
Does not work with INSERT /*+ NOAPPEND */ UPDATE DELETE
57
© 2005 Julian Dykejuliandyke.com
Data Segment Compression
1993Ayrton Senna4
1996Olivier PanisLigier
19943 2
19953 2
19971 2
20024 0
20011 2
20004 0
19991 2
19984 Mika Hakkinen
SymbolTable
Row Data
2 David Coulthard0
3 Ferrari1
5 Michael Schumacher2
Benetton3 2
4 4 McLaren
Year Driver Team
1993 Ayrton Senna McLaren
1994 Michael Schumacher Benetton
1995 Michael Schumacher Benetton
1996 Olivier Panis Ligier
1997 Michael Schumacher Ferrari
1998 Mika Hakkinen McLaren
1999 Michael Schumacher Ferrari
2000 David Coulthard McLaren
2001 Michael Schumacher Ferrari
2002 David Coulthard McLaren
Monaco Grand PrixWinners 1993-2002
58
© 2005 Julian Dykejuliandyke.com
Data Segment Compression Compression ratios vary with
number of rows number of columns cardinality of rows
For example – loading SALES table from sales history demo schema
$ORACLE_HOME/demo/schema/sales_history
Block Size
Uncompressed Size (Blocks)
Compressed Size (Blocks)
Ratio %
2048 18777 13433 71.5
4096 8983 6106 68.0
8192 4398 2850 64.7
16384 2179 1353 62.0
Table contains 1016271 rows
59
© 2005 Julian Dykejuliandyke.com
Data Segment Compression Test1 – Loading the SALES table from a flat file into an empty
table
Compressed Blocks Elapsed TIme (Secs)
CPU Time (Secs)
No 4398 31.77 4.13
Yes 2850 71.08 43.86
Test2 – Selecting one column from all rows in the compressed table
SELECT SUM (quantity_sold) FROM sales;
Compressed Blocks Elapsed TIme (Secs)
CPU Time (Secs)
No 4398 3.41 2.77
Yes 2850 3.78 3.53
60
© 2005 Julian Dykejuliandyke.com
Indexes
61
© 2005 Julian Dykejuliandyke.com
Index Leaf Compression Introduced in Oracle 8.1.5
Compresses leading columns in index
Must be specified when index is created or rebuilt
CREATE INDEX i1 ON t1 (c1, c2, c3) COMPRESS 2;
ALTER INDEX i1 REBUILD ONLINE COMPRESS 1;
Benefits Reduces number of blocks to hold index Reduction in physical I/O for scans Improved cache efficiency Potential reduction in index height
CBO more likely to use index
62
© 2005 Julian Dykejuliandyke.com
Index Leaf Compression
Country City
France Paris
Germany Berlin
Germany Frankfurt
Germany Munich
Italy Milan
Italy Rome
Suffix Slot Array
Prefix Slot Array
1600 120013001400 9001000
15001700 11001 4 6
1700
1500
1400
1300
1200
1100
1600
1000
900
France
Paris
Germany
Berlin
Frankfurt
Munich
Italy
Milan
Rome
Prefix Row
Prefix Row
Prefix Row
Suffix Row
Suffix Row
Suffix Row
Suffix Row
Suffix Row
Suffix Row CREATE INDEX i1ON TABLE t1 (country, city)COMPRESS 1;
63
© 2005 Julian Dykejuliandyke.com
Index Leaf Compression Number and size of prefixed rows can be verified using
Useful INDEX_STATS columns include PRE_ROWS
Number of prefix rows PRE_ROWS_LEN
Sum of lengths of all prefix rows OPT_CMPR_COUNT
Optimal key compression length OPT_CMPR_PCTSAVE
Space saved by implementing optimal key length
ANALYZE INDEX i1 VALIDATE STRUCTURE;SELECT * FROM index_stats;
64
© 2005 Julian Dykejuliandyke.com
Index Leaf Compression Can also be used with IOTs
CREATE TABLE t1 (
c1 NUMBER,c2 NUMBER,c3 NUMBER,c4 NUMBERCONSTRAINT pk1 PRIMARY KEY (c1,c2,c3)
)ORGANIZATION INDEXCOMPRESS 2;
ALTER TABLE t1 MOVE COMPRESS 1;
To rebuild existing IOT
65
© 2005 Julian Dykejuliandyke.com
Index Rebuild Online Introduced in 8.1.5
create or rebuild index whilst allowing concurrent DML operations
Works with B*tree indexes (non-partitioned and partitioned) – 8.1.5 IOTs (non-partitioned and partitioned) – 8.1.5 Reverse key indexes – 9.0.1 Function-based indexes – 9.0.1 Compressed indexes – 9.0.1 IOT Secondary indexes – 9.0.1
66
© 2005 Julian Dykejuliandyke.com
Index Rebuild Online To build an index online use
ALTER INDEX index1 REBUILD ONLINE;
Can be executed in parallel
Three phasesprepare phase
index created data dictionary updated
build phase index populated changes written to journal table
merge phaserows in journal table are merged
67
© 2005 Julian Dykejuliandyke.com
ANALYZE INDEX ONLINE Prior to Oracle 9.0.1, index structure can be analyzed using
ANALYZE INDEX index_nameVALIDATE STRUCTURE;
No DML possible against index while it is being analyzed
In Oracle 9.0.1 and above indexes can be analyzed online
ANALYZE INDEX index_nameVALIDATE STRUCTURE ONLINE;
DML statements unaffected
68
© 2005 Julian Dykejuliandyke.com
Index Monitoring In Oracle 9.0.1 indexes can be monitored to determine if they
are being used
If index monitoring is enabled for an index, then Oracle updates a table in the data dictionary when that index is included in an execution plan by the parser
Indexes are only monitored at parse time
Only SELECT statements and subqueries monitored
Also works for bitmap indexes
69
© 2005 Julian Dykejuliandyke.com
Index Monitoring
SELECT index_name,monitoring FROM v$object_usage;
This example assumes the following definitions
ALTER INDEX index1 MONITORING USAGE;ALTER INDEX index2 MONITORING USAGE;
CREATE TABLE table1 (col1 NUMBER, col2 NUMBER);CREATE INDEX index1 ON table1 (col1);CREATE INDEX index2 ON table1 (col2);
Enable index monitoring using
To check which indexes are being monitored use
INDEX_NAME MONITORING
INDEX1 YES
INDEX2 YES
70
© 2005 Julian Dykejuliandyke.com
Index Monitoring Execute all possible statements against the table
SELECT index_name,used FROM v$object_usage;
ALTER INDEX index1 NOMONITORING USAGE;ALTER INDEX index2 NOMONITORING USAGE;
SELECT /*+ INDEX (table1 index1) */ * FROM table1WHERE col1 = 0;
Check which indexes have been used using
Disable index monitoring using
INDEX_NAME USED
INDEX1 YES
INDEX2 NO
71
© 2005 Julian Dykejuliandyke.com
Create Index NOSORT Specify the NOSORT option to avoid sorting index columns
when creating an index
CREATE INDEX index1 ON table1 (column1) NOSORT
If columns are not in sorted order then index creation will fail with the following error:
ORA-01409: NOSORT option may not be used; rows are not in ascending order
72
© 2005 Julian Dykejuliandyke.com
Create Index Compute Statistics Introduced in Oracle 8.1.5 To compute statistics when creating an index use:
CREATE INDEX index1 ON table1 (column1) COMPUTE STATISTICS;
Statistics will be computed (not estimated)
If the index is composite, statistics only generated for leading column
If the index is non-partitioned, table, column and index statistics are gathered
If the index is partitioned only index statistics are gathered
To compute statistics when rebuilding an index use:
ALTER INDEX index1 REBUILD COMPUTE STATISTICS;
73
© 2005 Julian Dykejuliandyke.com
Global Index Maintenance In Oracle 9.0.1 and above UPDATE GLOBAL INDEXES can be
specified for DDL statements on partitioned tables Global indexes remain available during the operation Updates to the global index are logged
UPDATE GLOBAL INDEXES can be used with the following partition DDL statements
ALTER TABLE table1DROP PARTITION table1_p1UPDATE GLOBAL INDEXES;
ADD SPLIT
DROP MERGE
MOVE EXCHANGE
TRUNCATE COALESCE
For example
74
© 2005 Julian Dykejuliandyke.com
Undoand
Redo
75
© 2005 Julian Dykejuliandyke.com
Global Temporary Tables Introduced in Oracle 8.1.5
Defined in data dictionary – definition available to all sessions
Data only visible to current session retained for duration of current transaction or session stored in user’s sort space can overflow to sort segment in user’s temporary
tablespace
Indexes can be created against global temporary tables same scope and duration
76
© 2005 Julian Dykejuliandyke.com
Global Temporary Tables Can define triggers and views
Views cannot join permanent and temporary tables
Benefits Reduction in DDL Reduction in amount of redo generated
DML statements against global temporary tables Generate undo Generate redo for undo Do not generate redo for block changes
77
© 2005 Julian Dykejuliandyke.com
Global Temporary Tables ON COMMIT DELETE ROWS
rows are only visible to the current transaction
CREATE GLOBAL TEMPORARY TABLE temp1 (column1 NUMBER)ON COMMIT DELETE ROWS;
INSERT INTO temp1 VALUES (1);
SELECT * FROM temp1;
Column11
COMMIT;
SELECT * FROM temp1;
No rows returned
78
© 2005 Julian Dykejuliandyke.com
Global Temporary Tables ON COMMIT PRESERVE ROWS
rows are visible throughout current session
CREATE GLOBAL TEMPORARY TABLE temp2 (column1 NUMBER)ON COMMIT PRESERVE ROWS;
INSERT INTO temp2 VALUES (1);
SELECT * FROM temp2;
Column11
COMMIT;
SELECT * FROM temp2;
Column11
79
© 2005 Julian Dykejuliandyke.com
Guaranteed Undo Retention Introduced in Oracle 10.1 To specify that unexpired undo should be preserved in all
undo segments even if this makes current operations requiring undo space fail use
Only applies to undo tablespaces Useful while flashback queries are running
To specify default behaviour use
ALTER TABLESPACE tablespace_nameRETENTION GUARANTEE;
ALTER TABLESPACE tablespace_nameRETENTION NOGUARANTEE;
80
© 2005 Julian Dykejuliandyke.com
Enabling NOLOGGING UNRECOVERABLE clause introduced in Oracle 7.3 NOLOGGING clause introduced in Oracle 8.0 Enabled at object level
ALTER TABLE table NOLOGGING ;
Can be used by SQL*Loader direct loads CREATE TABLE direct loads CREATE INDEX direct loads INSERT /*+ APPEND */ INSERT LOB NOCACHE
Writes reduced redo Cannot be recovered
CREATE INDEX index1 ON table1(column1) NOLOGGING;
81
© 2005 Julian Dykejuliandyke.com
Disabling NOLOGGING If NOLOGGING option is specified
Limited redo is written Changes cannot be recovered Changes cannot be transported to standby database
In Oracle 9.2 and above NOLOGGING can be disabled At database level
ALTER DATABASE FORCE LOGGING ;ALTER DATABASE NO FORCE LOGGING;
ALTER TABLESPACE tablespace_name FORCE LOGGING ;ALTER TABLESPACE tablespace_name NO FORCE LOGGING;
At tablespace level
82
© 2005 Julian Dykejuliandyke.com
PL/SQL
83
© 2005 Julian Dykejuliandyke.com
Native Dynamic SQL Prior to Oracle 8.1.5 PL/SQL DDL statements were executed
using DBMS_SQL package
DECLAREl_cursor INTEGER;l_result INTEGER;
BEGINl_cursor := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE (l_cursor,‘ALTER SYSTEM SWITCH LOGFILE’,DBMS_SQL.V7);
l_result := DBMS_SQL.EXECUTE (l_cursor);
DBMS_SQL.CLOSE_CURSOR (l_cursor);END;
84
© 2005 Julian Dykejuliandyke.com
Native Dynamic SQL In Oracle 8.1.5 and above EXECUTE IMMEDIATE can execute DDL
statements
EXECUTE IMMEDIATE 'INSERT INTO tab1 (c1,c2) VALUES (1,10)';EXECUTE IMMEDIATE 'UPDATE tab1 SET c1 = 4 WHERE c2 = 10';EXECUTE IMMEDIATE 'DELETE FROM tab1 WHERE c2 = 10';
EXECUTE IMMEDIATE can also execute DML statements
EXECUTE IMMEDIATE 'CREATE TABLE tab1 (c1 NUMBER)';EXECUTE IMMEDIATE 'ALTER TABLE tab1 ADD (c2 NUMBER)';EXECUTE IMMEDIATE ‘DROP TABLE tab1’;
85
© 2005 Julian Dykejuliandyke.com
Native Dynamic SQL EXECUTE IMMEDIATE can also be used for SELECT
statements
INTO clause is used to define fetch variables
For example
DECLAREl_c1 NUMBER;l_str VARCHAR2(1000);
BEGIN l_str := 'SELECT c0l1 FROM tab1 WHERE c2 = 20';
EXECUTE IMMEDIATE l_str INTO l_c1;DBMS_OUTPUT.PUT_LINE ('Result is ‘ || l_c1);
END;
86
© 2005 Julian Dykejuliandyke.com
Native Dynamic SQL EXECUTE IMMEDIATE can also use bind variables
USING clause is used to specify bind variable positions
For example
DECLAREl_c1 NUMBER;l_str VARCHAR2(1000);
BEGIN l_str := 'SELECT c1 FROM t1 WHERE c2 = :p1';
EXECUTE IMMEDIATE l_str INTO l_c0l1 USING 10;DBMS_OUTPUT.PUT_LINE ('Result is '||l_c1);
EXECUTE IMMEDIATE l_str INTO l_c0l1 USING 30;DBMS_OUTPUT.PUT_LINE ('Result is '||l_c1);
END;
87
© 2005 Julian Dykejuliandyke.com
Bulk Collect Introduced in Oracle 8.1.5
Returns result set in single operation
Can be used with SELECT INTO FETCH INTO RETURNING INTO
88
© 2005 Julian Dykejuliandyke.com
Bulk Collect - ExampleDECLARE -- 100000 row table
l_c3 NUMBER;CURSOR c1 IS SELECT c3 FROM t1;
BEGINOPEN c1;LOOP
FETCH c1 INTO l_c3; -- 3.052 secondsEXIT WHEN c1%NOTFOUND;
END LOOP; CLOSE c1; END; DECLARE -- 100000 row table
TYPE NUMTYPE IS TABLE OF NUMBER(6) INDEX BY BINARY_INTEGER;l_c3 NUMTYPE;CURSOR c1 IS SELECT c3 FROM t1;
BEGINOPEN c1;LOOP
FETCH c1 BULK COLLECT INTO l_c3; -- 0.119 secondsEXIT WHEN c1%NOTFOUND;
END LOOP; CLOSE c1; END;
89
© 2005 Julian Dykejuliandyke.com
Bulk Collect Limit Clause Bulk collect performance improves as optimum result set size
is approached
Thereafter bulk collect performance degrades as result set grows
In Oracle 8.1.6 and above the number of rows returned by FETCH INTO can be restricted using the LIMIT clause
FETCH c1 BULK COLLECT INTO l_c3 LIMIT 1000;
90
© 2005 Julian Dykejuliandyke.com
FORALL Introduced in Oracle 8.1.5
Sends INSERT, UPDATE or DELETE statements in batches
Can only repeat single DML statement
Works with PL/SQL collections including TABLE, VARRAY, NESTED TABLE etc.
Much faster than equivalent for-loop
Limited functionality
91
© 2005 Julian Dykejuliandyke.com
FORALL Example DECLARE
TYPE NUMTYPE IS TABLE OF NUMBER(6) INDEX BY BINARY_INTEGER;TYPE NAMETYPE IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;l_c1 NUMTYPE;l_c2 NAMETYPE;l_c3 NUMTYPE;
BEGINFOR i IN 1..100000 LOOP
l_c1(i) := i;l_c2(i) := LPAD (TO_CHAR (i),30,’0’);l_c3(i) := MOD (i, 100);
END LOOP;
FOR i IN 1..100000 LOOP -- FOR Loop – 28 secondsINSERT INTO t1 VALUES (l_c1 (i), l_c2 (i), l_c3(i));
END LOOP;
FORALL f IN 1..100000 LOOP -- FORALL Loop – 4 secondsINSERT INTO t1 VALUES (l_c1 (i), l_c2 (i), l_c3(i));
END;
92
© 2005 Julian Dykejuliandyke.com
FORALL Performance Performance of FORALL statement degrades for very large
tables
Rows FOR FORALL
100000 28 4
1000000 240 360
Times in seconds
93
© 2005 Julian Dykejuliandyke.com
Conclusion Every release contains many new features and enhancements
that are not highlighted in the marketing material
Oracle assumes all customers will move on to new versions when they are released
Study the New Features documentation when you upgrade
94
© 2005 Julian Dykejuliandyke.com
Thank you for your interest
For more information and to provide feedback
please contact me
My e-mail address is:[email protected]
My website address is:
www.juliandyke.com