SlideShare a Scribd company logo
1 of 44
Download to read offline
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		|
High Performance PL/SQL
Bulk Processing, Function Result Cache and More
1
Steven	Feuerstein
Oracle	Developer	Advocate	for	PL/SQL
Oracle Corporation
Email:	steven.feuerstein@oracle.com
Twitter:	@sfonplsql
Blog:	stevenfeuersteinonplsql.blogspot.com
YouTube:	Practically	Perfect	PL/SQL
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	2
Deepen	Your	PL/SQL	and	SQL	Expertise
• Take	advantage	of	our	community	websites.
• Oracle	AskTOM	– https://asktom.oracle.com
–Q&A	site,	Office	Hours	with	database	experts,	and	much	more
• Oracle	Dev	Gym	– https://devgym.oracle.com
–Quizzes,	workouts	and	classes	for	an	active	learning	experience
• Oracle	LiveSQL	– https://livesql.oracle.com
–24x7	access	to	the	latest	release	of	Oracle	Database,	plus	a	script	library	and	
tutorials
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	3
Key	Performance	Features
• Bulk	processing	with	FORALL	and	BULK	COLLECT
• Function	Result	Cache
• Improved	performance	of	PL/SQL	functions	from	SQL
• NOCOPY
• Automatic	optimization
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	4
What’s	the	problem	with	this	code?
• We	have,	on	average,	10,000	employees	per	department.
CREATE OR REPLACE PROCEDURE upd_for_dept (
dept_in IN employees.department_id%TYPE
,newsal_in IN employees.salary%TYPE)
IS
CURSOR emp_cur IS
SELECT employee_id,salary,hire_date
FROM employees WHERE department_id = dept_in;
BEGIN
FOR rec IN emp_cur
LOOP
adjust_compensation (rec, newsal_in);
UPDATE employee SET salary = rec.salary
WHERE employee_id = rec.employee_id;
END LOOP;
END upd_for_dept;
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	5
Row-by-row	=	Slow-by-slow?	
• Many	PL/SQL	blocks	execute	the	same	SQL	statement	repeatedly,	with	
different	bind	values.
–Retrieves	data	one	row	at	a	time.
–Performs	same	DML	operation	for	each	row	retrieved.
• The	SQL	engine	does	a	lot	to	optimize	performance,	but	row-by-row	
processing	is	inherently	slow.
– But,	but...aren't	SQL	and	PL/SQL	supposed	to	be	very	tightly	integrated?	Let's	take	a	
look	"under	the	covers.
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	6
Oracle server
PL/SQL Runtime Engine SQL Engine
PL/SQL block
Procedural
statement
executor SQL statement
executor
FOR rec IN emp_cur LOOP
UPDATE employee
SET salary = ...
WHERE employee_id =
rec.employee_id;
END LOOP;
Performance penalty for many
“context switches”
Repetitive	statement	processing	from	PL/SQL
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	7
Bulk	Processing	in	PL/SQL
• The	goal	is	straightforward:	reduce	the	number	of	context	switches	and	
you	improve	performance.
• To	do	this,	Oracle	"bundles	up"	the	requests	for	data	(or	to	change	data)	
and	then	passes	them	with	a	single	context	switch.	
• FORALL	speeds	up	non-query	DML.
–Use	with	inserts,	updates,	deletes	and	merges.
–Move	data	from	collections	to	tables.
• BULK	COLLECT	speeds	up	queries.
–Can	be	used	with	all	kinds	of	queries:	implicit,	explicit,	static	and	dynamic.	
–Move	data	from	tables	into	collections.
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	8
Bulk	processing	with	FORALL
Oracle server
PL/SQL Runtime Engine SQL Engine
PL/SQL block
Procedural
statement
executor SQL statement
executor
FORALL indx IN
list_of_emps.FIRST ..
list_of_emps.LAST
UPDATE employee
SET salary = ...
WHERE employee_id =
list_of_emps(indx);
Fewer context switches,
same SQL behavior
Update...
Update...
Update...
Update...
Update...
Update...
Update...
Update...
Update...
Update...
Update...
Update...
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	9
Impact	of	Bulk	Processing	in	SQL	layer
• The	bulk	processing	features	of	PL/SQL	change	the	way	the	PL/SQL	engine	
communicates	with	the	SQL	layer.
• For	both	FORALL	and	BULK	COLLECT,	the	processing	in	the	SQL	engine	is	
almost	completely	unchanged.
–Same	transaction	and	rollback	segment	management
–Same	number	of	individual	SQL	statements	will	be	executed.
• Only	one	difference:	BEFORE	and	AFTER	statement-level	triggers	only	
fire	once per	FORALL	INSERT	statements.
–Not	for	each	INSERT	statement	passed	to	the	SQL	engine	from	the	FORALL	
statement.
statement_trigger_and_forall.sql
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	10
BULK	COLLECT	for	multi-row	querying	
• Retrieve	multiple	rows	into	a	collection	with	a	single	fetch	(context	switch	to	the	SQL	
engine).
– Deposit	the	multiple	rows	of	data	into	one	or	more	collections.
• NO_DATA_FOUND	is	not raised	when	no	rows	are	fetched;	instead,	the	collection	is	
empty.
• The	"INTO"	collections	are	filled	sequentially	from	index	value	1.
– There	are	no	"gaps"	between	1	and	the	index	value	returned	by	the	COUNT	method.
• Only	integer-indexed	collections	may	be	used.
• No	need	to	initialize	or	extend	nested	tables	and	varrays.	Done	automatically	by	
Oracle.
SELECT * BULK COLLECT INTO collection(s) FROM table;
FETCH cur BULK COLLECT INTO collection(s) [ LIMIT number_of_rows ];
EXECUTE IMMEDIATE query BULK COLLECT INTO collection(s);
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	11
BULK	COLLECT	with	Implicit	Cursor
• An	"unlimited"	bulk	collect	operation	that	populates	the	collection	with	all	
rows	found.	Which	can	lead	to	PGA	memory	errors!
DECLARE
TYPE employees_aat IS TABLE OF
employees%ROWTYPE;
l_employees employees_aat;
BEGIN
SELECT *
BULK COLLECT INTO l_employees
FROM employees;
FOR indx IN 1 .. l_employees.COUNT
LOOP
process_employee (l_employees(indx));
END LOOP;
END;
bulkcoll.sql
bulkcollect.tst
Declare a nested table of records
to hold the queried data.
Fetch all rows into collection
sequentially, starting with 1.
Iterate through the collection
contents with a loop.
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	12
Limit	rows	returned	by	BULK		COLLECT
CREATE OR REPLACE PROCEDURE bulk_with_limit
(deptno_in IN dept.deptno%TYPE)
IS
CURSOR emps_in_dept_cur IS
SELECT * FROM emp
WHERE deptno = deptno_in;
TYPE emp_tt IS TABLE OF emps_in_dept_cur%ROWTYPE;
emps emp_tt;
BEGIN
OPEN emps_in_dept_cur;
LOOP
FETCH emps_in_dept_cur
BULK COLLECT INTO emps LIMIT 1000;
EXIT WHEN emps.COUNT = 0;
process_emps (emps);
END LOOP;
CLOSE emps_in_dept_cur;
END bulk_with_limit;
Use the LIMIT clause with the INTO to
manage the amount of memory used
with the BULK COLLECT operation.
Definitely the preferred approach in
production applications with large or
varying datasets.
bulklimit.sql
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	13
Details	on	that	LIMIT	clause
• The	limit	value	can	be	a	literal	or	a	variable.
– I	suggest	passing	the	limit	as	a	parameter to	give	you	maximum	flexibility.
• A	limit	of	100	seems	like	a	good	default	value.
– Setting	it	to	500	or	1000	doesn't	seem	to	make	much	difference	in	performance.
• With	very	large	volumes	of	data	and	small	numbers	of	batch	processes,	
however,	a	larger	LIMIT	could	help.
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	14
When	to	convert	to	BULK	COLLECT
• Prior	to	Oracle10g,	you	should	convert	all multiple	row	fetch	code	to	BULK	
COLLECTs.
• On	10.1	and	higher,	the	optimizer	will	automatically	optimize	cursor	FOR	
loops	to	run	at	performance	levels	similar	to	BULK	COLLECT.
• So	leave	your	cursor	for	loops	in	place	if	they...
– contain	no DML	operations.
– seem	to	be	running	fast	enough.
• Explicit	BULK	COLLECTs	may	run	a	little	faster	than	cursor	for	loops	
optimized	to	return	100	rows	with	each	fetch.
10g_optimize_cfl.sql
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	15
BULK	COLLECT	Conclusions	
• BULK	COLLECT	improves	performance	of	queries	that	retrieve	more	than	
one	row.
• Use	the	LIMIT	clause	to	avoid	excessive	PGA	memory	consumption.
• Leave	it	to	the	optimizer	to	speed	up	"read	only"	cursor	FOR	loops.
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	16
FORALL
• Introduction	to	FORALL
• Using	the	SQL%BULK_ROWCOUNT
• Referencing	fields	of	collections	of	records
• Using	FORALL	with	sparsely-filled	collections
• Handling	errors	raised	during	execution	of	FORALL
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	17
Use	FORALL	for	repeated	DML	operations
• Convert	loops	that	contain	inserts,	updates,	deletes	or	merges	to	FORALL	
statements.
• Header	(usually)	looks	identical	to	a	numeric	FOR	loop.
– Implicitly	declared	integer	iterator
– At	least	one	bind	array	that	uses	the	iterator	as	its	index	value.
– Use	INDICES	OF	and	VALUES	OF	when	bind	arrays	are	sparse
PROCEDURE upd_for_dept (...) IS
BEGIN
FORALL indx IN low_value .. high_value
UPDATE employee
SET salary = newsal_in
WHERE employee_id = list_of_emps (indx);
END;
forall_timing.sql
forall_examples.sql
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	18
More	on	FORALL
• Use	any	type	of	collection	with	FORALL.
• Only	one	DML	statement	is	allowed	per	FORALL.
–Each	FORALL	is	its	own	"extended"	DML	statement.
• The	collection	must	be	indexed	by	integer.
• The	bind	array	must	be	sequentially	filled.
–Unless	you	use	the	INDICES	OF	or	VALUES	OF	clause.
• Indexes	cannot	be	expressions.
forall_restrictions.sql
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	19
How	many	rows	were	modified?
• SQL%ROWCOUNT	returns	total	number	of	rows	modified	by	entire	
FORALL.
– Not	to	be	relied	on	when	used	with	LOG	ERRORS.
• Use	the	SQL%BULK_ROWCOUNT	cursor	attribute	to	determine	how	
many	rows	are	modified	by	each	statement.
– A	"pseudo-collection"	of	integers;	no	methods	are	defined	for	this	element.
bulk_rowcount.sql
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	20
Using	FORALL	with	Sparse	Collections
• Prior	to	10.2,	the	binding	arrays	in	a	FORALL	statement	must be	
sequentially	filled.
– Using	the	IN	low	..	high	syntax.
• Now,	however,	you	can	bind	sparse	collections	by	using	INDICES	OF	and	
VALUES	OF	in	the	FORALL	header.
10g_indices_of*.sql
10g_values_of*.sql
PROCEDURE upd_for_dept (...) IS
BEGIN
FORALL indx IN INDICES OF list_of_emps
UPDATE employee
SET salary = newsal_in
WHERE employee_id = list_of_emps (indx);
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	21
FORALL	and	DML	Errors
• FORALLs	typically	execute	a	large	number	of	DML	statements.
• When	an	exception	occurs	in	one	of	those	DML	statement,	the	default	
behavior	is:
– That statement	is	rolled	back	and	the	FORALL	stops.
– All	(previous)	successful	statements	are	not rolled	back.
• What	if	you	want	the	FORALL	processing	to	continue,	even	if	an	error	
occurs	in	one	of	the	statements?
• Just	add	the	SAVE	EXCEPTIONS	clause!
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	22
Example:	FORALL	with	SAVE	EXCEPTIONS
• Add SAVE EXCEPTIONS to enable FORALL to suppress
errors at the statement level.
CREATE OR REPLACE PROCEDURE load_books (books_in IN book_obj_list_t)
IS
bulk_errors EXCEPTION;
PRAGMA EXCEPTION_INIT ( bulk_errors, -24381 );
BEGIN
FORALL indx IN books_in.FIRST .. books_in.LAST
SAVE EXCEPTIONS
INSERT INTO book values (books_in(indx));
EXCEPTION
WHEN bulk_errors THEN
FOR indx in 1..SQL%BULK_EXCEPTIONS.COUNT
LOOP
log_error (SQL%BULK_EXCEPTIONS(indx).ERROR_INDEX
, SQL%BULK_EXCEPTIONS(indx).ERROR_CODE);
END LOOP;
END;
Allows processing of all
statements, even after an error
occurs.
Iterate through "pseudo-
collection" of errors.
bulkexc.sql
If any exception is
encountered, Oracle raises
-24381 when done.
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	23
SAVE	EXCEPTIONS	and	FORALL
• The	SAVE	EXCEPTIONS	clause	tells	Oracle	to	save exception	information	and	
continue	processing	all	of	the	DML	statements.
• When	the	FORALL	statement	completes,	if	at	least	one	exception	occurred,	
Oracle	then	raises	ORA-24381.
• You	then	check	the	contents	of	SQL%BULK_EXCEPTIONS.
PROCEDURE upd_for_dept (newsal_in IN NUMBER,
list_of_emps_in IN DBMS_SQL.NUMBER_TABLE) IS
BEGIN
FORALL indx IN list_of_emps_in.FIRST .. list_of_emps_in.LAST
SAVE EXCEPTIONS
UPDATE employees
SET salary = newsal_in
WHERE employee_id = list_of_emps_in (indx);
END;
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	24
SAVE	EXCEPTIONS	in	Detail
• For	each	exception	raised,	Oracle	populates	the	SQL%BULK_EXCEPTIONS	
pseudo-collection	of	records.
– The	record	has	two	fields	:	ERROR_INDEX	and	ERROR_CODE.
– ERROR_INDEX:	the	index	in	the	bind	array	for	which	the	error	occurred.
– ERROR_CODE:	the	number	(positive)	for	the	error	that	was	raised
• It's	a	pseudo-collection and	only	supports	a	single	method:	COUNT.
• So	you	iterate	from	1	to	SQL%BULK_EXCEPTIONS.COUNT	to	get	
information	about	each	error.
• Unfortunately,	it	does	not	store	the	error	message.
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	25
Converting	to	Bulk	Processing
• Let's	take	a	look	at	the	process	by	which	you	go	from	"old-fashioned"	code	
to	a	bulk	processing-based	solution.
• From	integrated	row-by-row	to	phased processing
• Challenges	include:
– With	multiple	DML	statements	in	loop,	how	do	you	"communicate"	from	one	to	the	
other?
– Avoid	excessive	PGA	consumption
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	26
The	"Old	Fashioned"	Approach
• Cursor	FOR	loop	with	two	DML	statements,	trap	exception,	and	keep	on	
going.
CREATE OR REPLACE PROCEDURE upd_for_dept (
dept_in IN employees.department_id%TYPE
, newsal_in IN employees.salary%TYPE)
IS
CURSOR emp_cur ...;
BEGIN
FOR rec IN emp_cur
LOOP
BEGIN
INSERT INTO employee_history ...
adjust_compensation (rec.employee_id, rec.salary);
UPDATE employees SET salary = rec.salary ...
EXCEPTION
WHEN OTHERS THEN log_error;
END;
END LOOP;
END upd_for_dept;
cfl_to_bulk_0.sql
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	27
A	phased	approach	with	bulk	processing
• Change	from	integrated,	row-by-row	approach	to	a	phased	approach.
Relational	
Table(s)
Relational	
Table
Phase	1:	Bulk	collect	from	table(s)	to	collection
Phase	3:	FORALL	from	collection	to	table
Phase	2:	Modify	contents	of	collection	
according	to	requirements
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	28
Translating	phases	into	code
• The	cfl_to_bulk_5.sql	file	contains	the	converted	program,	following	the	
phased	approach.
cfl_to_bulk_0.sql
cfl_to_bulk_5_11g.sql
BEGIN
OPEN employees_cur;
LOOP
fetch_next_set_of_rows (
bulk_limit_in, employee_ids, salaries, hire_dates);
EXIT WHEN employee_ids.COUNT = 0;
insert_history;
adj_comp_for_arrays (employee_ids, salaries);
update_employee;
END LOOP;
END;
Phase	1:
Get	Data
Phase	3:
Push	Data
Phase	2:
Massage	Data
Phase	3:
Push	Data
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	29
Conclusions	– Bulk	Processing	
• FORALL	is	the	most	important	performance	tuning	feature	in	PL/SQL.
– Almost	always	the	fastest	way	to	execute	repeated	SQL	operations	in	PL/SQL.
– Look	that	for	prime	anti-pattern:	Loops	containing	non-query	DML.
– Then	ask	yourself:	can	I	do	it	entirely	within	SQL?	If	not...bulk	it	up!
• You	trade	off	increased	complexity	of	code	for	dramatically	faster	
execution.
– But	remember	that	Oracle	will	automatically	optimize	cursor	FOR	loops	to	BULK	
COLLECT	efficiency.
– No	need	to	convert	unless	the	loop	contains	DML	or	you	want	to	maximally	
optimize	your	code.
• Watch	out	for	the	impact	on	PGA	memory!
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	30
What's	wrong	with	this	picture?
• .
SELECT * FROM materialized_view
WHERE pky = 12345;
What's	Taking So	Long?
SELECT * FROM materialized_view
WHERE pky = 12345;
What's	Taking So	Long?
SELECT * FROM materialized_view
WHERE pky = 12345;
What's	Taking So	Long?
SELECT * FROM materialized_view
WHERE pky = 12345;
What's	Taking So	Long?
SELECT * FROM materialized_view
WHERE pky = 12345;
What's	Taking So	Long?
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	31
Here's	the	question	to	ask	oneself:
• But	they	need	the	data!	And	it	needs	to	be	the	right	data!	What's	a	
developer	supposed	to	do?
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	32
The	Wonderful	Function	Result	Cache
• The	Function	Result	Cache	should	be	the	caching	mechanism	of	choice	
for	PL/SQL	developers.
– Others:	DETERMINISTIC,	PGA	(session-specific)	caching
• This	cache	is stored	in	the	SGA	;	shared	across	sessions;	purged	of	dirty	
data	automatically
• You	can	and	should	use	it	to	retrieve	data	from	any	table	that	is	queried	
more	frequently	than	updated.
– Static	datasets	like	materialized	views	(the	"extreme	case")
– Same	rows	fetched	multiple	times	(parameter	values	serve	as	unique	index	into	
cache)
• Enterprise	Edition	only.
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	33
How	the	Function	Result	Cache	Works
• Add	the	RESULT_CACHE	clause	to	your	function's	header.
– Yes,	that's	the	only	change	you	have	to	make	to	your	code!
• When	a	call	is	made	to	function,	Oracle	compares	IN	argument	values	to	
the	cache.
• If	no	match,	the	function	is	executed	and	the	inputs	and	return	data	are	
cached.
• If	a	match	is	found,	the	function	is	not	executed;	cached	data	is	returned.
• If	changes	to	a	"relies	on"	table	are	committed,	the	cache	is	marked	
invalid	and	will	be	re-built.
11g_frc_demo.sql
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	34
Performance	Impact	of	Result	Cache
• The	result	cache	is	stored	in	the	SGA.
• So	we	should	expect	it	be	slower	than	a	PGA-based	cache.
• But	accessing	result	cache	data	does	not	require	going	through	the	SQL	
engine.
• So	it	should	be	much	faster	than	executing	a	query.
– Even	if	the	statement	is	parsed	and	the	data	blocks	are	already	in	the	SGA.
• Let's	find	out!
11g_emplu*.*
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	35
Result	Cache	– Things	to	Keep	in	Mind	- 1
• If	you	have	uncommitted	changes	in	your	session,	dependent	caches	are	
ignored.
– The	cache	will	not override	your	own	changed	data.
• Caching	is	not	performed	for	complex	types:	records	with	CLOBs,	
collections,	etc.
– But	Oracle	is	optimistic!
• The	cache	is	not related	to	SQL	statements	in	your	function.
– It	only	keeps	track	of	the	input	values	and	the	RETURN	clause	data.
11g_frc_demo.sql
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	36
Result	Cache	– Things	to	Keep	in	Mind	- 2
• You	cannot	use	the	result	cache	with	invoker	rights	program	units	until	12.1.
– Bypass	execution	of	function	body,	Oracle	cannot	resolve	references	to	objects	- the	
whole	point of	IR.
• Functions	with	session-specific	dependencies	must	be		"result-cached"	with	
great	care.
– Virtual	private	database	configurations
– References	to	SYSDATE,	reliance	on	NLS_DATE_FORMAT,	time	zone	changes
– Application	contexts	(calls	to	SYS_CONTEXT)
• Solution:	move	all	dependencies	into	parameter	list.
11g_frc_vpd.sql
11g_frc_vpd2.sql
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	37
Managing	the	Result	Cache
• Oracle	offers	a	number	of	ways	to	manage	the	result	cache	and	tune	it	to	
your	specific	application	needs:
• RESULT_CACHE_MAX_SIZE	initialization	parameter
– If	the	cache	is	too	small,	then	the	LRU	algorithm	negates	the	point	of	the	cache.
• DBMS_RESULT_CACHE	management	package
• v$RESULT_CACHE_*	performance	views
• Warning:	use	of	the	function	result	cache	can	result	in	latch	contention	that	
can	cause	database	performance	degradation.
show_frc_dependencies.sp
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	38
Fine	Grained	Dependencies	in	11.2
• Oracle	keeps	track	of	table	dependencies	on	a	per-result	level.
– Each	result	cached	could	have	a	different	set	of	dependencies.
• A	change	to	a	table	could	invalidate	just	a	subset	of	the	results	in	the	cache.
– It's	not all	or	nothing	- when	your	function's	different	logic	paths	could	"hit"	different	
tables.	
11g_frc_dependencies.sql
11g_frc_dependencies2.sql
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	39
Make	It	Easy	on	Yourself
• I	hope	you	will	agree	that	the	result	cache	is	a	great	feature.
• But	how	easy	will	it	be	for	you	to	apply	it?
• If	you	write/duplicate	queries	throughout	your	code,	upgrading	will	be	
expensive	and	slow.
• If	you	hide	your	queries	behind	functions,	you	have	a	single	point	of	
definition,	and	you	can	upgrade	"instantly."
11g_frc_encapsulation.sql
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	40
The	NOCOPY	Parameter	Hint
• By	default,	Oracle	passes	all	OUT	and	IN	OUT	arguments	by	value,	not	
reference.
– This	means	that	OUT	and	IN	OUT	arguments	always	involve	some	copying of	data.
– All	IN	arguments	are	always	passed	by	reference	(no	copying).
• With	NOCOPY,	you	turn	off	the	copy	process.
– For	"large"	formal	parameters,	such	as	collections,	you	may	see	a	performance	
benefit.
• Compile-time	warnings	will	notify	you	of	opportunities	to	use	this	hint.
nocopy*.*
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	41
Optimizing	Function	Execution	in	SQL
• That	seems	like	an	awfully	good	idea!
• Two	methods:
– WITH	clause	that	defines a	function
– UDF	pragma
• WITH	FUNCTION:	define	a	function	directly	within	your	SQL	statement.
– Most	helpful	for	avoiding	redundancy	in	long	SQL	statements
• UDF	pragma	declaratively	tells	the	compiler	to	"prepare"	the	function	for	
execution	from	SQL.
– Reduces	the	cost	of	the	context	switch
12c_with_function*.sql			
12c_udf*.sql
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	42
Automatic	Optimization	– Set	to	Level	3
• The	default	optimization	level	is	2.
– It's	been	2	since	10.1,	and	it's	a	fine	optimization	level.
• But	11.1	introduced	automatic	subprogram	inlining	– level	3
– Works	with	nested	subprograms	only!
• Recommendation	from	PL/SQL	dev team:	always	move	optimization	level	
up	to	3.	
– Only	downside	you	are	likely	to	see	is	increased	compiled	code	size.	That	should	not	
be	an	issue.
– You	can	also	use	INLINE	pragma	for	selective	inlining.
11g_inline*.sql
Copyright	©	2015	Oracle	and/or	its	affiliates.	All	rights	reserved.		| Page	43
PL/SQL	Optimization
• Make	sure	you	integrate	the	"big	ticket"	performance	features	as	you	
develop.
– Native	SQL,	bulk	processing,	FORALL,	NOCOPY,	UDF,	opt	level	3...
• Focus	primarily	on	correctness	and	maintainability.
• Then	identify	bottlenecks.
– DBMS_HPROF,	DBMS_PROFILER
• Then	perform	more	granular	optimization	within	identified	subprograms.
44

