You are on page 1of 26

Oracle Architecture

Overview
Oracle terms
Schema logical collection of users
objects
Tablespace logical space used for
storage
Datafile physical file used for
storage
Extent group of contiguous blocks
Block unit of physical storage
Oracle Architecture
database vs. instance

Database Instance

Parameter files* System Global Area (SGA)


Control files** Background Processes
Data files
Redo Log files

Disk Memory

* Parameter files include the init<SID>.ora and config<SID>.ora files. These


are used to set options for the database.
** Control files contain information about the db in binary form. They can be
backed up to a text file however.
Oracle vs. Access and MySQL
Access
One .mdb file contains all objects
Limited roles/permissions

MySQL
Three files per table
Permissions based on user, database, and host

Oracle
Many files
Many roles/permissions possible
The Oracle Data
Dictionary
Collection of tables and views that show the
inner workings and structure of the db
static data dictionary views
owned by SYS
created by catalog.sql script at db creation
contain DDL info
dynamic data dictionary views
also referred to as V$ views
based on virtual tables (X$ tables)
provide info about the instance
More Data Dictionary
Create table samples (
ID number(3) primary key,
Type varchar2(5),
Constraint type_ck check (type in (photo,swatch))
);

1. Samples table created in users schema


2. Primary key index created in users schema (SYS_C984620)

3. Data dictionary is also updated, with rows being inserted into


tables underlying the following data dictionary views:
User_objects
User_constraints
User_cons_columns
And lots more
Oracle Odds and
Ends
Dual table
SELECT 1+1*400 FROM DUAL;

% - the SQL wildcard


SELECT ename FROM emp WHERE ename like %neil%;

inserting apostrophes
INSERT INTO emp (name) VALUES (ONeill);

Case sensitive string matching


UPDATE emp
SET ename=UPPER(ename) WHERE ename='O''Neill';
Sysdate
Sysdate returns current system date AND time
use trunc function to remove time piece

Example:
select to_char (adate, dd-mon-yy hh24:mi:ss)
TO_CHAR(ADATE, DD-MON-YY:HH24:MI:SS)
17-feb-00 23:41:50

select adate from samples where trunc(adate)=17-feb-00;


ADATE
17-FEB-00
ROWID
ROWID is an internal number Oracle uses to
uniquely identify each row
NOT a primary key! Is the actual location of a
row on a disk. Very efficient for retrieval.
Format specifies block, row, and file (and
object in 8)
Oracle 7: BBBBBBB.RRRR.FFFFF
Oracle 8: OOOOOO.FFF.BBBBBB.RRR
Called pseudo-column since can be selected
Outer joins in Oracle
Add (+) to table where nulls are
acceptable

SELECT *
FROM emp, dept
WHERE emp.deptno(+)=dept.id;
Oracle SQL functions
Upper(), lower()
Substr(), replace(), rtrim(), concat()

Length()
Floor(), sqrt(), min(), max(), stddev()

Add_months(), months_between(), last_day()

To_date(), to_char(), to_lob()


More functions
nvl()
If NULL, return this instead
Nvl(lastname,Anonymous)

decode()
Sort of like an If/Then statement
Decode(gender,0,Male,1,Female,Unknown)
Oracle error messages
Divided into groups by first three
letters (e.g. ORA or TNS)
Number gives more information
about error
Several messages may be related
to only one problem

oerr facility
Constraints
Primary key
Foreign key
Unique, not null
Check CREATE TABLE test (
id NUMBER(2),
col2 VARCHAR2(2),
col3 VARCHAR2(3),
CONSTRAINT test_pk PRIMARY KEY(id),
CONSTRAINT col3_ck CHECK (col3 IN ('yes','no'))
);

Name your constraints


User_constraints, user_cons_columns
SELECT
user_constraints.constraint_name name,
constraint_type type,
user_constraints.search_condition
FROM user_constraints, user_cons_columns
WHERE
user_constraints.table_name=user_cons_columns.table_name
AND user_constraints.constraint_name=user_cons_columns.constraint_name
AND user_constraints.owner=user_cons_columns.owner
AND user_constraints.table_name=TEST;

NAME T SEARCH_CONDITION
--------------- - -------------------------
COL3_CK C col3 IN ('yes','no')
TEST_PK P
Constraints
Oracle naming of constraints is NOT
intuitive!

enabling and disabling


