SlideShare ist ein Scribd-Unternehmen logo
1 von 83
Downloaden Sie, um offline zu lesen
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Safe	Harbor	Statement
The	following	is	intended	to	outline	our	general	product	direction.	It	is	intended	for	
information	purposes	only,	and	may	not	be	incorporated	into	any	contract.	It	is	not	a	
commitment	to	deliver	any	material,	code,	or	functionality,	and	should	not	be	relied	upon	
in	making	purchasing	decisions.	The	development,	release,	and	timing	of	any	features	or	
functionality	described	for	Oracle’s	products	remains	at	the	sole	discretion	of	Oracle.
2
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Real-World	Performance	2016
Oracle	Real-World	Performance	Team
Oracle	Server	Technologies
Christine	Qu
Sidney	Chen
10/25/17
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Introductions
• 12	Years	at	Oracle
• Learn	to	analysis	from	top	down,	make	sure	you	are	on	the	right	direction
• Be	open	and	positive,	aim	high
曲卓 (Christine	Qu)
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Introductions
• 4 Years	at	Oracle, 9 years with Oracle
• Collaborate	with	customers and solve performance issues
• Teach real-world performance
陈焕生 (Sidney Chen)
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Real-World	Performance	2016
• Part	of	the	Database	Development	Organization
• Global	Team	located	in	USA,	Europe,	Asia
• 400+	combined	years	of	Oracle	database	experience	
• http://www.oracle.com/goto/oll/rwp
Who	We	Are
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
RWP中国团队
• 陈焕生(Sidney)
• 董志平(Cary)
• 邱翔虎(Calvin)
• 曲卓(Christine)
• 宋昱颖(Yui)
• 谭圣川(Tyler)
• 徐江(Jiang)
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Bridging	the	Divide	from	Today’s	Performance	to	What	is	Possible	
What	is	Real-World	Performance	in	2016?
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Where	database	user	look	for	
performance	improvements
Perception
Application	
Algorithmns	
and	Correct	
Product	Usage
Database	
Platform
The	best	place	to	look	for	
performance	Improvements
10/25/17
The	Real	World	Performance	Perception	Problem
Reality
Application	
Algorithmns	
and	Correct	
Product	Usage
Database	
Platform
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Parsing	Demo
Cursors	and	Connections
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Bad	Performance	with	Logons
Parsing	Demo
Poor	response	time
Low	transaction	rate
Cannot	make	the	
system	busy
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Connection	Pools	and	Hard	Parse
Parsing	Demo
Switch	to	connection	
pool.	Response	time	
improve	dramatically Increase	throughput
Better	utilization,	but	
new	wait	event
More	CPU	usage
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Bind	Variables	and	Soft	Parse
Parsing	Demo
Row	cache	waits	gone
10x	better	response	
time
10x	better	throughput
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Shared	Cursors	and	One	Parse
Parsing	Demo
Additional	30%	
performance
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Incorrect	Use	of	Sessions	and	Cursors
Parsing	Demo
0
20
40
60
80
100
120
140
160
Logon/Transaction Hard Parse Soft Parse No Parse
Transaction Rate x 1000 Response time(ms)
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Parsing	Demo
• Both	the	development	and	DBA	teams	are	confused.		
– Performance	in	the	development	and	test	systems	is	as	anticipated
– Performance	in	production	is	nowhere	near	level	of	test	system
– DBAs	see	shared	pool	contention	but	developers	have	coded	diligently	to	ensure	no	
parsing
– Development	has	confirmed	the	same	code	is	running	in	both	test	and	production
Observations
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Performance	Data
Invalid	SQL
Performance	significantly	
reduced	on	production	as	
compared	to	development	
and	test
Contention	in	the	
shared	pool
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Invalid	SQL
• A	page	refresh	trigger	attempts	to	set	a	session-level	initialization	
parameter	to	enable	a	diagnostic	patch	that	is	not	installed	in	production
– This	results	in	a	failed	parse
• All	users	are	frequently	attempting	to	parse	the	same	SQL,	sessions	
serialize	within	the	shared	pool
• How	to	find	invalid	SQL:
– Look	for	parse	count	failures	from	v$sysstat
– Check	session	traces	for	error	messages
– Look	for	SQL*Net	Break/Reset
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Set	Based	
Processing
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Data	Processing	Techniques
• Set	based	processing
– Process	data	in	groups	or	sets	of	rows
– Use	SQL	to	define	the	results
– Database	processes	the	data	efficiently	in	sets
• No	movement	of	data	over	the	network
• Hash	joins
• Parallel	Query	and	DML
• CPU	and	IO	capabilities	exploited	with	Engineered	Systems
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Set	based	processing
Data	Processing	Techniques
insert /*+ append */ into west
select *
from emp
where deptno = 20;
commit;
insert /*+ append */ into east
select *
from emp
where deptno != 20;
commit;
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Multiple	ways	to	get	the	same	result
Data	Processing	Techniques
insert /*+ append */ first
when deptno = 20 then
into west values …
else
into east values …
select *
from emp;
commit;
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Set	based	processing
• Use	SQL	to	define	the	results
• Let	the	DB	figure	out	how	to	do	it
– Some	SQL	operations:
• create	table	as	select
• insert	/*+	append	*/	select
• intersect
• minus
• exists
• not	exists
• window	functions
• multi-table	inserts
• outer	joins
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
ETL	DML	Challenges
• The	performance	gains	are	often	2-3	orders	of	magnitude
• The	challenge	is	re-writing	code	to	exploit	these	techniques
– Often	emotional	rather	than	technical
• There	is	an	OLTP	vs	DW	culture
Real	World	Debate
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Set	Programming:
Loading
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
The	Example	Code
• PL/SQL	is	a	great	way	to	submit	SQL	to	the	database
– Many	features	for	managing	the	execution	of	SQL
– Eliminates	network	overheads
– Optimizes	commit	time
• All	the	examples	use	PL/SQL
• When	the	sample	code	runs	slowly,	all	the	time	is	in	SQL
– The	application	algorithm	is	sub-optimal	and	NOT
• PL/SQL
• SQL
Why	PL/SQL?
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
The	Example	Code
• The	example	code	demonstrates	the	different	techniques
• The	example	code	is	not	intended	to	be	best	practice!
– No	exception	handling
– No	restart	capability
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Code	Conventions
Table	Alias Usage
s Source	table
d Destination	table
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Code	Conventions
Variable	Name Usage
a Associative	array	(formerly	index-by	table)	for	rows	read	from	or	written	to	the	database
c Cursor	for	rows	read	from	the	database
i Generic	loop	index
r Record	for	row	read	from	or	written	to	the	database
t Type	definition	for	an	associative	array	(formerly	index-by	table),	usually	based	on	a	source	
table
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Loading	using	Row-by-Row	Method
declare
cursor c is select s.* from ext_scan_events s;
r c%rowtype;
begin
open c;
loop
fetch c into r;
exit when c%notfound;
insert into stage1_scan_events d values r;
commit;
end loop;
close c;
end;
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Loading	using	Array	Method
declare
cursor c is select * from ext_scan_events;
type t is table of c%rowtype index by binary_integer;
a t;
rows binary_integer := 0;
begin
open c;
loop
fetch c bulk collect into a limit array_size;
exit when a.count = 0;
forall i in 1..a.count
insert into stage1_scan_events d values a(i);
commit;
end loop;
close c;
end;
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Loading	using	Home-grown	Method
declare
sqlstmt varchar2(1024) := q'[
-- BEGIN embedded anonymous block
cursor c is select
s.*
from
ext_scan_events_${thr} s;
type t is table of c%rowtype
index by binary_integer;
a t;
rows binary_integer := 0;
begin
for r in (select
ext_file_name
from
ext_scan_events_dets
where ora_hash(file_seq_nbr,${thrs}) = ${thr})
loop
...
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Loading	using	Home-grown	Method...
loop
execute immediate
'alter table ext_scan_events_${thr} location ' ||
'(' || r.ext_file_name || ')';
open c;
loop
fetch c bulk collect into a limit ${array_size};
exit when a.count = 0;
forall i in 1..a.count
insert into stage1_scan_events d values a(i);
commit;
end loop;
close c;
end loop;
end;
-- END embedded anonymous block
]';
...
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Loading	using	Home-grown	Method
...
begin
sqlstmt := replace(sqlstmt,'${array_size}'
,to_char(array_size));
sqlstmt := replace(sqlstmt,'${thr}',thr);
sqlstmt := replace(sqlstmt,'${thrs}',thrs);
execute immediate sqlstmt;
end;
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Loading	using	Set-based	Method
alter session enable parallel dml;
insert /*+ APPEND */ into
stage1_scan_events d
select
s.*
from
ext_scan_events s;
commit;
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Loading
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Loading
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Loading
• Load	time	in	seconds	
for	100M	raw	scan	
events	in	external	files
– Array	size	100
– Jobs	32
– Degree	of	Parallelism	
32
29
126
1102
17028
0 2000 4000 6000 8000 10000 12000 14000 16000 18000
Set
Home-grown
Array
Row-by-Row
Load Time
Load Time
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
5931 91666
802728
3482632
0
500000
1000000
1500000
2000000
2500000
3000000
3500000
4000000
Row-by-Row Array Home-grown Set
Load Rate
Load Rate
Load	rate	in	rows	per	second	
for	100M	raw	scan	events	in	
external	files
Array	size	100
Jobs	32
Degree	of	Parallelism	32
Loading
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Set	Programming:
De-duplicating
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
De-duplicating	using	Row-by-Row	Method
declare
cursor c is select
s.*
,cast(null as number(10)) as error_ind
,rowid as rid
from
stage1_scan_events_ref s;
r c%rowtype;
dups number;
begin
open c;
loop
fetch c into r;
exit when c%notfound;
...
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
De-duplicating	using	Row-by-Row	Method
...
select
count(*)
into
dups
from
stage1_scan_events_ref s
where s.loc_code = r.loc_code
and s.rtl_trx_seq_nbr = r.rtl_trx_seq_nbr
and s.trx_line_item_seq_nbr = r.trx_line_item_seq_nbr
and ( s.file_seq_nbr > r.file_seq_nbr
or ( s.file_seq_nbr = r.file_seq_nbr
and s.rowid < r.rid
)
);
...
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
De-duplicating	using	Row-by-Row	Method
...
if dups = 0
then
insert into stage2_scan_events d values (r ...);
else
r.error_ind := 1;
insert into stage1_scan_events_err d values r;
end if;
commit;
end loop;
close c;
end;
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
De-duplicating	using	Array	Method
loop
fetch c bulk collect into a limit array_size;
exit when a.count = 0;
a_count := a.count;
for i in 1..a_count
loop
select
...
if dups = 0
then
null;
else
a(i).error_ind := 1;
insert into stage1_scan_events_err d values a(i);
a.delete(i);
end if;
end loop;
forall i in indices of a
insert into stage2_scan_events d values (a(i) ... );
commit;
end loop;
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
De-duplicating	using	Threaded	Method
cursor c is select
s.*
,cast(null as number(10)) as error_ind
,rowid as rid
from
stage1_scan_events_ref s
where ora_hash(loc_code,threads) = thread;
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
De-duplicating	using	Set-based	Method
alter session enable parallel dml;
insert /*+ APPEND */ first
when error_ind = 1 then into
stage2_scan_events
values ( ... )
else into
stage1_scan_events_err
select
s.*
,row_number() over (
partition by
loc_code,rtl_trx_seq_nbr,trx_line_item_seq_nbr
order by
file_seq_nbr desc,rowid
) as error_ind
,rowid as rid
from
stage1_scan_events_ref s;
commit;
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
De-duplicating
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
De-duplicating
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
De-duplicating
De-duplicate	time	in	
seconds	for	100M	
loaded	scan	events
– Array	size	100
– Jobs	32
– Degree	of	Parallelism	32
24
264
5404
20369
0 5000 10000 15000 20000 25000
Set
Home-grown
Array
Row-by-Row
De-duplicate Time
De-duplicate Time
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
De-duplicating
De-duplicate	rate	in	
rows	per	second	for	
100M	loaded	scan	
events
– Array	size	100
– Jobs	32
– Degree	of	Parallelism	32
4958
18688
383189
420180
0
50000
100000
150000
200000
250000
300000
350000
400000
450000
Row-by-Row Array Home-grown Set
De-duplicate Rate
De-duplicate Rate
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Set	Programming:	
Transformation
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Transforming	using	Row-by-Row	Method
declare
cursor c is select
s.*
,cast(null as number(10)) as error_ind
from
stage2_scan_events_ref s;
r c%rowtype;
dk dim_day.day_key%type;
lk dim_loc.loc_key%type;
pk dim_prod.prod_key%type;
day_code dim_day.day_code%type := '20130922';
day_key dim_day.day_key%type :=
sd_convert.day_code_to_key(day_code);
error_ind number(10);
begin
open c;
loop
fetch c into r;
exit when c%notfound;
...
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Transforming	using	Row-by-Row	Method...
error_ind := 0;
if r.day_code != day_code
then
dk := null;
else
dk := day_key;
end if;
if dk is null then error_ind := error_ind + 1; end if;
lk := sd_convert.loc_code_to_key(r.loc_code);
if lk is null then error_ind := error_ind + 2; end if;
pk := sd_convert.prod_code_to_key(r.prod_code);
if pk is null then error_ind := error_ind + 4; end if;
if error_ind = 0
then
insert into stage3_scan_events d values (r ... );
else
r.error_ind := error_ind;
insert into stage2_scan_events_err d values r;
end if;
commit;
end loop;
close c;
end;
...
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Transforming	using	Array	Method
...
if dk is null then error_ind := error_ind + 1; end if;
lk := sd_convert.loc_code_to_key_rc(a(i).loc_code);
if lk is null then error_ind := error_ind + 2; end if;
pk := sd_convert.prod_code_to_key_rc(a(i).prod_code);
if pk is null then error_ind := error_ind + 4; end if;
...
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Transforming	using	Home-grown	Method
...
cursor c is select
s.*
,cast(null as number(10)) as error_ind
,cast(null as number(10)) as day_key
,cast(null as number(10)) as loc_key
,cast(null as number(10)) as prod_key
from
stage2_scan_events_ref s
where ora_hash(loc_code,threads) = thread;
...
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Transforming	using	Set-based	Method
alter session enable parallel dml;
insert /*+ APPEND */ first
when error_ind = 0 then into
stage3_scan_events
values ( ... )
else into
stage2_scan_events_err
values ( ... )
with
dim_day_current
as (select * from dim_day where day_code = '20130922')
select
s.*
,d.day_key
,l.loc_key
,p.prod_key
...
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Transforming	using	Set-based	Method
...
,(
case when day_key is not null then 0 else 1 end
+ case when loc_key is not null then 0 else 2 end
+ case when prod_key is not null then 0 else 4 end
) as error_ind
from
stage2_scan_events_ref s
left outer join
dim_day_current d
on s.day_code = d.day_code
left outer join
dim_loc l
on s.loc_code = l.loc_code
left outer join
dim_prod p
on s.prod_code = p.prod_code;
commit;
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Transforming
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Transforming
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Transforming
Transform	time	in	
seconds	for	100M	de-
duplicated	scan	events
– Array	size	100
– Jobs	32
– Degree	of	Parallelism
11
117
2059
20143
0 5000 10000 15000 20000 25000
Set
Home-grown
Array
Row-by-Row
Transform Time
Transform Time
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Transforming
Transform	rate	in	rows	
per	second	for	100M	
de-duplicated	scan	
events
– Array	size	100
– Jobs	32
– Degree	of	Parallelism 4364 49059
866397
9180775
0
1000000
2000000
3000000
4000000
5000000
6000000
7000000
8000000
9000000
10000000
Row-by-Row Array Home-grown Set
Transform Rate
Transform Rate
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Set	Programming:	
Aggregation
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Aggregating	using	Row-by-Row	Method
declare
cursor c is select /*+ INDEX(s) */
s.*
from
stage3_scan_events_ref s
order by
day_key
,loc_key
,prod_key;
r_this c%rowtype;
r_last c%rowtype;
r_running_total fact_sales%rowtype;
...
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Aggregating	using	Row-by-Row	Method
...
procedure update_running_total
(
r c%rowtype
)
is
begin
if r.actn_code = 'Sale'
then
r_running_total.qty :=
r_running_total.qty + r.qty;
r_running_total.extended_amt :=
r_running_total.extended_amt + r.extended_amt;
r_running_total.discount_amt :=
r_running_total.discount_amt +
r.extended_amt * (100 - r.discount_pct) / 100;
else
r_running_total.qty :=
r_running_total.qty - r.qty;
r_running_total.extended_amt :=
r_running_total.extended_amt - r.extended_amt;
r_running_total.discount_amt :=
r_running_total.discount_amt -
r.extended_amt * (100 - r.discount_pct) / 100;
end if;
end;
...
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Aggregating	using	Row-by-Row	Method
...
procedure start_running_total
(
r c%rowtype
)
is
begin
r_running_total.day_key := r.day_key;
r_running_total.loc_key := r.loc_key;
r_running_total.prod_key := r.prod_key;
r_running_total.qty := 0;
r_running_total.extended_amt := 0;
r_running_total.discount_amt := 0;
update_running_total(r);
end;
procedure flush_running_total
(
r c%rowtype
)
is
begin
insert into fact_sales values r_running_total;
commit;
start_running_total(r);
end;
...
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Aggregating	using	Row-by-Row	Method
...
begin
open c;
fetch c into r_last;
if not c%notfound
then
start_running_total(r_last);
loop
fetch c into r_this;
exit when c%notfound;
if r_this.day_key = r_last.day_key
and r_this.loc_key = r_last.loc_key
and r_this.prod_key = r_last.prod_key
then
update_running_total(r_this);
else
flush_running_total(r_this);
r_last := r_this;
end if;
end loop;
flush_running_total(r_last);
end if;
close c;
end;
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Aggregating	using	Array	Method...
procedure flush_running_total
is
begin
forall i in 1..a_running_totals.count
insert into fact_sales values a_running_totals(i);
commit;
a_running_totals.delete;
end;
procedure buffer_running_total
(
r c%rowtype
)
is
begin
a_running_totals(a_running_totals.count + 1) :=
r_running_total;
if a_running_totals.count = array_size
then
flush_running_total;
end if;
start_running_total(r);
end;
...
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Aggregating	using	Array	Method
...
loop
fetch c bulk collect into a limit array_size;
exit when a.count = 0;
for i in 1..a.count
loop
r_this := a(i);
if r_this.day_key = r_last.day_key
and r_this.loc_key = r_last.loc_key
and r_this.prod_key = r_last.prod_key
then
update_running_total(r_this);
else
buffer_running_total(r_this);
r_last := r_this;
end if;
end loop;
end loop;
buffer_running_total(r_this);
flush_running_total;
...
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Aggregating	using	Threaded	Method
alter session enable parallel dml;
insert /*+ APPEND */ into
fact_sales d
select
*
from
table(sd_aggregation.sum_scan_events
(
cursor(select * from stage3_scan_events_ref s)
)
);
commit;
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Aggregating	using	Threaded	Method
create or replace package body
sd_aggregation
as
function sum_scan_events
(
c refc
)
return t
pipelined
cluster c by (day_key,loc_key,prod_key)
parallel_enable
(
partition c by hash (day_key,loc_key,prod_key)
)
is
r fact_sales%rowtype;
begin
...
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Aggregating	using	Threaded	Method
...
loop
fetch c bulk collect into a limit array_size;
exit when a.count = 0;
for i in 1..a.count
loop
r_this := a(i);
if r_this.day_key = r_last.day_key
and r_this.loc_key = r_last.loc_key
and r_this.prod_key = r_last.prod_key
then
update_running_total(r_this);
else
pipe row (r_running_total);
start_running_total(r_this);
r_last := r_this;
end if;
end loop;
end loop;
pipe row (r_running_total);
...
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Aggregating	using	Set-based	Method
alter session enable parallel dml;
insert /*+ APPEND */ into
fact_sales d
select
day_key
,loc_key
,prod_key
,sum(case when actn_code = 'Sale' then 1 else -1 end *
qty) as qty
,sum(case when actn_code = 'Sale' then 1 else -1 end *
extended_amt) as extended_amt
,sum(case when actn_code = 'Sale' then 1 else -1 end *
extended_amt * (100 - discount_pct) / 100) as discount_amt
from
stage3_scan_events_ref s
group by
day_key
,loc_key
,prod_key;
commit;
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Aggregating
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Aggregating	using	Set-based	Method
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Aggregating	using	Pipelined	Table	Function
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Aggregating
Aggregation	time	in	
seconds	for	100M	
transformed	scan	
events
– Array	size	1024
– Jobs	32
– Degree	of	Parallelism	32
9
119
2791
16827
0 2000 4000 6000 8000 10000 12000 14000 16000 18000
Set
Home-grown
Array
Row-by-Row
Aggregation Time
Aggregation Time
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Aggregating
Aggregation	rate	in	
rows	per	second	for	
100M	transformed	scan	
events
– Array	size	100
– Jobs	32
– Degree	of	Parallelism	32
6000 36181
847303
11218230
0
2000000
4000000
6000000
8000000
10000000
12000000
Row-by-Row Array Home-grown Set
Aggregation Rate
Aggregation Rate
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
What	Did	We	
Learn?
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
• Summary	of	processing	from	raw	
data	to	information
– Array	size	100
– Jobs	32
– Degree	of	Parallelism	32
73
626
11356
74367
0 10000 20000 30000 40000 50000 60000 70000 80000
Set-Based Total
Set-Based
Home-grown Total
Home-grown
Array Total
Array
Row-by-Row Total
Row-by-Row
Loading De-duplicating Transforming Aggregating
Summary
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Row	by	Row	and	Array	processing	for	large	data	sets
10/26/17
Manual	Parallelism
Root	Causes	of	Suboptimal	Database	Performance
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		| Oracle	Confidential	– Internal/Restricted/Highly	Restricted 81
To	achieve	the	best	performance,	understand	the	problem	and	apply	the	
appropriate	tools	and	techniques	for	the	situation
Rows	processed1 Many
Users/
Transactions
Many
Index Table	Scan
OLTP
•Design
ØDimensional	model
ØDirect	load	insert
ØData	transformation
ØPartitioning
ØCompression
ØSet	based	processing
ØAttribute	clustering	
•Execution
ØParallel	Query
ØQueuing
ØHash	joins
ØBloom	filters
Statistics
Exadata
•Design
ØThird	normal	model
ØConnection	pooling
ØContention	avoidance
Ø Manage	parsing	and	
leaking
Ø Row-by-row	or	array		
processing
ØRow	clustering
•Execution
ØDML
ØSerial	processing
ØNested	loops	joins
DW
Database	In-Memory
Resource	
Management
Copyright	©	2014, Oracle	and/or	its	affiliates.	All	rights	reserved.		|
Safe	Harbor	Statement
The	following	is	intended	to	outline	our	general	product	direction.	It	is	intended	for	
information	purposes	only,	and	may	not	be	incorporated	into	any	contract.	It	is	not	a	
commitment	to	deliver	any	material,	code,	or	functionality,	and	should	not	be	relied	upon	
in	making	purchasing	decisions.	The	development,	release,	and	timing	of	any	features	or	
functionality	described	for	Oracle’s	products	remains	at	the	sole	discretion	of	Oracle.
82
[HKOUG] Oracle RWP - Developing High-Performance Systems by Christine Qu and Sidney Chen

