Download No Slide Title

Document related concepts
no text concepts found
Transcript
<Insert Picture Here>
Top 10, no – make that 11, things about
Oracle Database 11g Release 1
Thomas Kyte
http://asktom.oracle.com
The Beginning...
•
•
•
•
Data Model with Structure
Data Independent of Code
Set-oriented
1977 the work begins
First RDBMS: Version 2
June 1979
• FIRST Commercial SQL RDBMS
• Impressive First SQL
• Joins, Subqueries
• Outer Joins, Connect By
• A Simple Server
• No transactions, ‘Limited’ Reliability
• Portability from the Start
• Written in Fortran
• But multi-platform – PDP11, Dec VAX
Oracle7.3
February 1996
• Partitioned Views
• Bitmapped Indexes
• Asynchronous read ahead for
table scans
• Standby Database
• Deferred transaction recovery
on instance startup
• Updatable Join View
• SQLDBA no longer shipped.
• Index rebuilds
• DBV introduced
• Context Option
• PL/SQL - UTL_FILE
 Spatial Data Option
 Tablespaces changes - Coalesce,
Temporary Permanent,
 Trigger compilation, debug
 Unlimited extents on STORAGE
clause.
 Some init.ora parameters
modifiable - TIMED_STATISTICS
 HASH Joins, Antijoins
 Histograms
 Oracle Trace
 Advanced Replication Object
