Over the years there have been countless technical and social presentations doting on 5, 10, 12 ways to improve this, that and the other.
I will go through various performance tweaks (not tweets) for Oracle Application Express without limiting myself to a golden number.
These improvements will vary from simple PL/SQL refactoring; to monitoring for bottlenecks in your application; to cutting down maintenance time - which relates to the performance of you as an Oracle developer with only 24 hours in a day.
We may even visit a little APEX instrumentation on the way.
Delhi Call Girls Punjabi Bagh 9711199171 ☎✔👌✔ Whatsapp Hard And Sexy Vip Call
Oracle APEX Performance
1. SAGE Computing Services
Customised Oracle Training Workshops and Consulting
‘n’ methods to improve Apex performance
Why stop at 10?
Scott Wesley
Systems Consultant & Trainer
9. the law is strangling creativity
http://www.ted.com/talks/larry_lessig_says_the_law_is_strangling_creativity.html
http://presentationzen.blogs.com/presentationzen/2005/10/the_lessig_meth.html
15. begin
<< chk >>
for i in 1.. apex_application.g_f20.count loop
update resources set deleted = 'Y'
where code = apex_application.g_f20(i);
end loop chk;
end;
16. begin
forall i in indices of apex_application.g_f20
update resources set deleted = 'Y'
where code = apex_application.g_f20(i);
end;
24. CREATE OR REPLACE TYPE
r_ldap_group
AS OBJECT
(username VARCHAR2(100)
,group_name VARCHAR2(100))
/
CREATE OR REPLACE TYPE
t_ldap_group
AS TABLE OF r_ldap_group;
/
25. CREATE MATERIALIZED VIEW
mv_ldap_groups
REFRESH COMPLETE
START WITH SYSDATE
NEXT TRUNC(SYSDATE) + 1
AS
SELECT username, group_name
FROM TABLE(return_ldap_groups);
http://www.amazon.com/Pro-Oracle-Application-Express-ebook/dp/B001U0PFCC
37. SELECT name d, org_id r
FROM organisations
START WITH parent_org_id =
:P12_PARENT_ORG_ID
CONNECT BY PRIOR org_id =
parent_org_id
ORDER BY 1
38.
39. function getEmail(pUser) {
var get = new htmldb_Get(null,$v('pFlowId'),
'APPLICATION_PROCESS=GET_EMAIL',0);
get.addParam('x01',pUser);
gReturn = get.get();
json_SetItems(gReturn);
}
http://www.itworkedyesterday.com/blog/2010/2/23/apex_util-ready-set-json.html
57. -- Is the current page a help/contact popup/login
-- these pages don't need jquery, cancel page
calculations.
FUNCTION is_popup_page
RETURN BOOLEAN IS
BEGIN
RETURN wwv_flow.get_page_alias IN
('ITEMHELP' -- help popup
,'LOGIN' -- not a popup, but doesn't need dates
,'CONTACTS' -- contact manager popup
,'FINDSPP' -- SPP lookup
,'EMAIL' -- not worth cancelling to and doesn't need
jquery
,'EMAILSENT' -- closes in a few seconds
);
END is_popup_page;
74. CREATE OR REPLACE FUNCTION V
( p_item IN VARCHAR2
, p_flow IN NUMBER := NULL
, p_scope IN VARCHAR2 := 'SESSION_AND_USER'
, p_escape IN VARCHAR2 := 'N'
)
RETURN VARCHAR2 DETERMINISTIC
--==============================================================================
-- Wraps the existing APEX V function and adds the DETERMINISTIC optimizer hint
-- so that the function isn't called for each row the query engine is verifying.
-- See /2006/11/caution-when-using-plsql-functions-in.html
-- for details.
--==============================================================================
IS
BEGIN
RETURN FLOWS_020200.V
( p_item => p_item
, p_flow => p_flow
, p_scope => p_scope
, p_escape => p_escape
);
END V;
/
http://www.inside-oracle-apex.com/drop-in-replacement-for-v-and-nv-function/
75. SELECT *
FROM my_table
-- scalar subquery caching
WHERE my_column = (SELECT v('MY_ITEM') FROM DUAL)
http://www.oratechinfo.co.uk/scalar_subqueries.html
78. To ensure your program does exactly what you expect, use explicit conversions wherever
possible.
79. create or replace function nv (
p_item in varchar2)
return number
-- Copyright (c) Oracle Corporation 1999. All
Rights Reserved.
--
-- DESCRIPTION
-- Function to return a numeric flow value.
V stands for value.
--
-- SECURITY
--
-- NOTES
--
is
begin
return to_number(v(p_item));
end nv;
/
93. CREATE OR REPLACE TRIGGER
my_table_br_trg
BEFORE INSERT OR UPDATE ON
sage.my_table
FOR EACH ROW
BEGIN
IF :NEW.my_id IS NULL THEN
SELECT my_seq.NEXTVAL
INTO :NEW.my_id
FROM dual;
-- :NEW.my_id := my_seq.NEXTVAL ->
11g
END IF;
END;
/
121. SELECT name, TO_CHAR(dt,'DD-MM-YYYY') dt, amt,
cum_amt -- Model results
FROM (
SELECT name, TRUNC(dt, 'MM') dt, SUM(amt) amt
FROM customer
GROUP BY name, TRUNC(dt, 'MM')
)
MODEL
PARTITION BY (name)
DIMENSION BY (dt)
MEASURES (amt, cast(NULL AS NUMBER) cum_amt) --
Define calculated col
IGNORE NAV
RULES SEQUENTIAL ORDER(
amt[FOR dt FROM TO_DATE('01-01-2007', 'DD-MM-
YYYY')
TO TO_DATE('01-12-2007', 'DD-MM-
YYYY')
INCREMENT NUMTOYMINTERVAL(1, 'MONTH')
] = amt[CV(dt)] -- Apply amt for given date,
if found
,cum_amt[ANY] = SUM(amt)[dt <= CV(dt)] --
Calculate cumulative
)
ORDER BY name, dt
/
127. SAGE Computing Services
Customised Oracle Training Workshops and Consulting
Question time
Presentations are available from our website:
http://www.sagecomputing.com.au
enquiries@sagecomputing.com.au
scott.wesley@sagecomputing.com.au
http://triangle-circle-square.blogspot.com
Notes de l'éditeur
Scott from Sage – Consultant & TrainerWorking with Apex for the last few years
Scott from Sage – Consultant & TrainerWorking with Apex for the last few years
Scott from Sage – Consultant & TrainerWorking with Apex for the last few years
Scott from Sage – Consultant & TrainerWorking with Apex for the last few years
The ubiquitous slide – not today
Who’s style was pretty much innovated by LarryWho’s heard of him?
This is the general breakdown of my presentation
Starting with prevention – it’s better than a cure, right?
Start with simple example
We always see this example
Why not do it like this? Use bulk binding
There’s going to be no massive winsWait – what’s the problem with this picture, isn’t parsec a measurement of distance? Damn pop culture
If you defer security group membership to an LDAP server, you may wish to consider
... Creating a pipelined function returning information from LDAP about your groups
Which would be based on database types such as these
Then you could create a snapshot based on your LDAP information – instead of a manual PL/SQL synching processA guide to this concept is documented in this book by my namesakes – John Edward Scott & Scott Spendolini
Consider if you need to evaluate membership for each page, or just once
Perhaps (particularly if you have multiple schemes) populate application items during post authentication
And refer to this item in your conditions – makes things more consistent
Do you really need conditions that run SQL?Is your SQL efficient?
In addition to PPR, where in your app might it be useful to avoid entire page submission?Apex 4 makes cascading LOVs easy
Or maybe try some forms style item validation
Remember this evil?
While we eliminate network lag because we’re all on the db, you may still want to question behaviour. This is acceptable
You may wish to consider an key-preserved / updateable view if things like this get out of control
Put the more efficient validations first – maybe don’t do expensive ones if fundament errors found
This can increase number of hard parses
It’s what they’re designed for, utilise your CSS classesFrom managing your development, wrapping your head around CSS concepts will save you time in future anyway
Does your application / page need this?
Does every page need your custom widgets?
This is where you can really utilise page zero to turn components on & off
I put this sort of thing in the condition
Speed of responseReduce server loadSend only valid dataReduce network traffic
There are plenty of APIs to help you out
First of all, you shouldn’t really need to do this
You should be doing this
But if you’re referring to your own function, regardless of complexity
Or you do have this...
More likely within PL/SQL package
Deterministic functions optimised from
But if you are working with
Such as basic install
Then you may wishto consider this
Or the most simplistic works on all versions from 9i – check out a great outline hereCould talk for hours just about this, but I won’t.
Remember this term
I can’t go by without mentioning I’m always hammering trainees about this
Straight from PL/SQL Users guide and reference
Don’t forget about this function
Because oracle might make some weird decisions if you leave data-type conversions up to it
Which is a segue onto the next topic
Best practices for apex developers, help reduce coding/maintenance time
You may also like to consider
One movement is always better
So APIs could facilitate this usage
Don’t over accessorise
At least do it via a trigger, in Apex environment – it’s only as fast as user can click anyway
Opportunities for re-use all around
Something everyone can do in even the simplest of applications – put your code in packages!Centralising code can say yourself time in the long run
You’ve come across something nasty, what do you do?
First of all, there may not be a problem – “my app is hanging”
Don’t let you’re user wait. Apex uses optimistic locking, this says how many seconds the user should wait instead of the default – infinitumThis also removes a potential security issue (DOS)
In apex 4 debug got a whole load prettier
Perhaps you’d like to add your own debug information
Be aware of the options you have to turn on tracinghttp:/.../f?p=100:1&p_trace=YES
and how to find your trace file, then tkprof itshow parameter USER_DUMP_DESTtkprof filename1 filename2 [waits=yes|no] [sort=option] [print=n] [aggregate=yes|no] [insert=filename3] [sys=yes|no] [table=schema.table] [explain=user/password] [record=filename4] [width=n]
Performance testing tool over many server types.Visit Chris tomorrow and have a chat to him about it.Or come by the Sage booth
Find which pages are the most expensive to runWeighted – don’t care about random page opened once a month, consider page views
Application level more granular
Or you could look at page/session level to find outliers, errors
Performance solutions aren’t just Apex related features, database level
Check to see you’re queries are tuned – may not be apex’s fault. (nothing wrong with this one – just looks scary ;-)
It can really depend… how long is a piece of string