Weitere ähnliche Inhalte

Ähnlich wie [HKOUG] Oracle RWP - Developing High-Performance Systems by Christine Qu and Sidney Chen

Functional Programming With Lambdas and Streams in JDK8
 Functional Programming With Lambdas and Streams in JDK8 Functional Programming With Lambdas and Streams in JDK8
Functional Programming With Lambdas and Streams in JDK8IndicThreads
 
HotSpot Synchronization, A Peek Under the Hood [JavaOne 2015 CON7570]
HotSpot Synchronization, A Peek Under the Hood [JavaOne 2015 CON7570]HotSpot Synchronization, A Peek Under the Hood [JavaOne 2015 CON7570]
HotSpot Synchronization, A Peek Under the Hood [JavaOne 2015 CON7570]David Buck
 
Lambdas and Streams in Java SE 8: Making Bulk Operations simple - Simon Ritter
Lambdas and Streams in Java SE 8: Making Bulk Operations simple - Simon RitterLambdas and Streams in Java SE 8: Making Bulk Operations simple - Simon Ritter
Lambdas and Streams in Java SE 8: Making Bulk Operations simple - Simon RitterJAXLondon2014
 
Lambdas And Streams in JDK8
Lambdas And Streams in JDK8Lambdas And Streams in JDK8
Lambdas And Streams in JDK8Simon Ritter
 