More Related Content

What's hot

PostgreSQL Replication High Availability Methods
PostgreSQL Replication High Availability MethodsPostgreSQL Replication High Availability Methods
PostgreSQL Replication High Availability MethodsMydbops
 
Oracle db performance tuning
Oracle db performance tuningOracle db performance tuning
Oracle db performance tuningSimon Huang
 
Understanding oracle rac internals part 2 - slides
Understanding oracle rac internals   part 2 - slidesUnderstanding oracle rac internals   part 2 - slides
Understanding oracle rac internals part 2 - slidesMohamed Farouk
 
How to find what is making your Oracle database slow
How to find what is making your Oracle database slowHow to find what is making your Oracle database slow
How to find what is making your Oracle database slowSolarWinds
 
Adapting and adopting spm v04
Adapting and adopting spm v04Adapting and adopting spm v04
Adapting and adopting spm v04Carlos Sierra
 
Oracle_Multitenant_19c_-_All_About_Pluggable_D.pdf
Oracle_Multitenant_19c_-_All_About_Pluggable_D.pdfOracle_Multitenant_19c_-_All_About_Pluggable_D.pdf
Oracle_Multitenant_19c_-_All_About_Pluggable_D.pdfSrirakshaSrinivasan2
 
SQL Monitoring in Oracle Database 12c
SQL Monitoring in Oracle Database 12cSQL Monitoring in Oracle Database 12c
SQL Monitoring in Oracle Database 12cTanel Poder
 
