globals - AMIS Technology Blog

Download Report

Transcript globals - AMIS Technology Blog

Lucas Jellema (AMIS, The Netherlands)
THE VERY, VERY LATEST IN
ORACLE DATABASE DEVELOPMENT
Oracle Open World 2012, San Francisco
Public Expertezed Session – Thursday 29th November 2012
THE VERY VERY VERY LATEST…
<Secret Code>
TOM KYTE TO THE RESCUE…
THE DATABASE
IN MODERN ARCHITECTURES
Oracle Open World 2012, San Francisco
NO SQL
THE TOP-3 EARNING EMPLOYEES
• What can you say about the result of this query with
respect to the question: “Who are our top three
earning employees?”
A.
B.
C.
D.
Correct Answer
Sometimes correct
Correct if there are never duplicate salaries
Not Correct
IN-LINE VIEWS
TOP-N QUERIES IN 12C
• Last part of a query to be evaluated – to fetch only
selected rows from the result set:
select *
from
emp
order
by
sal desc
FETCH FIRST 3 ROWS ONLY;
– To select the next set of rows:
select
from
order
by
OFFSET
*
emp
sal desc
3 FETCH NEXT 4 ROWS ONLY;
TOP-N% QUERYING
• To query for a percentage of the result set (rather than
an absolute number of rows)
select *
from
emp
order
by
sal desc
FETCH FIRST 30 PERCENT ROWS ONLY;
• And the next batch
select *
from
emp
order
by
sal desc
OFFSET (0.3*(select count(*) from emp)) ROWS
FETCH NEXT (0.3*(select count(*) from emp))
ROWS ONLY;
BOTTOM-N QUERY IN 12C
• Return only the last three rows in the ordered result
set (in the proper order)
select *
from
emp
order
by
sal desc
OFFSET ((select count(*) from emp)-3)
ROWS
FETCH NEXT 3 ROWS ONLY
– or:
select *
from
( select *
from
emp
order
by
sal asc
FETCH FIRST 3 ROWS ONLY
)
order by sal desc;
IN-LINE PL/SQL FUNCTIONS AND
PROCEDURES
• Procedures are also allowed in-line
• In-Line Functions and Procedures can invoke each
other
WITH
procedure increment( operand in out number
, incsize in number)
is
begin
operand:= operand + incsize;
end;
FUNCTION inc(value number) RETURN number IS
l_value number(10):= value;
BEGIN
increment(l_value, 100);
RETURN l_value;
end;
SELECT inc(sal)
from
emp
SPECIAL ‘BUSINESS RULE’: DEFAULT VALUE
• The default values is the value that should be inserted
for a column when the client has ignored the column
– not provided a value nor indicated NULL
• The default value is applied prior to the execution of
the Before Row trigger
– So :new.<column_value> has the value that will be
inserted
– The Before Row trigger has no built in way to telling
whether the value was provided by the client or
supplied as default by the database
• Default value is typically used for auditing purposes
– Note: default values for columns exposed in UI should
be set in the client
COLUMN DEFAULT
• Columns can have default values
– Static or literals
– SQL expressions evaluating to a static
– Pseudo-columns like USER and CURRENT_DATE
• DO NOT USE SYSDATE! DO NOT USE USER!
– References to Application Context parameters
• sys_context(‘USERENV’, ‘IP_ADDRESS’)..
– Some funny value to let the before row trigger know
that the real (complex) default must be calculated
create table citizens
( name
varchar2(100) default 'John Doe'
, birthdate date
default current_date - 1
, city
varchar2(50) default
sys_context('KANE_CTX', 'DEFAULT_CITY' )
, zipcode
varchar2(8)
default 'XYXYXYXYXQQ'
)
NEW OPTIONS WITH DEFAULT VALUE
alter table emp
modify (sal number(10,2)
DEFAULT ON NULL 1000
)
alter table emp
modify (empno number(5) NOT NULL
DEFAULT ON NULL EMPNO_SEQ.NEXTVAL
)
create table emp
( empno NUMBER GENERATED BY DEFAULT AS IDENTITY
(START WITH 100 INCREMENT BY 10)
, ...
)
APPLICATION CONTEXT
• Memory area that enables application developers to
define, set, and access key/value pairs
Application
• Rapid access in SQL and PL/SQL
Context
Attribute
Attribute
Value
Value
Attribute Value
Pairs
select sys_context('USERENV', 'SESSION_USER')
from
dual
l_user:= sys_context('USERENV', 'SESSION_USER')
• Two Application Contexts
are always around:
– CLIENTCONTEXT and USERENV
APPLICATION CONTEXT APPEARANCES
• Per session (default)
– Stored in UGA, just like package state
• Globally Accessible (shared across all sessions)
– Stored in SGA
• Associated with a Client Identifier
– Attributes in a Globally Accessible Application Context
can explicitly be tied to the Client Identifier
– And are only accessible to sessions with that Client
Identifier
TYPICAL WEB ARCHITECTURE USING
CONNECTION POOL
JDBC Connection Pool
Session 1
Package A
globals
Session 2
Package B
Session 3
Package C
Session 4
PACKAGE STATE IS TIED TO DATABASE
SESSION
JDBC Connection Pool
Session 1
Session 2
Session 3
globals
Package A
globals
Package B
Package C
Session 4
PACKAGE STATE IS TIED TO DATABASE
SESSION – NOT WEB SESSION
JDBC Connection Pool
Session 1
Session 2
Session 3
globals
Package A
globals
Package B
Package C
Session 4
APPLICATION CONTEXT TO RETAIN
STATE FOR LIGHT WEIGHT END USERS
JDBC Connection Pool
Session 1
Package A
globals
Session 2
Session 3
globals
?
Package B
Package C
Session 4
APPLICATION CONTEXT TO RETAIN
STATE FOR LIGHT WEIGHT END USERS
JDBC Connection Pool
Session 1
Session 2
Session 3
USERENV
Package A
globals
USERENV
Global Context
globals
globals
Session 4
Package C
APPLICATION CONTEXT TO RETAIN
STATE FOR LIGHT WEIGHT END USERS
JDBC Connection Pool
Session 1
USERENV
Package A
globals
Session 2
Session 3
USERENV
USERENV
Global Context
globals
globals
Session 4
Package C
PACKAGE GLOBALS: THE STATE OF THE
PACKAGE IN A SESSION
• This state is lost when the package is recompiled
– That is undesirable in a highly available environment
Package
PACKAGE GLOBALS CAN BE REPLACED BY
APPLICATION CONTEXT
• The Application Context is untouched by
recompilation of the package
– All ‘globals’ in the application context retain their values
Package
Application Context
EBR TO KILL PLANNED DOWNTIME
(BECAUSE OF APPLICATION UPGRADE)
Application X
VERSION 1
Application X
VERSION 2
TIME TRAVELLING
FLASHBACK
•
•
•
•
Introduced in 9i
Based on UNDO
Initially only for recovery
As of 11g – Total Recall option with
Flashback Data Archive
– Controlled history keeping
• Look back into history
– Query trends (version history)
– Difference reporting
– Audit trails (Replace journaling tables)
• Require trick for transaction history: WHO?
• Also: when is the start of history?
OOW 2012 SESSION COMES TO THE
RESCUE
• CON8511 - Temporal Database Capabilities with the
Latest Generation of Database Technology
TOTAL RECALL - FLASHBACK DATA
ARCHIVE IMPROVEMENTS
• Complete schema evolution support: all table
definition, partitioning, and space management DDLs
are supported on FDA-enabled tables.
• The metadata information for tracking transactions
including the user context is now tracked.
– This could mean that journaling tables are now officially
deprecated
• And the current contents of journaling tables can even be
migrated to Flashback Data Archive
• Introduction of SQL 2011 Valid Time Temporal
Modeling
TOTAL RECALL
• Import and export of history
– Support for import and export using Data Pump for
FDA-enabled tables. Data Pump can now be used to
export and import an FDA-enabled base table along
with its schema-evolution metadata and historical row
versions.
• Construct and manipulate the Flashback Data Archive
– import user-generated history
• Restore points: Support for the use of named restore
points in AS OF and versions queries has been added.
• Total Recall will (in all likelihood) be part of every
edition of the database – including SE
VALID TIME TEMPORAL MODELING
• Validity (or effectivity) of facts recorded in a database
is frequently specified through dates or timestamps
– For example begin date and [derived] end date of a
price, membership, allocation, certificate, agreement
• This valid time can differ from the transaction time at
which a record is entered into the database
• Multiple entries with different, non-overlapping validtime periods can exist for a single entity
• In 12c the notion of Valid Time is introduced into the
Oracle Database
– The valid-time dimension consists of two date-time
columns specified in the table definition (create or alter)
– These Valid Time columns specify the period during
which a record is valid
– A table can have multiple valid_time markers
CREATING A TABLE WITH VALID TIME
DIMENSION
• Table with explicit valid time columns:
CREATE TABLE EMP
( employee_number NUMBER
, salary NUMBER
, department_id NUMBER
, name VARCHAR2(30)
, hiredate TIMESTAMP
, firedate TIMESTAMP
, PERIOD FOR user_time (hiredate, firedate)
);
• Table with valid time dimension and implicit columns:
CREATE TABLE EMP
( employee_number NUMBER
, salary NUMBER
, department_id NUMBER
, name VARCHAR2(30)
, PERIOD FOR contract_time
);
columns valid_time_start and valid_time_end
(TIMESTAMP) are added implicitly
VALID TIME AWARE FLASHBACK QUERIES
• Select all employees who were employed at a certain
moment in time
SELECT *
FROM
EMP AS OF PERIOD FOR user_time
TO_TIMESTAMP('01-JUN-2012 12.00.01 PM')
• Perform all queries for records that are valid at a
certain point in time
EXECUTE DBMS_FLASHBACK_ARCHIVE.enable_at_valid_time
( 'ASOF'
, TO_TIMESTAMP('29-JUL-12 12.00.01 PM')
);
• Return all records currently (session time) valid
EXECUTE DBMS_FLASHBACK_ARCHIVE.enable_at_valid_time('CURRENT');
• Return all records (default)
EXECUTE DBMS_FLASHBACK_ARCHIVE.enable_at_valid_time('ALL');
DATABASE IN MODERN ARCHITECTURE
WS
Mobile
Business Tier
Enterprise
Service Bus
Cache/Grid
(L1, L2, L3)
Services
Database
Database
Standard
Application
s
Legacy
Application
s
MULTI TIER ARCHITECTURE
WS
Mobile
Business Tier
Enterprise
Service Bus
HTTP REST
HTTP SOAP
FTP/WEBDAV
JDBC
JPA (H/EL)
Services
Monitor,
Trace, Audit
Database
Authentication &
Fine Grained
Authorization
Cache/Grid
(L1, L2, L3)
DB QRCN
HTTP
JMX, JMX
Stored
Procedures
Encapsulation
Decoupling
Caching
Business Logic
APPLICATION ARCHITECTURE:
DRIVE APPLICATION FROM META DATA
• Agility
• Design Time at Run Time
• Define part of the application behavior and appearance
through meta-data (outside the base source code)
– The default settings are defined by developers and
deployed along with the application
– Read and interpreted at run time
– Manipulated and re-read
and re-interpreted at run time
Application
• Note: very similar to the way
the database operates:
– Data Dictionary is the
meta-data driving the
meta
behavior of the database
SEPARATE
BASE DATA AND CUSTOMIZED DATA
• If a value is changed during site-level implementation
– Or run time customization
• It should be kept apart from the base ‘meta-data’
– To prevent overwriting customized data when the new
release arrives
– To allow for (temporarily) reverting to base data
• A simple solution: the Complex View with two
underlying tables approach
– Note: Select…
For Update Of
ORIGINAL_NAME
is not allowed
IO trg
Customized
Values
New release
BaseValues
REPLACE THE ORIGINAL SINGLE TABLE
WITH A TWO-TABLE BASE/CUSTOM SPLIT
• rename <original> to <base>
• create table <customizations>
as
select * from base where rownum = 0
• create or replace view <original>
as
select * from <customizations>
union all
select * from <base> b
left outer join
<customizations> c
on (b.id = c.id)
where c.rowid is null
REPLACE THE ORIGINAL SINGLE TABLE
WITH A TWO-TABLE BASE/CUSTOM SPLIT (2)
•
create or replace trigger handle_insert_trg
instead of insert on original
for each row
begin
insert into <customizations> (col, col2,…)
values(:new.col, :new.col2,…);
end;
•
create or replace trigger handle_update_trg
instead of update on original
for each row
begin
update <customizations>
set col = :new.col, …
where id = :new.id ;
if sql%rowcount = 0
then
insert into <customizations> (id, col, col2,…)
(select id, :new.col, :new.col2 from base where id = :new.id);
end if;
end;
VERY SIMILAR TO THE ARCHITECTURE OF
PLUGGABLE DATABASES
New release of
Oracle Database
ROOT
PDB
APPLICATION ARCHITECTURE: NO SQL
• NO SQL
– Complex SQL is
hidden away inside
the database
– Cache to not have
to query all the time
from the database
– … and to not take
the overhead of a
commit for not so
important data
NO
– Process first – in
memory, on
middle tier
(BigData and CEP) and only persist
what is useful
Web Browser
SQL
JEE Application Server
RDBMS
SQL
QUERY RESULT CHANGE NOTIFICATION
• Continuous Query Notification:
– Send an event when the result set for a query changes
– Background process calls PL/SQL Handler or Java
Listener or OCI client when the
Java
commit has occurred
Listener
– Event contains rowid
of changed rows
• Used for:
– Refreshing specific
data caches (middle
tier, global context)
– (custom) Replication
PL/SQL
CONTINUOUS PROCESSING OF DATA
STREAMS USING CQL
• Aggregation, Spot deviation, Match on complex
patterns
WHO IS AFRAID OF RED, YELLOW AND BLUE
• Table Events
– Column Seq number(5)
– Column Payload varchar2(200)
SOLUTION USING LEAD
• With LEAD it is easy to compare a row with its
successor(s)
– As long as the pattern is fixed, LEAD will suffice
with look_ahead_events as
( SELECT e.*
,
lead(payload) over (order by seq) next_color
,
lead(payload,2) over (order by seq) second_next_color
FROM
events e
)
select seq
from
look_ahead_events
where
payload ='red'
and
next_color ='yellow'
and
second_next_color='blue'
FIND THE PATTERN RED, YELLOW AND
BLUE
• Using the new 12c Match Recognize operator for
finding patterns in relational data
SELECT *
FROM
events
MATCH_RECOGNIZE
(
ORDER BY seq
MEASURES RED.seq AS redseq
,
MATCH_NUMBER() AS match_num
ALL ROWS PER MATCH
PATTERN (RED YELLOW BLUE)
DEFINE
RED AS RED.payload ='red',
YELLOW AS YELLOW.payload ='yellow',
BLUE AS BLUE.payload ='blue'
) MR
ORDER
BY
MR.redseq
,
MR.seq;
MATCH_RECOGNIZE FOR FINDING
PATTERNS IN RELATIONAL DATA
• The expression MATCH_RECOGNIZE provides native
SQL support to find patterns in sequences of rows
Table
Source &
Where
Match_
Recognize
Process
and Filter
Select &
Order By
• Match_recognize returns Measures for selected
(pattern matched) rows
– Similar to MODEL clause
• Match Conditions are expressed in columns from the
Table Source, aggregate functions and pattern
functions FIRST, PREV, NEXT, LAST
• Patterns are regular expressions using match
conditions to express a special sequence of rows
satisfying the conditions
DID WE EVER CONSECUTIVELY HIRE THREE
EMPLOYEES IN THE SAME JOB?
• Find a string of three subsequent hires where each
hire has the same job
• Order by hiredate, pattern is two records that each
have the same job as their predecessor
SELECT *
FROM
EMP
MATCH_RECOGNIZE
(
ORDER BY hiredate
MEASURES SAME_JOB.hiredate AS hireday
,
MATCH_NUMBER() AS match_num
ALL ROWS PER MATCH
PATTERN (SAME_JOB{3})
DEFINE
SAME_JOB AS SAME_JOB.job = FIRST(SAME_JOB.job)
) MR
THE SHOPPING ALGORITHM
THE SHOPPING ALGORITHM
•
shopForItem Item ( String itemName) {
driveToShop;
Item item = buyItemAtShop ( itemName);
driveHomeFromShop;
return item;
}
GET THIS WEEK’S GROCERIES
getGroceries Item[] ( String[] shoppingList) {
Item[] items = new Item[ shoppingList.length];
for (int i=0; i < shoppingList.length; i++) {
items[i] = shopForItem (shoppingList[i]);
}
return items;
}
PENSION FUND – SEPTEMBER 2012
Employer
Participants
Job & Benefits
<
>
FETCHING THE DATA OF THE PENSION
FUND FOR THE WEB APPLICATION
<
>
select *
from
employers
where id = < 324>
1 record
100s records
select *
from
participants
where employer_id = < 324>
10s records
select *
from
benefits
where participant_id = <#>
REPORTING ON MANY EMPLOYERS
select *
from
employers
100s records
1 query
10k records
select *
100s queries
from
participants
where employer_id = <#>
100k records
select *
from
benefits
10k queries
where participant_id = <#>
APPLICATION ARCHITECTURE –
BULK RETRIEVE
• Have the database bulk up the data retrieval
• Return Ref Cursor, Types and Collections or
JSON/XML
Benefits Package
select *
from
employers
where id in <some set> select *
from
participants
where employer_id in <some set>
select b.*
from
benefits b join participants p
on (p.id = b.participant_id)
where p.employer_id in <some set>
APPLICATION ARCHITECTURE –
SERVICE ENABLING
WebLogic Server
Database
Native DB
WebService
HTTP
EPG
Java/JEE
PL/SQL
package
SOA Suite
JDBC
AQ
View
Oracle
Service Bus
Other
(Email, FTP/File,
XMPP/Chat)
XML
DB
Chat/IM XMPP
Server File/FTP Server
Email Server
Table
XML/JSON
Relational/Oracle Type
JEE Server
Database
11g Native DB
WebService
HTTP
10g
EPG
http
Java App
SDO
WS
Oracle
Service
Bus
DB
Adapters
SOA
Suite
ADF BC
/SDO WS
XML
XML & XSD
JAX-WS
JPublisher
WS
Ref Cursor
JDBC
AQ
8i
AQ
JMS
JMS Queue
JMS
EJB
File
FTP
JSON/ CSV
EJB/JPA
Pojo
UMS
Other
(Email, FTP/File,
XMPP/Chat)
Chat/IM XMPP
Server
File/FTP Server
Email Server
XML
PL/SQL
package
Types & Coll
Types
utl_file,
BFILE,
URITYPE
9i XML
DB
View
Table
BUSINESS RULES
• Data Oriented Rules or Data Constraints
• Declarative support in database
– For referential integrity
• Order must be for a Customer
– For attribute and tuple rules
• Salary must be numeric,
• Hiredate may not be in the future,
• End date must come after begin date
• No declarative support for complex data rules – across
multiple records and tables
– A department in France may not have less then 20%
female employees
– Order items of type weapon may not be part of an
order that ships around Christmas
BUSINESS RULES –
WHERE AND HOW TO IMPLEMENT
• Criteria:
– Safe
– Well performant
– Reusable and maintainable
– Productive to implement
• Options
– Client side
• JavaScript
– Middle-tier
• Java, Enterprise Service Bus
– Database
• Constraints and triggers are statement level – i/o
transaction level
RDBMS NOT ALWAYS EXCLUSIVELY
ACCESSED THROUGH ONE LAYER
SOA, ESB,
WebServices
Batch Bulk
Processes
Standard
Applications
Database
Data Replication &
Synchronization
Legacy
Applications
11G VIRTUAL COLUMNS
• Add columns to a table based on an
expression
– Using ‘real’ columns, SQL Function and User Defined
Functions
– No data is stored for Virtual
Columns, only meta-data
VIRTUAL
– Virtual Columns can be
indexed
alter table emp
ADD
(income AS (sal + nvl(comm,0)))
UNIQUENESS RULES
USING VIRTUAL COLUMNS
• Business Rule:
– Not more than one manager per department
alter table emp
add constraint only_one_mgr_in_dept_uk
unique (one_mgr_flag)
alter table emp
ADD
( one_mgr_flag as
( case when job ='MANAGER'
then deptno
end
)
)
CHALLENGE: ORDERS BELONG TO A
CUSTOMER IN ONE OF TWO TABLES
• The Orders table contains Order records for
customers – either Dutch or Australian customers
• These customers are stored in two different tables
• Can we implement referential integrity to ensure that
the order’s customer exists?
OZ_CUSTOMER
ORDER
Country
Customer_Id
….
?
Id
Name
DUTCH_CUSTOMER
Id
Name
USING VIRTUAL COLUMNS
IN FOREIGN KEY RELATIONS
• A foreign key can be created on a Virtual Column
– That means for example we can have a single column
with some id
– And two virtual columns with CASE expressions that
produce NULL or the ID value
– With Foreign Keys on the Virtual Columns
ORDER
Country
Customer_Id
Dutch_id (VC)
Australian_id (VC)
OZ_CUSTOMER
Id
Name
DUTCH_CUSTOMER
Id
Name
USING VIRTUAL COLUMNS
IN FOREIGN KEY RELATIONS
alter table orders
add (australian_ctr_id as
(case country
when 'OZ'
then customer_id
end))
ORDER
Country
Customer_Id
Dutch_id (VC)
Australian_id (VC)
alter table orders
add (dutch_ctr_id as
(case country
when 'NL'
then customer_id
end))
alter table orders
add constraint odr_ocr_fk
foreign key (australian_ctr_id)
references oz_customer (id)
OZ_CUSTOMER
Id
Name
DUTCH_CUSTOMER
Id
Name
alter table orders
add constraint odr_dcr_fk
foreign key (dutch_ctr_id)
references dutch_customer
(id)
FOREIGN KEY SHOULD ONLY REFER TO
CERTAIN RECORDS USING VC
• Foreign Key can reference a UK based on a Virtual
Column
• That allows a ‘conditional foreign key’ or a foreign key
that can only reference specific records in the
referenced table
– Only refer to Women in the PEOPLE table for the
Mother Foreign Key
– Only refer to Values in the Domain Values table for the
Domain Name == ‘COLORS’
RESTRICTED FOREIGN KEYS USING
VIRTUAL COLUMNS
alter table domain_values
add (color_value as
(case domain_name
when 'COLORS'
then domain_value
end))
CARS
ID
Make
Type
Color
Year
alter table domain_values
add (country_value
as
alter
table domain_values
(case domain_name
add (country_value
as
whendomain_name
'COUNTRIES'
(case
then'COUNTRIES'
domain_value
when
end))
then
domain_value
end))
DOMAIN_VALUES
Id
Domain_Name
Domain_Value
Color_Value
Gender_Value
OrderStatus_Value
Country_Value
ShipmentMethod_Value
alter table cars
add constraint car_clr_fk
foreign key (color)
references domain_values
(color_value)
LACK OF WATERTIGHTNESS
IN TRIGGER BASED RULE VALIDATOIN
VALIDATION
•
Statement time validation means:
DML in different session
DML
validation
•
•
•
More DML
Commit
validation
To prevent leakage we should validate at commit time
– Logically correct as transaction is the logical unit
– Effects from other sessions between statement and
commit are taken into account
However: Oracle unfortunately does not provide us with
a pre-commit or on-commit trigger
Workarounds:
– Dummy Table with Materialized View On Commit Refresh
and Trigger on Materialized View
– Do a soft-commit by calling a package to do the actual
commit – that will first do transaction level checks
• Supported by a deferred check constraint that is violated by
each operation that potentially violates a business rule
SAFE SOLUTION: USE CUSTOM LOCKS
• Prior to validating a certain business rule for a specific
record – acquire a custom lock
– That identifies both Rule and Record
– Using dbms_lock
DML in different session
DML
validation
More DML
Commit
validation
• When a record is being validated for a certain rule,
other sessions have to wait
• The commit (or rollback) releases all locks
• Validation in a different session will include all
committed data
SUMMARY
•
•
•
•
•
•
•
•
•
Inline Views
Defaulting
Application Context
Flashback and the time dimension
NoSQL means smart SQL
– Cache refresh driven by change notification
– Streaming analysis before persisting
Decoupling galore
– Bulk retrieval
– Service enabling
Business Rules
EBR
12c promises even more