Coherence 12.1.3 hidden gems
Coherence 12.1.3 hidden gemsCoherence 12.1.3 hidden gems
Coherence 12.1.3 hidden gemsharvraja
 
Graal and Truffle: Modularity and Separation of Concerns as Cornerstones for ...
Graal and Truffle: Modularity and Separation of Concerns as Cornerstones for ...Graal and Truffle: Modularity and Separation of Concerns as Cornerstones for ...
Graal and Truffle: Modularity and Separation of Concerns as Cornerstones for ...Thomas Wuerthinger
 
Interactive Java Support to your tool -- The JShell API and Architecture
Interactive Java Support to your tool -- The JShell API and ArchitectureInteractive Java Support to your tool -- The JShell API and Architecture
Interactive Java Support to your tool -- The JShell API and ArchitectureJavaDayUA
 
Slidedeck Mehr als Reporting - Datenanalysen mit Oracle R Enterprise - DOAG D...
Slidedeck Mehr als Reporting - Datenanalysen mit Oracle R Enterprise - DOAG D...Slidedeck Mehr als Reporting - Datenanalysen mit Oracle R Enterprise - DOAG D...
Slidedeck Mehr als Reporting - Datenanalysen mit Oracle R Enterprise - DOAG D...Nadine Schoene
 