Oracle sql high performance tuning
Oracle sql high performance tuningOracle sql high performance tuning
Oracle sql high performance tuningGuy Harrison
 
Oracle SQL Tuning for Day-to-Day Data Warehouse Support
Oracle SQL Tuning for Day-to-Day Data Warehouse SupportOracle SQL Tuning for Day-to-Day Data Warehouse Support
Oracle SQL Tuning for Day-to-Day Data Warehouse Supportnkarag
 
Deep review of LMS process
Deep review of LMS processDeep review of LMS process
Deep review of LMS processRiyaj Shamsudeen
 
Tanel Poder - Performance stories from Exadata Migrations
Tanel Poder - Performance stories from Exadata MigrationsTanel Poder - Performance stories from Exadata Migrations
Tanel Poder - Performance stories from Exadata MigrationsTanel Poder
 
Tanel Poder - Scripts and Tools short
Tanel Poder - Scripts and Tools shortTanel Poder - Scripts and Tools short
Tanel Poder - Scripts and Tools shortTanel Poder
 
Oracle Enterprise manager SNMP and Exadata
Oracle Enterprise manager SNMP and ExadataOracle Enterprise manager SNMP and Exadata
Oracle Enterprise manager SNMP and ExadataMike Chafin
 
UKOUG, Oracle Transaction Locks
UKOUG, Oracle Transaction LocksUKOUG, Oracle Transaction Locks
UKOUG, Oracle Transaction LocksKyle Hailey
 