Groups
Oracle Database Innovation
30 years of
sustained
innovation …
Audit Vault
Database Vault
Grid Computing
Self Managing Database
XML Database
Oracle Data Guard
Real Application Clusters
Flashback Query
Virtual Private Database
Built in Java VM
Partitioning Support
Built in Messaging
Object Relational Support
Multimedia Support
Data Warehousing Optimizations
Parallel Operations
Distributed SQL & Transaction Support
Cluster and MPP Support
Multi-version Read Consistency
Client/Server Support
Platform Portability
Commercial SQL Implementation
1977
… continuing with
Oracle Database 11g
2007
#1 Encrypted
Tablespaces
Encrypted Tablespaces
• Oracle Database 10g Release 2 introduced column
encryption
• Could not range scan
• Primary/foreign key issues
• Tablespace encryption Removes those limitations
• Many encryption algorithms
•
•
•
•
3DES168
AES128
AES192
AES256
Encrypted Tablespaces
ops$tkyte%ORA11GR1> create tablespace encrypted
2
datafile '/…/encrypted.dbf' size 10m
3
ENCRYPTION default storage( encrypt );
Tablespace created.
ops$tkyte%ORA11GR1> create tablespace clear
2
datafile '/…/clear.dbf' size 10m;
Tablespace created.
Encrypted Tablespaces
ops$tkyte%ORA11GR1> create table t
2
tablespace clear
3
as
4
select * from all_users;
Table created.
ops$tkyte%ORA11GR1> create index t_idx
2
on t(lower(username))
3
tablespace clear;
Index created.
Encrypted Tablespaces
ops$tkyte%ORA11GR1> alter system checkpoint;
System altered.
$ strings /…/clear.dbf | grep -i ops.tkyte
OPS$TKYTE
from the table
ops$tkyte
from the index
Encrypted Tablespaces
ops$tkyte%ORA11GR1> alter table t move
2
tablespace encrypted;
Table altered.
ops$tkyte%ORA11GR1> alter index t_idx rebuild
2
tablespace encrypted;
Index altered.
Encrypted Tablespaces
ops$tkyte%ORA11GR1> alter system checkpoint;
System altered.
$ strings /…/encrypted.dbf | grep -i ops.tkyte
[This space intentionally left blank]
Encrypted Tablespaces
ps$tkyte%ORA11GR1> set autotrace traceonly explain
ops$tkyte%ORA11GR1> select * from t where lower(username) like 'ops$%';
Execution Plan
------------------------------------------------------------| Id
| Operation
| Name
| Rows
| Bytes |
------------------------------------------------------------|
0 | SELECT STATEMENT
|
1 |
|*
2 |
|
|
2 |
112 |
|
2 |
112 |
| T_IDX |
1 |
|
TABLE ACCESS BY INDEX ROWID| T
INDEX RANGE SCAN
------------------------------------------------------------Predicate Information (identified by operation id):
--------------------------------------------------2 - access(LOWER("USERNAME") LIKE 'ops$%')
filter(LOWER("USERNAME") LIKE 'ops$%')
#2 Cache More
Stuff
Cache More
• Everyone knows the fastest way to do
something is – to not do it
• Client Side Cache
• Server Results Cache (JIT-MV)
• PL/SQL Function results cache
• Lots more detail in afternoon session
#3 Standby
Just got better
Standby Database
• Logical Standby was…
• Limited in type support
• But was always open for business
• Physical Standby was…
• Easy
• But considered “not useful day to day”
Standby Database
• Logical Standby has…
• XMLType support
• DBMS_RLS & DBMS_FGA support
• TDE support
Active Data Guard:
Develop & Test on Standby DB
Production
Database
• Use physical standby database
for development & testing
Developers,
Testers
Standby
Database
• Preserves zero data loss in test/dev mode
• Flashback DB to back-out
changes & use as standby
Eliminates cost of
idle DR system
Active Data Guard:
Report & Backup from Standby DB
Production
Database
• Offload reporting to standby
• Simultaneously available for recovery
Reporting
• Offload backups to standby
Standby
Database
Backups
• Complete database and fast incremental
backups
Improves performance on
production database
Active Data Guard –
More than a Standby
Disaster
protection only
Disaster and
performance protection
Recovery
mode only
Simultaneous read
and recovery
Used in
disaster only
Use daily in testing
and production
Manual
intensive
Automated
Low ROI
High ROI
#4 Real
Application
Testing
Real Application Testing –
Database Replay
• Recreate actual production database workload
• Capture production workload incl. concurrency
• Replay workload in test with production timing
• Analyze & fix issues before production
Middle
Tier
Oracle
DB servers
Production
Environment
Capture DB
Workload
Storage
Test (RAC)
Environment`
Replay DB
Workload
#5 Smaller
more secure
DMP files
Datapump
• COMPRESSION
• ALL, DATA_ONLY, METADATA_ONLY, NONE
$ expdp / directory=tmp dumpfile=uncompressed.dmp compression=NONE schemas=ops\$tkyte
Export: Release 11.1.0.6.0 - Production on Friday, 21 September, 2007 12:23:26
. . exported "OPS$TKYTE"."BIG_TABLE"
24.57 MB
250000 rows
. . exported "OPS$TKYTE"."T"
6.791 MB
67945 rows
$ expdp / directory=tmp dumpfile=compressed.dmp compression=ALL schemas=ops\$tkyte
Export: Release 11.1.0.6.0 - Production on Friday, 21 September, 2007 12:23:58
. . exported "OPS$TKYTE"."BIG_TABLE"
3.110 MB
250000 rows
. . exported "OPS$TKYTE"."T"
762.1 KB
67945 rows
$ ls -l /tmp/*compressed.dmp
-rw-r-----
1 ora11gr1 ora11gr1
4124672 Sep 21 12:24 /tmp/compressed.dmp
-rw-r-----
1 ora11gr1 ora11gr1 33136640 Sep 21 12:23 /tmp/uncompressed.dmp
Datapump
• ENCRYPTION
•
•
•
•
•
All
Data_only
Metadata_only
None
Encrypted_columns_only
• PARTITION_OPTIONS
• None
• Departition
• Merge
• REUSE_DUMPFILES
• Ability to use DML error
logging features
• DATA_OPTIONS parameter
#6 Virtual
Columns
Virtual Columns
• Create Table
• Alter Table Add Column
• Are ‘column expressions’
• Expressions involving other columns in table
• Constants
• Deterministic functions
• Ease of use and Optimizer enhancement
Virtual Columns
ops$tkyte%ORA11GR1> /*
ops$tkyte%ORA11GR1> create table emp
ops$tkyte%ORA11GR1> as
ops$tkyte%ORA11GR1> select all_objects.*, object_id sal,
round(dbms_random.value( 1000, 100000 )) comm
ops$tkyte%ORA11GR1>
from all_objects
ops$tkyte%ORA11GR1> /
ops$tkyte%ORA11GR1>
ops$tkyte%ORA11GR1> */
ops$tkyte%ORA11GR1> exec dbms_stats.gather_table_stats( user, 'EMP' )
PL/SQL procedure successfully completed.
Virtual Columns
ops$tkyte%ORA11GR1> select avg( sal+comm ) avg_comp, avg(sal) avg_sal, avg(comm)
avg_comm from emp;
AVG_COMP
AVG_SAL
AVG_COMM
---------- ---------- ---------85376.9437 34821.6827
50555.261
ops$tkyte%ORA11GR1> select
count(case when sal+comm > 85376.9437 then 1 end) above_comp,
2
count(case when sal
3
count(case when
4
> 34821.6827
comm > 50555.261 then 1 end) above_comm
from emp;
ABOVE_COMP
ABOVE_SAL ABOVE_COMM
---------- ---------- ---------33957
33830
then 1 end) above_sal ,
34036
Virtual Columns
ops$tkyte%ORA11GR1> select * from emp where sal > 34821.6827;
-------------------------------------------------------------------| Id
| Operation
| Name | Rows
| Bytes | Cost (%CPU)| Time
-------------------------------------------------------------------|
0 | SELECT STATEMENT
|*
1 |
|
TABLE ACCESS FULL| EMP
| 34673 |
3893K|
309
(1)| 00:0
| 34673 |
3893K|
309
(1)| 00:0
-------------------------------------------------------------------ABOVE_COMP
ABOVE_SAL ABOVE_COMM
---------- ---------- ---------33957
33830
34036
Virtual Columns
ops$tkyte%ORA11GR1> select * from emp where comm > 50555.261;
-------------------------------------------------------------------| Id
| Operation
| Name | Rows
| Bytes | Cost (%CPU)| Time
-------------------------------------------------------------------|
0 | SELECT STATEMENT
|*
1 |
|
TABLE ACCESS FULL| EMP
| 33943 |
3811K|
309
(1)| 00:0
| 33943 |
3811K|
309
(1)| 00:0
-------------------------------------------------------------------ABOVE_COMP
ABOVE_SAL ABOVE_COMM
---------- ---------- ---------33957
33830
34036
Virtual Columns
ops$tkyte%ORA11GR1> select * from emp where sal+comm > 85376.9437;
-------------------------------------------------------------------| Id
| Operation
| Name | Rows
| Bytes | Cost (%CPU)| Time
-------------------------------------------------------------------|
0 | SELECT STATEMENT
|*
1 |
|
TABLE ACCESS FULL| EMP
|
3398 |
381K|
309
(1)| 00:0
|
3398 |
381K|
309
(1)| 00:0
-------------------------------------------------------------------ABOVE_COMP
ABOVE_SAL ABOVE_COMM
---------- ---------- ---------33957
33830
34036
Virtual Columns
ops$tkyte%ORA11GR1> ALTER TABLE emp ADD (comp
AS (sal+comm));
Table altered.
ops$tkyte%ORA11GR1> exec
dbms_stats.gather_table_stats( user, 'EMP',
method_opt=> 'for columns comp' );
PL/SQL procedure successfully completed.
Virtual Columns
ops$tkyte%ORA11GR1> select * from emp where sal+comm > 85376.9437;
-------------------------------------------------------------------| Id
| Operation
| Name | Rows
| Bytes | Cost (%CPU)| Time
-------------------------------------------------------------------|
0 | SELECT STATEMENT
|*
1 |
|
TABLE ACCESS FULL| EMP
| 33927 |
3975K|
309
(1)| 00:0
| 33927 |
3975K|
309
(1)| 00:0
-------------------------------------------------------------------ABOVE_COMP
ABOVE_SAL ABOVE_COMM
---------- ---------- ---------33957
33830
34036
#7 Partitioning
just got better
Partitioning
• Composite Completely
• Virtual Column Partitioning
• Partition by Reference
• Interval Partitioning
Enhanced Partitioning
• Partition (or index) on virtual (computed) columns
• New composite partitioning
Range
List
Hash
Range
11g
9i
8i
List
11g
11g
11g
RANGE-RANGE
LIST-RANGE
LIST-LIST
Order Date by
Order Value
Region by
Order Value
Region by
Customer Type
Partitioning
by REFERENCE
Table ORDERS
...
Jan 2006
Feb 2006
...
• RANGE(order_date)
• Primary key order_id
• Partitioning key inherited
through PK-FK relationship
• Avoids redundant storage,
maintenance of order_date
Table LINEITEMS
...
Jan 2006
Feb 2006
• RANGE(order_date)
... • Foreign key order_id
Partitioning
Automation
New “INTERVAL” partitioning
• Automatically creates a new
partition when data outside the
existing range is first inserted
ORDERS
• E.g., monthly partitions, automatic
new partition first day of the month
Jul
Aug
Sep 1 2007
Sep
• Composite partitioning:
interval, interval-list, intervalhash, and interval-range
• Automates partition
management
Partitioning
ops$tkyte%ORA11GR1> create table audit_trail
2
( ts
3
data
timestamp,
varchar2(30)
4
)
5
partition by range(ts)
6
interval (numtodsinterval(1,'day'))
7
store in (users, example )
8
(partition p0 values less than
9
(to_date('22-sep-2007','dd-mon-yyyy'))
10
)
11
/
Table created.
Partitioning
ops$tkyte%ORA11GR1> select partition_name, tablespace_name, high_value
2
3
from user_tab_partitions
where table_name = 'AUDIT_TRAIL';
PARTITION_ TABLESPACE HIGH_VALUE
---------- ---------- ---------------------------------P0
USERS
TIMESTAMP' 2007-09-22 00:00:00'
Partitioning
ops$tkyte%ORA11GR1> insert into audit_trail
2
select sysdate+rownum, 'x'
3
from all_users
4
where rownum <= 5
5
/
5 rows created.
Partitioning
ops$tkyte%ORA11GR1> select partition_name, tablespace_name, high_value
2
3
from user_tab_partitions
where table_name = 'AUDIT_TRAIL';
PARTITION_ TABLESPACE HIGH_VALUE
---------- ---------- ---------------------------------P0
USERS
TIMESTAMP' 2007-09-22 00:00:00'
SYS_P66
EXAMPLE
TIMESTAMP' 2007-09-23 00:00:00'
SYS_P67
USERS
TIMESTAMP' 2007-09-24 00:00:00'
SYS_P68
EXAMPLE
TIMESTAMP' 2007-09-25 00:00:00'
SYS_P69
USERS
TIMESTAMP' 2007-09-26 00:00:00'
SYS_P70
EXAMPLE
TIMESTAMP' 2007-09-27 00:00:00'
6 rows selected.
Partitioning
ops$tkyte%ORA11GR1> select partition_name, tablespace_name, high_value
2
3
from user_tab_partitions
where table_name = 'AUDIT_TRAIL';
PARTITION_ TABLESPACE HIGH_VALUE
---------- ---------- ------------------------------P0
USERS
TIMESTAMP' 2007-09-22 00:00:00'
Partitioning
ops$tkyte%ORA11GR1> insert into audit_trail values (
add_months(sysdate,12), 'x' );
1 row created.
ops$tkyte%ORA11GR1> select partition_name, tablespace_name, high_value
2
3
from user_tab_partitions
where table_name = 'AUDIT_TRAIL';
PARTITION_ TABLESPACE HIGH_VALUE
---------- ---------- ------------------------------P0
USERS
TIMESTAMP' 2007-09-22 00:00:00'
SYS_P180
EXAMPLE
TIMESTAMP' 2008-11-10 00:00:00'
Partitioning
ops$tkyte%ORA11GR1> insert into audit_trail values (
add_months(sysdate,6), 'x' );
1 row created.
ops$tkyte%ORA11GR1> select partition_name, tablespace_name, high_value
2
3
from user_tab_partitions
where table_name = 'AUDIT_TRAIL';
PARTITION_ TABLESPACE HIGH_VALUE
---------- ---------- ------------------------------P0
USERS
TIMESTAMP' 2007-09-22 00:00:00'
SYS_P181
EXAMPLE
TIMESTAMP' 2008-05-10 00:00:00'
SYS_P180
EXAMPLE
TIMESTAMP' 2008-11-10 00:00:00'
#8 The long
awaited pivot
Pivot
ops$tkyte%ORA11GR1> select deptno,
2
sum( decode( job, 'CLERK', sal ) ) clerk,
3
sum( decode( job, 'SALESMAN', sal ) ) salesman,
4
sum( decode( job, 'MANAGER', sal ) ) manager,
5
sum( decode( job, 'ANALYST', sal ) ) analyst,
6
sum( decode( job, 'PRESIDENT', sal ) ) president
7
from emp
8
group by deptno
9
order by deptno
10
/
DEPTNO
CLERK
SALESMAN
MANAGER
ANALYST
PRESIDENT
---------- ---------- ---------- ---------- ---------- ---------10
1300
2450
20
1900
2975
30
950
5600
2850
5000
6000
Pivot
ops$tkyte%ORA11GR1> select *
2
from (select deptno, job, sal
3
from emp ) e
4
pivot( sum(sal) for job in
5
( 'CLERK', 'SALESMAN', 'MANAGER',
6
7
8
'ANALYST', 'PRESIDENT' ) )
order by deptno
/
DEPTNO
'CLERK' 'SALESMAN'
'MANAGER'
'ANALYST' 'PRESIDENT'
---------- ---------- ---------- ---------- ---------- ----------10
1300
2450
20
1900
2975
30
950
5600
2850
5000
6000
#9 Flashback
Data Archive
Flashback Data Archive
Total Data Recall
Select * from orders
AS OF ‘Midnight 31-Dec-2004’
Archive
Tables
User
Tablespaces
Flashback
Data Archive
Oracle 11g Database
• Tamper-proof data
archive
• Efficient storage and
retrieval of undo
• Keep data for months,
years, decades!
• Fast access to even very
old data
• View data, versions of
rows as of any time
• Control data retention
time, purging of data
#10 Finer
Grained
Dependency
Tracking
Finer Grained Dependency Tracking
• Fewer Invalidations
• Add to a specification – so what
• Add/Drop/Modify a column – so what
• Holds true with view modifications too
• Change a synonym pointer – so what
• Replace a procedure – so what
Finer Grained Dependency Tracking
ops$tkyte%ORA10GR2> create or replace package p1
2
as
3
function f return number;
4
end;
5
/
Package created.
ops$tkyte%ORA10GR2> create or replace package p2
2
as
3
g_global number := p1.f;
4
end;
5
/
Package created.
Finer Grained Dependency Tracking
ops$tkyte%ORA10GR2> select object_name, status
2
3
from user_objects
where object_name like 'P_';
OBJECT_NAME
STATUS
------------------------------ ------P1
VALID
P2
VALID
Finer Grained Dependency Tracking
ops$tkyte%ORA10GR2> create or replace package p1
2
as
3
function f return number;
4
procedure p;
5
end;
6
/
Package created.
ops$tkyte%ORA10GR2> select object_name, status
2
3
from user_objects
where object_name like 'P_';
OBJECT_NAME
STATUS
------------------------------ ------P1
VALID
P2
INVALID
Finer Grained Dependency Tracking
ops$tkyte%ORA11GR1> create or replace package p1
2
as
3
function f return number;
4
procedure p;
5
end;
6
/
Package created.
ops$tkyte%ORA11GR1> select object_name, status
2
3
from user_objects
where object_name like 'P_';
OBJECT_NAME
STATUS
------------------------------ ------P1
VALID
P2
VALID
Finer Grained Dependency Tracking
ops$tkyte%ORA10GR2> create table t ( x int, y int );
Table created.
ops$tkyte%ORA10GR2> create or replace procedure p
2
as
3
begin
4
for x in ( select x, y from t )
5
loop
6
null;
7
end loop;
8
end;
9
/
Procedure created.
ops$tkyte%ORA10GR2> select status from user_objects where object_name = 'P';
STATUS
------VALID
Finer Grained Dependency Tracking
ops$tkyte%ORA10GR2> alter table t add z int;
Table altered.
ops$tkyte%ORA10GR2> select status from user_objects where object_name = 'P';
STATUS
------INVALID
ops$tkyte%ORA11GR1> select status from user_objects where object_name = 'P';
STATUS
------VALID
Finer Grained Dependency Tracking
ops$tkyte%ORA10GR2> alter procedure p compile;
Procedure altered.
ops$tkyte%ORA10GR2> alter table t drop column z;
Table altered.
ops$tkyte%ORA10GR2> select status from user_objects where object_name = 'P';
STATUS
------INVALID
ops$tkyte%ORA11GR1> select status from user_objects where object_name = 'P';
STATUS
------VALID
#11 OLTP Table
Compression
Oracle Advanced
Compression
• Oracle 9i compresses data only during bulk
load; useful for DW and ILM
• Oracle 11g compresses w/ inserts, updates
• Trade some cpu for disk & i/o efficiency
• Compress large application tables
• Transaction processing, data warehousing
• Compress all data types: structured,
unstructured
• Savings cascade to all db copies: test, dev,
standby, mirrors, archiving, backup, etc.
<Insert Picture Here>
Q&A
Related documents