Slidedeck Datenanalysen auf Enterprise-Niveau mit Oracle R Enterprise - DOAG2014
Slidedeck Datenanalysen auf Enterprise-Niveau mit Oracle R Enterprise - DOAG2014Slidedeck Datenanalysen auf Enterprise-Niveau mit Oracle R Enterprise - DOAG2014
Slidedeck Datenanalysen auf Enterprise-Niveau mit Oracle R Enterprise - DOAG2014Nadine Schoene
 
Oracle SQL Developer Reports
Oracle SQL Developer ReportsOracle SQL Developer Reports
Oracle SQL Developer ReportsJeff Smith
 
What's New in Java 8
What's New in Java 8What's New in Java 8
What's New in Java 8javafxpert
 
Oracle Cloud에서 애플리케이션을 개발하고 테스트하는 손쉬운 방법
Oracle Cloud에서 애플리케이션을 개발하고 테스트하는 손쉬운 방법Oracle Cloud에서 애플리케이션을 개발하고 테스트하는 손쉬운 방법
Oracle Cloud에서 애플리케이션을 개발하고 테스트하는 손쉬운 방법Mee Nam Lee
 
Java Concurrency, A(nother) Peek Under the Hood [JavaOne 2016 CON1497]
Java Concurrency, A(nother) Peek Under the Hood [JavaOne 2016 CON1497]Java Concurrency, A(nother) Peek Under the Hood [JavaOne 2016 CON1497]
Java Concurrency, A(nother) Peek Under the Hood [JavaOne 2016 CON1497]David Buck
 