Oracle Database Performance Tuning Basics
Oracle Database Performance Tuning BasicsOracle Database Performance Tuning Basics
Oracle Database Performance Tuning Basicsnitin anjankar
 
TFA Collector - what can one do with it
TFA Collector - what can one do with it TFA Collector - what can one do with it
TFA Collector - what can one do with it Sandesh Rao
 
Oracle database performance tuning
Oracle database performance tuningOracle database performance tuning
Oracle database performance tuningYogiji Creations
 
Tanel Poder - Troubleshooting Complex Oracle Performance Issues - Part 2
Tanel Poder - Troubleshooting Complex Oracle Performance Issues - Part 2Tanel Poder - Troubleshooting Complex Oracle Performance Issues - Part 2
Tanel Poder - Troubleshooting Complex Oracle Performance Issues - Part 2Tanel Poder
 
APEX Connect 2019 - SQL Tuning 101
APEX Connect 2019 - SQL Tuning 101APEX Connect 2019 - SQL Tuning 101
APEX Connect 2019 - SQL Tuning 101Connor McDonald
 

What's hot (20)

PostgreSQL Replication High Availability Methods
PostgreSQL Replication High Availability MethodsPostgreSQL Replication High Availability Methods
PostgreSQL Replication High Availability Methods
 
Oracle db performance tuning
Oracle db performance tuningOracle db performance tuning
Oracle db performance tuning
 