disable constraint constraint_name;

the EXCEPTIONS table


run utlexcpt.sql to create EXCEPTIONS table
then
alter SQL statement:
SQL_query EXCEPTIONS into EXCEPTIONS;
More objects
Sequences
creating the sequence
create sequence CustomerID increment by 1
start with 1000;
selecting from the sequence
insert into customer (name, contact, ID)
values (TManage,Kristin
Chaffin,CustomerID.NextVal);
CurrVal is used after NextVal for related inserts
Synonyms
provide location and owner transparency
Can be public or private
PL/SQL -
Triggers
Executed on insert, update, delete
Use to enforce business logic that cant
be coded through referential integrity or
constraints
Types of triggers
row level (use FOR EACH ROW clause)
statement level (default)
Before and After triggers
Referencing old and new values
Trigger example
SQL> desc all_triggers;
Name Null? Type
------------------------------- -------- ----
OWNER VARCHAR2(30)
TRIGGER_NAME VARCHAR2(30)
TRIGGER_TYPE VARCHAR2(16)
TRIGGERING_EVENT VARCHAR2(75)
TABLE_OWNER VARCHAR2(30)
BASE_OBJECT_TYPE VARCHAR2(16)
TABLE_NAME VARCHAR2(30)
COLUMN_NAME VARCHAR2(4000)
REFERENCING_NAMES VARCHAR2(128)
WHEN_CLAUSE VARCHAR2(4000)
STATUS VARCHAR2(8)
DESCRIPTION VARCHAR2(4000)
ACTION_TYPE VARCHAR2(11)
TRIGGER_BODY LONG
Trigger example (cont.)
SQL> select trigger_name from all_triggers where owner='SCOTT';

TRIGGER_NAME
------------------------------
AFTER_INS_UPD_ON_EMP

set lines 120


col trigger_name format a20
col triggering_event format a18
col table_name format a10
col description format a26
col trigger_body format a35
select trigger_name, trigger_type, triggering_event,
table_name, status, description, trigger_body
from all_triggers
where trigger_name='AFTER_INS_UPD_ON_EMP';
Trigger example (cont.)
SQL> /

TRIGGER_NAME TRIGGER_TYPE TRIGGERING_EVENT TABLE_NAME STATUS DESCRIPTION


-------------------- ---------------- ------------------ ---------- -------- -----------------------
TRIGGER_BODY
-----------------------------------
AFTER_INS_UPD_ON_EMP BEFORE EACH ROW INSERT OR UPDATE EMP ENABLED
scott.after_ins_upd_on_emp

before insert or update


on scott.emp
for each row
begin
:new.ename := upper(:new.ename);

end;
The above trigger was created with the following statement:

create or replace trigger scott.after_ins_upd_on_emp


before insert or update on scott.emp
for each row
begin
:new.ename := upper(:new.ename);
end;
Remember those
views?
Query USER_TRIGGERS to get trigger info
Query USER_SOURCE to get source of
procedure, function, package, or package
body
Query USER_ERRORS to get error
information (or use show errors)
col name format a15
col text format a40
select name, type, text
from user_errors
order by name, type, sequence;

Query USER_OBJECT to get status info


Understanding Indexes
Index overhead
impact on inserts, updates and deletes
batch inserts can be slowed by indexes - may
want to drop, then recreate
rebuilding indexes
Use indexes when query will return less than
5% of rows in a large table
Determining what to index
All primary and foreign keys
Examine SQL and index heavily hit, selective
columns (columns often found in where clauses)
What not to Index
preferably
columns that are constantly updated
columns that contain a lot of null
values
columns that have a poor
distribution of data
Examples:
yes/no
true/false
male/female
B*-tree index
Miller
Branch
< Miller > Miller
blocks
< Davis Smith
Davis Turner
Jones Turner >

Adams Deal Jules Moss Sykes Vera


Brown Howard Klein Porter Thomas Wagner
Culver Isis Main Sikes Topper Yanks

Deal ROWID Leaf


Howard ROWID Detail of blocks
Isis - ROWID leaf node
Bitmap index
Parts table
partno color size

1 GREEN MED
2 RED MED
3 RED SMALL
4 BLUE LARGE

Bitmapped index on color


color = BLUE 0 0 0 1
color = RED 0 1 1 0
color = GREEN 1 0 0 0

Part number 1 2 3 4

You might also like