Explain the explain_plan
Explain the explain_planExplain the explain_plan
Explain the explain_planMaria Colgan
 
P6 Resource Management in the web
P6 Resource Management in the webP6 Resource Management in the web
P6 Resource Management in the webp6academy
 
Lambdas : Beyond The Basics
Lambdas : Beyond The BasicsLambdas : Beyond The Basics
Lambdas : Beyond The BasicsSimon Ritter
 
#OOW16 - Implement the Best Practice for Oracle Financial Reporting Complianc...
#OOW16 - Implement the Best Practice for Oracle Financial Reporting Complianc...#OOW16 - Implement the Best Practice for Oracle Financial Reporting Complianc...
#OOW16 - Implement the Best Practice for Oracle Financial Reporting Complianc...Dane Roberts
 

Ähnlich wie [HKOUG] Oracle RWP - Developing High-Performance Systems by Christine Qu and Sidney Chen (20)

AWR and ASH Deep Dive
AWR and ASH Deep DiveAWR and ASH Deep Dive
AWR and ASH Deep Dive
 
Functional Programming With Lambdas and Streams in JDK8
 Functional Programming With Lambdas and Streams in JDK8 Functional Programming With Lambdas and Streams in JDK8
Functional Programming With Lambdas and Streams in JDK8
 