Understanding oracle rac internals part 2 - slides
Understanding oracle rac internals   part 2 - slidesUnderstanding oracle rac internals   part 2 - slides
Understanding oracle rac internals part 2 - slides
 
How to find what is making your Oracle database slow
How to find what is making your Oracle database slowHow to find what is making your Oracle database slow
How to find what is making your Oracle database slow
 
Adapting and adopting spm v04
Adapting and adopting spm v04Adapting and adopting spm v04
Adapting and adopting spm v04
 
Oracle_Multitenant_19c_-_All_About_Pluggable_D.pdf
Oracle_Multitenant_19c_-_All_About_Pluggable_D.pdfOracle_Multitenant_19c_-_All_About_Pluggable_D.pdf
Oracle_Multitenant_19c_-_All_About_Pluggable_D.pdf
 
SQL Monitoring in Oracle Database 12c
SQL Monitoring in Oracle Database 12cSQL Monitoring in Oracle Database 12c
SQL Monitoring in Oracle Database 12c
 
Oracle sql high performance tuning
Oracle sql high performance tuningOracle sql high performance tuning
Oracle sql high performance tuning
 
Oracle SQL Tuning for Day-to-Day Data Warehouse Support
Oracle SQL Tuning for Day-to-Day Data Warehouse SupportOracle SQL Tuning for Day-to-Day Data Warehouse Support
Oracle SQL Tuning for Day-to-Day Data Warehouse Support
 
