Database - Oracle
Document Sample


Databases - Huh?
Prepared by : David Groves
March 2001
Databases
What is a database?
– Filesystem
– A table
– Application Server
– Operating System
What does it give me?
– Consistent view of data
– Concurrency
– Transactions/Isolation
– Standard API
– Performance
– Backup/Recovery
– Headache
Types of databases
– Filesystem
– Relational (SQL based)
– Object Relational
– Object
– Ad-Hoc
Vendors
– Oracle (80+%)
– IBM DB2
– Ingress
– Sybase
– MySQL, Postgresql ...
Oracle
Oracle
– Largest database vendor
– Current Version 8i (8.1.7)
– 9i due out mid-year
– Runs on (most) UNIX versions,
WinX, Linux
– Popular version in Telstra 7.3.4
(SOE - may have changed)
Oracle Architecture
A large shared memory segment
Buffered Data
Redundant Structures
Data Dictionary (Metadata)
Parsed SQL
A number of server processes
A number of per-client processes
A number of files (configuration, Data)
At the UNIX level
animal<1276> ps -aux | grep oracle
oracle 573 0.1 25.9287408260840 ? S Feb 01 32:00 ora_d000_DAP
oracle 565 0.0 25.8286624259552 ? S Feb 01 8:17 ora_ckpt_DAP
oracle 559 0.0 25.9287080260200 ? S Feb 01 0:05 ora_pmon_DAP
oracle 561 0.0 25.8287096259600 ? S Feb 01 0:10 ora_dbw0_DAP
oracle 563 0.0 25.8286584259560 ? S Feb 01 0:33 ora_lgwr_DAP
oracle 567 0.0 25.9286464260944 ? S Feb 01 0:18 ora_smon_DAP
oracle 569 0.0 25.9286360260200 ? S Feb 01 0:04 ora_reco_DAP
oracle 571 0.0 26.3294232264344 ? S Feb 01 27:48 ora_s000_DAP
oracle 575 0.0 25.8286448259400 ? S Feb 01 0:01 ora_arc0_DAP
oracle 578 0.0 0.310752 2720 ? S Feb 01 1:09 /opt/oracle/app/or
oracle 1693 0.0 25.8286800259384 ? S Mar 05 0:00 oracleDAP (DESCRIP
animal<1281> ipcs -am
IPC status from <running system> as of Wed Mar 7 13:37:37 EST 2001
T ID KEY MODE OWNER GROUP CREATOR CGROUP NATTCH SEGSZ CPID LPID ATIME DTIME CTIME
Shared Memory:
m 0 0x500005de --rw-r--r-- root root root root 1 4 239 239 8:22:19 8:22:19 8:22:19
m 6916 0x6403b41f --rw-rw-rw- db2admin db2admin db2admin db2admin 0 16842752 19971 20105 14:44:49 14:46:15 13:31:55
168 Mb shared memory - not large!
Relational model
Entities (Objects) and Relationships
Normalised data
Maps directly into database tables (tools to do this)
A minimum code solution, but not always efficient
Database Objects
Tables
Store Data
Rows and Columns
Indexes
Two uses -
- Enforce business rules. Restrict rows via Unique indexes.
- Performance. Fast lookup of data.
Constraints
Check Constraints - check gender in (‘M’,’F’)
Foreign key constraints - check parent child relationships between tables are valid.
Views
A new way of looking at the data in tables.
No new data.
Can be used to simplify code, enforce security
Facade pattern!
Sequences
Triggers
When something is done at the table/view level. Nice for auditing.
- on Insert
- on Change
- on Delete
- others
SQL - PL/SQL
Stored Code
Procedures
Functions
Packages (aka classes)
Can be written in PL/SQL, Java
Advantages of co-locality with data
SQL
Structured Query Language - “Select * from dual”
Can be very powerful
Can be very complex
There is a huge discrepancy between different code that produces the same result. “His code runs in 2 seconds and mine in 2
days”!?
You WILL need to tune your code.
To write efficient SQL, you do need to know what your are doing, you need to know the structure and size of the data.
Many designs work well in development and UAT, but fail miserably in production.
PL/SQL
Procedural (3GL) code that knows about the database
- NULLS
- Cursors
- Named exceptions
Embed SQL in PL/SQL
Examples - Stored Procedure
procedure bv_p_load_stats(p_load_f ile in varchar2,
p_bills_loaded in number,
p_bills_rejected in number) is
x_load_no number := 1;
begin
/*
* Insert the load stats.
*/
loop
begin
insert into bv_load_stats (
LOAD_FILE,
LOAD_NO,
LOAD_DATE,
BILLS_LOADED,
BILLS_REJECTED
) values (
p_load_f ile,
x_load_no,
sysdate,
p_bills_loaded,
p_bills_rejected
);
commit;
return;
exception
when dup_val_on_index then
x_load_no := x_load_no + 1;
end;
end loop;
end;
Examples - View
create or replace view bv_v_bill_adj (
BILL_ID,
ITEM_NO,
ACCOUNT_ID,
SERVICE_ID,
DATE_ADJ,
DESCRIPTION,
COST,
CURRENCY_ID,
INVOICE_DATE)
as select
a.BILL_ID,
a.ITEM_NO,
a.ACCOUNT_ID,
a.SERVICE_ID,
a.DATE_ADJ,
b.DESCRIPTION,
a.COST,
a.CURRENCY_ID,
a.INVOICE_DATE
f rom BV_ADJ_TYPE b, BV_BILL_ADJ a
where a.adj_type_id = b.adj_type_id (+)
/
Examples - Access Point
SELECT uri, elem_name, elem_value FROM service_metadata s WHERE ( EXISTS ( SELECT 1 FROM shared_object_lookup sol, default_object_values dov WHERE dov.elem_name
= 'AGLS.Availability.postcode' AND ( ( BIGINT(dov.elem_value) >= 0200 AND BIGINT(dov.elem_value) <= 0299 ) OR ( BIGINT(dov.elem_value) >= 2600 AND BIGINT(dov.elem_value) <=
2619 ) OR ( BIGINT(dov.elem_value) >= 2900 AND BIGINT(dov.elem_value) <= 2920 ) ) AND dov.object_id = sol.object_id AND s.uri = sol.uri UNION SELECT 1 FROM specific_object_values
sov WHERE sov.elem_name = 'AGLS.Availability.postcode' AND ( ( BIGINT(sov.elem_value) >= 0200 AND BIGINT(sov.elem_value) <= 0299 ) OR ( BIGINT(sov.elem_value) >= 2600 AND
BIGINT(sov.elem_value) <= 2619 ) OR ( BIGINT(sov.elem_value) >= 2900 AND BIGINT(sov.elem_value) <= 2920 ) ) AND s.uri = sov.uri ) OR EXISTS ( SELECT 1 FROM
shared_object_lookup sol, default_object_values dov WHERE dov.elem_name = 'AGLS.Availability.postcode' AND ( ( BIGINT(dov.elem_value) >= 0800 AND BIGINT(dov.elem_value)
<= 0899 ) ) AND dov.object_id = sol.object_id AND s.uri = sol.uri UNION SELECT 1 FROM specific_object_values sov WHERE sov.elem_name = 'AGLS.Availability.postcode' AND ( (
BIGINT(sov.elem_value) >= 0800 AND BIGINT(sov.elem_value) <= 0899 ) ) AND s.uri = sov.uri ) OR EXISTS ( SELECT 1 FROM shared_object_lookup sol, default_object_values
dov WHERE dov.elem_name = 'AGLS.Availability.postcode' AND ( ( BIGINT(dov.elem_value) >= 1000 AND BIGINT(dov.elem_value) <= 2599 ) OR ( BIGINT(dov.elem_value) >= 2620
AND BIGINT(dov.elem_value) <= 2899 ) OR ( BIGINT(dov.elem_value) >= 2921 AND BIGINT(dov.elem_value) <= 2999 ) ) AND dov.object_id = sol.object_id AND s.uri = sol.uri UNION SELECT
1 FROM specific_object_values sov WHERE sov.elem_name = 'AGLS.Availability.postcode' AND ( ( BIGINT(sov.elem_value) >= 1000 AND BIGINT(sov.elem_value) <= 2599 ) OR (
BIGINT(sov.elem_value) >= 2620 AND BIGINT(sov.elem_value) <= 2899 ) OR ( BIGINT(sov.elem_value) >= 2921 AND BIGINT(sov.elem_v alue) <= 2999 ) ) AND s.uri = sov.uri ) OR EXISTS (
SELECT 1 FROM shared_object_lookup sol, default_object_values dov WHERE dov.elem_name = 'AGLS.Availability.postcode' AND ( ( BIGINT(dov.elem_value) >= 4000 AND
BIGINT(dov.elem_value) <= 4999 ) OR ( BIGINT(dov.elem_value) >= 9000 AND BIGINT(dov.elem_value) <= 9799 ) ) AND dov.object_id = sol.object_id AND s.uri = sol.uri UNION SELECT 1
FROM specific_object_values sov WHERE sov.elem_name = 'AGLS.Availability.postcode' AND ( ( BIGINT(sov.elem_value) >= 4000 AND BIGINT(sov.elem_value) <= 4999 ) OR (
BIGINT(sov.elem_value) >= 9000 AND BIGINT(sov.elem_value) <= 9799 ) ) AND s.uri = sov.uri ) OR EXISTS ( SELECT 1 FROM shared_object_lookup sol, default_object_values
dov WHERE dov.elem_name = 'AGLS.Availability.postcode' AND ( ( BIGINT(dov.elem_value) >= 5000 AND BIGINT(dov.elem_value) <= 5999 ) ) AND dov.object_id = sol.object_id
AND s.uri = sol.uri UNION SELECT 1 FROM specific_object_values sov WHERE sov.elem_name = 'AGLS.Availability.postcode' AND ( ( BIGINT(sov.elem_value) >= 5000 AND
BIGINT(sov.elem_value) <= 5999 ) ) AND s.uri = sov.uri ) OR EXISTS ( SELECT 1 FROM shared_object_lookup sol , default_object_values dov WHERE dov.elem_name =
'AGLS.Availability.postcode' AND ( ( BIGINT(dov.elem_value) >= 7000 AND BIGINT(dov.elem_value) <= 7999 ) ) AND dov.object_id = sol.object_id AND s.uri = sol.uri UNION SELECT 1
FROM specific_object_values sov WHERE sov.elem_name = 'AGLS.Availability.postcode' AND ( ( BIGINT(sov.elem_value) >= 7000 AND BIGINT(sov.elem_value) <= 7999 ) ) AND s.uri =
sov.uri ) OR EXISTS ( SELECT 1 FROM shared_object_lookup sol, default_object_values dov WHERE dov.elem_name = 'AGLS.Availability.postcode' AND ( (
BIGINT(dov.elem_value) >= 3000 AND BIGINT(dov.elem_value) <= 3999 ) OR ( BIGINT(dov.elem_value) >= 8000 AND BIGINT(dov.elem_value) <= 8999 ) ) AND dov.object_id = sol.object_id
AND s.uri = sol.uri UNION SELECT 1 FROM specific_object_values sov WHERE sov.elem_name = 'AGLS.Availability.postcode' AND ( ( BIGINT(sov.elem_value) >= 3000 AND
BIGINT(sov.elem_value) <= 3999 ) OR ( BIGINT(sov.elem_value) >= 8000 AND BIGINT(sov.elem_value) <= 8999 ) ) AND s.uri = sov.uri ) OR EXISTS ( SELECT 1 FROM
shared_object_lookup sol, default_object_values dov WHERE dov.elem_name = 'AGLS.Availability.postcode' AND ( ( BIGINT(dov.elem_value) >= 6000 AND BIGINT(dov.elem_value)
<= 6999 ) ) AND dov.object_id = sol.object_id AND s.uri = sol.uri UNION SELECT 1 FROM specific_object_values sov WHERE sov.elem_name = 'AGLS.Availability.postcode' AND ( (
BIGINT(sov.elem_value) >= 6000 AND BIGINT(sov.elem_value) <= 6999 ) ) AND s.uri = sov.uri ) OR EXISTS ( SELECT 1 FROM shared_object_lookup sol, default_object_values
dov WHERE dov.elem_name = 'AGLS.Availability.postcode' AND ( ( BIGINT(dov.elem_value) >= 0 AND BIGINT(dov.elem_value) <= 0 ) ) AND dov.object_id = sol.object_id AND s.uri
= sol.uri UNION SELECT 1 FROM specific_object_values sov WHERE sov.elem_name = 'AGLS.Availability.postcode' AND ( ( BIGINT(sov.elem_value) >= 0 AND BIGINT(sov.elem_value) <= 0 )
) AND s.uri = sov.uri ) ) AND ( (EXISTS (SELECT 1 FROM service_metadata s2 WHERE ((s2.elem_name = 'DC.Title' AND LOWER(s2.elem_value) LIKE '%health%' AND s.uri = s2.uri) or
(s2.elem_name = 'DC.Subject' AND LOWER(s2.elem_value) LIKE '%health%' AND s.uri = s2.uri) or (s2.elem_name = 'DC.Description' AND LOWER(s2.elem_value) LIKE '%health%' AND s.uri =
s2.uri) )) ) AND EXISTS (SELECT 1 FROM status s2 WHERE s2.status != 'deleted' and s2.uri = s.uri ) )AND (s.elem_name = 'DC.Ti tle' or s.elem_name = 'DC.Subject' or s.elem_name =
'DC.Description' or s.elem_name = 'DC.Identifier' or s.elem_name = 'DC.Type.category' or s.elem_name = 'AP.Indexes' ) ORDER BY s.uri
Golden Rule
KEEP IT SIMPLE IF AT ALL POSSIBLE!
Optomizers
Determine how the database engine runs a query
Rule Based - Traditional, uses a weighted list of rules as to how the resolve a query.
Cost Based - Uses statistics and weighting to determine how. Statistics must be gathered periodically.
Tuning
explain
tkprof
You MUST know the consequences of writing a query in different ways.
NO substitute for serious testing (or development if possible) on production level volumes.
This is not an OO environment, you cannot (generally) make more objects to improve performance. This strategy is almost
guaranteed to fail.
Query 1 - runs in 10 minutes. Query 2 - fails to run in 2 days and machine load average above 5.
Select a.col1 Select a.col1
from from
table1 a, table2 b table1 a
where a.uk = b.uk where exists (select 1 from table2 b
and ... where a.uk = b.uk)
and ...
Oracle Storage Hierarchy
Blocks typically 2K, 4K, 8K, 16K in size.
Table or index = an initial extent plus zero or more next extents.
Create table Statement with Storage
CREATE TABLE BV_LOAD_STATS
(LOAD_FILE VARCHAR2(30) NOT NULL
,LOAD_NO NUMBER NOT NULL
,LOAD_DATE DATE NOT NULL
,BILLS_LOADED NUMBER NOT NULL
,BILLS_REJECTED NUMBER NOT NULL
)
PCTFREE 5 PCTUSED 40 TABLESPACE MYDATA
STORAGE (INITIAL 50K NEXT 50K MAXEXTENTS 99 PCTINCREASE 0)
CACHE
/
Max table size = 50 + (99 * 50K) = 5000K
Deployment sizings will almost always be different to
development.
Create Scripts
A good Idea to create Tables, Indexes, Constraints separately.
Easier to manage
Guarentees of creation
Creation Order
Tables
Primary Keys/Indexes
Load data
Foreign Keys/Triggers
Sequences/Packages/Procedures/Functions
Views
Synonyms
Grants
What’s New
Java running database memory area
Stored procedure/Functions can be written in Java
EJB/Servlets/JSP/CORBA/WebServer in database
Extensible indexing - write your own
XML capabilities
Lots more.
Where can I learn more?
http://www.oracle.com
http://technet.oracle.com/doc/server815.htm
Oracle magazine - free!
http://www.oracle.com/oramag/index.html
Many books - O’Reilly are best
Your friendly DBA
Related docs
Other docs by ewghwehws
Control system for dynamoelectric machines with differentially excited fields
Views: 0 | Downloads: 0
Get documents about "