HotSpot Synchronization, A Peek Under the Hood [JavaOne 2015 CON7570]
HotSpot Synchronization, A Peek Under the Hood [JavaOne 2015 CON7570]HotSpot Synchronization, A Peek Under the Hood [JavaOne 2015 CON7570]
HotSpot Synchronization, A Peek Under the Hood [JavaOne 2015 CON7570]
 
Lambdas and Streams in Java SE 8: Making Bulk Operations simple - Simon Ritter
Lambdas and Streams in Java SE 8: Making Bulk Operations simple - Simon RitterLambdas and Streams in Java SE 8: Making Bulk Operations simple - Simon Ritter
Lambdas and Streams in Java SE 8: Making Bulk Operations simple - Simon Ritter
 
Lambdas And Streams in JDK8
Lambdas And Streams in JDK8Lambdas And Streams in JDK8
Lambdas And Streams in JDK8
 
Coherence 12.1.3 hidden gems
Coherence 12.1.3 hidden gemsCoherence 12.1.3 hidden gems
Coherence 12.1.3 hidden gems
 
Graal and Truffle: Modularity and Separation of Concerns as Cornerstones for ...
Graal and Truffle: Modularity and Separation of Concerns as Cornerstones for ...Graal and Truffle: Modularity and Separation of Concerns as Cornerstones for ...
Graal and Truffle: Modularity and Separation of Concerns as Cornerstones for ...
 