Deep review of LMS process
Deep review of LMS processDeep review of LMS process
Deep review of LMS process
 
Tanel Poder - Performance stories from Exadata Migrations
Tanel Poder - Performance stories from Exadata MigrationsTanel Poder - Performance stories from Exadata Migrations
Tanel Poder - Performance stories from Exadata Migrations
 
Tanel Poder - Scripts and Tools short
Tanel Poder - Scripts and Tools shortTanel Poder - Scripts and Tools short
Tanel Poder - Scripts and Tools short
 
Oracle Enterprise manager SNMP and Exadata
Oracle Enterprise manager SNMP and ExadataOracle Enterprise manager SNMP and Exadata
Oracle Enterprise manager SNMP and Exadata
 
UKOUG, Oracle Transaction Locks
UKOUG, Oracle Transaction LocksUKOUG, Oracle Transaction Locks
UKOUG, Oracle Transaction Locks
 
Oracle Database Performance Tuning Basics
Oracle Database Performance Tuning BasicsOracle Database Performance Tuning Basics
Oracle Database Performance Tuning Basics
 
TFA Collector - what can one do with it
TFA Collector - what can one do with it TFA Collector - what can one do with it
TFA Collector - what can one do with it
 
Oracle database performance tuning
Oracle database performance tuningOracle database performance tuning
Oracle database performance tuning
 
Tanel Poder - Troubleshooting Complex Oracle Performance Issues - Part 2
Tanel Poder - Troubleshooting Complex Oracle Performance Issues - Part 2Tanel Poder - Troubleshooting Complex Oracle Performance Issues - Part 2
Tanel Poder - Troubleshooting Complex Oracle Performance Issues - Part 2
 
SQL Tuning 101
SQL Tuning 101SQL Tuning 101
SQL Tuning 101
 
APEX Connect 2019 - SQL Tuning 101
APEX Connect 2019 - SQL Tuning 101APEX Connect 2019 - SQL Tuning 101
APEX Connect 2019 - SQL Tuning 101
 

Similar to High Performance PL/SQL

Turbocharge SQL Performance in PL/SQL with Bulk Processing
Turbocharge SQL Performance in PL/SQL with Bulk ProcessingTurbocharge SQL Performance in PL/SQL with Bulk Processing
Turbocharge SQL Performance in PL/SQL with Bulk ProcessingSteven Feuerstein
 
Oracle - SQL-PL/SQL context switching
Oracle - SQL-PL/SQL context switchingOracle - SQL-PL/SQL context switching
Oracle - SQL-PL/SQL context switchingSmitha Padmanabhan
 
ETL with Clustered Columnstore - PASS Summit 2014
ETL with Clustered Columnstore - PASS Summit 2014ETL with Clustered Columnstore - PASS Summit 2014
ETL with Clustered Columnstore - PASS Summit 2014Niko Neugebauer
 
Exploring plsql new features best practices september 2013
Exploring plsql new features best practices   september 2013Exploring plsql new features best practices   september 2013
Exploring plsql new features best practices september 2013Andrejs Vorobjovs
 
PostgreSQL Database Slides
PostgreSQL Database SlidesPostgreSQL Database Slides
PostgreSQL Database Slidesmetsarin
 
Less04 instance
Less04 instanceLess04 instance
Less04 instanceImran Ali
 
Cursors, triggers, procedures
Cursors, triggers, proceduresCursors, triggers, procedures
Cursors, triggers, proceduresVaibhav Kathuria
 
Take Full Advantage of the Oracle PL/SQL Compiler
Take Full Advantage of the Oracle PL/SQL CompilerTake Full Advantage of the Oracle PL/SQL Compiler
Take Full Advantage of the Oracle PL/SQL CompilerSteven Feuerstein
 
Satyapriya rajguru: Every day, in one way or another.
Satyapriya  rajguru:  Every day, in one way or another.Satyapriya  rajguru:  Every day, in one way or another.
Satyapriya rajguru: Every day, in one way or another.Satyapriya Rajguru
 