UKOUG
UKOUG UKOUG
UKOUG
 
SAX-TimeSeries
SAX-TimeSeriesSAX-TimeSeries
SAX-TimeSeries
 
Interactive Java Support to your tool -- The JShell API and Architecture
Interactive Java Support to your tool -- The JShell API and ArchitectureInteractive Java Support to your tool -- The JShell API and Architecture
Interactive Java Support to your tool -- The JShell API and Architecture
 
Slidedeck Mehr als Reporting - Datenanalysen mit Oracle R Enterprise - DOAG D...
Slidedeck Mehr als Reporting - Datenanalysen mit Oracle R Enterprise - DOAG D...Slidedeck Mehr als Reporting - Datenanalysen mit Oracle R Enterprise - DOAG D...
Slidedeck Mehr als Reporting - Datenanalysen mit Oracle R Enterprise - DOAG D...
 
Slidedeck Datenanalysen auf Enterprise-Niveau mit Oracle R Enterprise - DOAG2014
Slidedeck Datenanalysen auf Enterprise-Niveau mit Oracle R Enterprise - DOAG2014Slidedeck Datenanalysen auf Enterprise-Niveau mit Oracle R Enterprise - DOAG2014
Slidedeck Datenanalysen auf Enterprise-Niveau mit Oracle R Enterprise - DOAG2014
 