122 sql for-beginners
122 sql for-beginners122 sql for-beginners
122 sql for-beginnerssuzzanj1990
 
3963066 pl-sql-notes-only
3963066 pl-sql-notes-only3963066 pl-sql-notes-only
3963066 pl-sql-notes-onlyAshwin Kumar
 
Flink and Hive integration - unifying enterprise data processing systems
Flink and Hive integration - unifying enterprise data processing systemsFlink and Hive integration - unifying enterprise data processing systems
Flink and Hive integration - unifying enterprise data processing systemsBowen Li
 
Unify Enterprise Data Processing System Platform Level Integration of Flink a...
Unify Enterprise Data Processing System Platform Level Integration of Flink a...Unify Enterprise Data Processing System Platform Level Integration of Flink a...
Unify Enterprise Data Processing System Platform Level Integration of Flink a...Flink Forward
 
Tony Jambu (obscure) tools of the trade for tuning oracle sq ls
Tony Jambu   (obscure) tools of the trade for tuning oracle sq lsTony Jambu   (obscure) tools of the trade for tuning oracle sq ls
Tony Jambu (obscure) tools of the trade for tuning oracle sq lsInSync Conference
 

Similar to High Performance PL/SQL (20)

Turbocharge SQL Performance in PL/SQL with Bulk Processing
Turbocharge SQL Performance in PL/SQL with Bulk ProcessingTurbocharge SQL Performance in PL/SQL with Bulk Processing
Turbocharge SQL Performance in PL/SQL with Bulk Processing
 
Oracle - SQL-PL/SQL context switching
Oracle - SQL-PL/SQL context switchingOracle - SQL-PL/SQL context switching
Oracle - SQL-PL/SQL context switching
 
ETL with Clustered Columnstore - PASS Summit 2014
ETL with Clustered Columnstore - PASS Summit 2014ETL with Clustered Columnstore - PASS Summit 2014
ETL with Clustered Columnstore - PASS Summit 2014
 
Erik_van_Roon.pdf
Erik_van_Roon.pdfErik_van_Roon.pdf
Erik_van_Roon.pdf
 
SQL Tunning
SQL TunningSQL Tunning
SQL Tunning
 
Exploring plsql new features best practices september 2013
Exploring plsql new features best practices   september 2013Exploring plsql new features best practices   september 2013
Exploring plsql new features best practices september 2013
 
PostgreSQL Database Slides
PostgreSQL Database SlidesPostgreSQL Database Slides
PostgreSQL Database Slides
 
PLSQL Tutorial
PLSQL TutorialPLSQL Tutorial
PLSQL Tutorial
 
Less04 instance
Less04 instanceLess04 instance
Less04 instance
 
plsql Les05
plsql Les05 plsql Les05
plsql Les05
 
Cursors, triggers, procedures
Cursors, triggers, proceduresCursors, triggers, procedures
Cursors, triggers, procedures
 
Take Full Advantage of the Oracle PL/SQL Compiler
Take Full Advantage of the Oracle PL/SQL CompilerTake Full Advantage of the Oracle PL/SQL Compiler
Take Full Advantage of the Oracle PL/SQL Compiler
 
Satyapriya rajguru: Every day, in one way or another.
Satyapriya  rajguru:  Every day, in one way or another.Satyapriya  rajguru:  Every day, in one way or another.
Satyapriya rajguru: Every day, in one way or another.
 
122 sql for-beginners
122 sql for-beginners122 sql for-beginners
122 sql for-beginners
 
3963066 pl-sql-notes-only
3963066 pl-sql-notes-only3963066 pl-sql-notes-only
3963066 pl-sql-notes-only
 
PLSQL Advanced
PLSQL AdvancedPLSQL Advanced
PLSQL Advanced
 
Flink and Hive integration - unifying enterprise data processing systems
Flink and Hive integration - unifying enterprise data processing systemsFlink and Hive integration - unifying enterprise data processing systems
Flink and Hive integration - unifying enterprise data processing systems
 
Unify Enterprise Data Processing System Platform Level Integration of Flink a...
Unify Enterprise Data Processing System Platform Level Integration of Flink a...Unify Enterprise Data Processing System Platform Level Integration of Flink a...
Unify Enterprise Data Processing System Platform Level Integration of Flink a...
 
Pl sql-ch1
Pl sql-ch1Pl sql-ch1
Pl sql-ch1
 
Tony Jambu (obscure) tools of the trade for tuning oracle sq ls
Tony Jambu   (obscure) tools of the trade for tuning oracle sq lsTony Jambu   (obscure) tools of the trade for tuning oracle sq ls
Tony Jambu (obscure) tools of the trade for tuning oracle sq ls
 

More from Steven Feuerstein

Six simple steps to unit testing happiness
Six simple steps to unit testing happinessSix simple steps to unit testing happiness
Six simple steps to unit testing happinessSteven Feuerstein
 
Speakers at Nov 2019 PL/SQL Office Hours session
Speakers at Nov 2019 PL/SQL Office Hours sessionSpeakers at Nov 2019 PL/SQL Office Hours session
Speakers at Nov 2019 PL/SQL Office Hours sessionSteven Feuerstein
 
New Stuff in the Oracle PL/SQL Language
New Stuff in the Oracle PL/SQL LanguageNew Stuff in the Oracle PL/SQL Language
New Stuff in the Oracle PL/SQL LanguageSteven Feuerstein
 
AskTOM Office Hours on Database Triggers
AskTOM Office Hours on Database TriggersAskTOM Office Hours on Database Triggers
AskTOM Office Hours on Database TriggersSteven Feuerstein
 
Oracle Application Express and PL/SQL: a world-class combo
Oracle Application Express and PL/SQL: a world-class comboOracle Application Express and PL/SQL: a world-class combo
Oracle Application Express and PL/SQL: a world-class comboSteven Feuerstein
 
Error Management Features of PL/SQL
Error Management Features of PL/SQLError Management Features of PL/SQL
Error Management Features of PL/SQLSteven Feuerstein
 
JSON and PL/SQL: A Match Made in Database
JSON and PL/SQL: A Match Made in DatabaseJSON and PL/SQL: A Match Made in Database
JSON and PL/SQL: A Match Made in DatabaseSteven Feuerstein
 
Oracle PL/SQL 12c and 18c New Features + RADstack + Community Sites
Oracle PL/SQL 12c and 18c New Features + RADstack + Community SitesOracle PL/SQL 12c and 18c New Features + RADstack + Community Sites
Oracle PL/SQL 12c and 18c New Features + RADstack + Community SitesSteven Feuerstein
 
AskTOM Office Hours - Dynamic SQL in PL/SQL
AskTOM Office Hours - Dynamic SQL in PL/SQLAskTOM Office Hours - Dynamic SQL in PL/SQL
AskTOM Office Hours - Dynamic SQL in PL/SQLSteven Feuerstein
 
Database Developers: the most important developers on earth?
Database Developers: the most important developers on earth?Database Developers: the most important developers on earth?
Database Developers: the most important developers on earth?Steven Feuerstein
 
Unit Testing Oracle PL/SQL Code: utPLSQL, Excel and More
Unit Testing Oracle PL/SQL Code: utPLSQL, Excel and MoreUnit Testing Oracle PL/SQL Code: utPLSQL, Excel and More
Unit Testing Oracle PL/SQL Code: utPLSQL, Excel and MoreSteven Feuerstein
 
Impact Analysis with PL/Scope
Impact Analysis with PL/ScopeImpact Analysis with PL/Scope
Impact Analysis with PL/ScopeSteven Feuerstein
 
All About PL/SQL Collections
All About PL/SQL CollectionsAll About PL/SQL Collections
All About PL/SQL CollectionsSteven Feuerstein
 
utPLSQL: Unit Testing for Oracle PL/SQL
utPLSQL: Unit Testing for Oracle PL/SQLutPLSQL: Unit Testing for Oracle PL/SQL
utPLSQL: Unit Testing for Oracle PL/SQLSteven Feuerstein
 

More from Steven Feuerstein (17)

New(er) Stuff in PL/SQL
New(er) Stuff in PL/SQLNew(er) Stuff in PL/SQL
New(er) Stuff in PL/SQL
 
Six simple steps to unit testing happiness
Six simple steps to unit testing happinessSix simple steps to unit testing happiness
Six simple steps to unit testing happiness
 
Speakers at Nov 2019 PL/SQL Office Hours session
Speakers at Nov 2019 PL/SQL Office Hours sessionSpeakers at Nov 2019 PL/SQL Office Hours session
Speakers at Nov 2019 PL/SQL Office Hours session
 
New Stuff in the Oracle PL/SQL Language
New Stuff in the Oracle PL/SQL LanguageNew Stuff in the Oracle PL/SQL Language
New Stuff in the Oracle PL/SQL Language
 
AskTOM Office Hours on Database Triggers
AskTOM Office Hours on Database TriggersAskTOM Office Hours on Database Triggers
AskTOM Office Hours on Database Triggers
 
PL/SQL Guilty Pleasures
PL/SQL Guilty PleasuresPL/SQL Guilty Pleasures
PL/SQL Guilty Pleasures
 
Oracle Application Express and PL/SQL: a world-class combo
Oracle Application Express and PL/SQL: a world-class comboOracle Application Express and PL/SQL: a world-class combo
Oracle Application Express and PL/SQL: a world-class combo
 
Error Management Features of PL/SQL
Error Management Features of PL/SQLError Management Features of PL/SQL
Error Management Features of PL/SQL
 
JSON and PL/SQL: A Match Made in Database
JSON and PL/SQL: A Match Made in DatabaseJSON and PL/SQL: A Match Made in Database
JSON and PL/SQL: A Match Made in Database
 
OLD APEX and PL/SQL
OLD APEX and PL/SQLOLD APEX and PL/SQL
OLD APEX and PL/SQL
 
Oracle PL/SQL 12c and 18c New Features + RADstack + Community Sites
Oracle PL/SQL 12c and 18c New Features + RADstack + Community SitesOracle PL/SQL 12c and 18c New Features + RADstack + Community Sites
Oracle PL/SQL 12c and 18c New Features + RADstack + Community Sites
 
AskTOM Office Hours - Dynamic SQL in PL/SQL
AskTOM Office Hours - Dynamic SQL in PL/SQLAskTOM Office Hours - Dynamic SQL in PL/SQL
AskTOM Office Hours - Dynamic SQL in PL/SQL
 
Database Developers: the most important developers on earth?
Database Developers: the most important developers on earth?Database Developers: the most important developers on earth?
Database Developers: the most important developers on earth?
 
Unit Testing Oracle PL/SQL Code: utPLSQL, Excel and More
Unit Testing Oracle PL/SQL Code: utPLSQL, Excel and MoreUnit Testing Oracle PL/SQL Code: utPLSQL, Excel and More
Unit Testing Oracle PL/SQL Code: utPLSQL, Excel and More
 
Impact Analysis with PL/Scope
Impact Analysis with PL/ScopeImpact Analysis with PL/Scope
Impact Analysis with PL/Scope
 
All About PL/SQL Collections
All About PL/SQL CollectionsAll About PL/SQL Collections
All About PL/SQL Collections
 
utPLSQL: Unit Testing for Oracle PL/SQL
utPLSQL: Unit Testing for Oracle PL/SQLutPLSQL: Unit Testing for Oracle PL/SQL
utPLSQL: Unit Testing for Oracle PL/SQL
 

Recently uploaded

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
 
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
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
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
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersThousandEyes
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
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
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 

Recently uploaded (20)

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
 
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 ...
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
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
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
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
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 

High Performance PL/SQL