Oracle SQL Developer Reports
Oracle SQL Developer ReportsOracle SQL Developer Reports
Oracle SQL Developer Reports
 
What's New in Java 8
What's New in Java 8What's New in Java 8
What's New in Java 8
 
Oracle Cloud에서 애플리케이션을 개발하고 테스트하는 손쉬운 방법
Oracle Cloud에서 애플리케이션을 개발하고 테스트하는 손쉬운 방법Oracle Cloud에서 애플리케이션을 개발하고 테스트하는 손쉬운 방법
Oracle Cloud에서 애플리케이션을 개발하고 테스트하는 손쉬운 방법
 
Java Concurrency, A(nother) Peek Under the Hood [JavaOne 2016 CON1497]
Java Concurrency, A(nother) Peek Under the Hood [JavaOne 2016 CON1497]Java Concurrency, A(nother) Peek Under the Hood [JavaOne 2016 CON1497]
Java Concurrency, A(nother) Peek Under the Hood [JavaOne 2016 CON1497]
 
Explain the explain_plan
Explain the explain_planExplain the explain_plan
Explain the explain_plan
 
P6 Resource Management in the web
P6 Resource Management in the webP6 Resource Management in the web
P6 Resource Management in the web
 
Lambdas : Beyond The Basics
Lambdas : Beyond The BasicsLambdas : Beyond The Basics
Lambdas : Beyond The Basics
 
#OOW16 - Implement the Best Practice for Oracle Financial Reporting Complianc...
#OOW16 - Implement the Best Practice for Oracle Financial Reporting Complianc...#OOW16 - Implement the Best Practice for Oracle Financial Reporting Complianc...
#OOW16 - Implement the Best Practice for Oracle Financial Reporting Complianc...
 

Kürzlich hochgeladen

Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?XfilesPro
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptxLBM Solutions
 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAndikSusilo4
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphNeo4j
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 

Kürzlich hochgeladen (20)

Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptx
 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & Application
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 

[HKOUG] Oracle RWP - Developing High-Performance Systems by Christine Qu and Sidney Chen