Oracle APEX Performance

1,237 views
1,033 views

Published on

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.

Published in: Data & Analytics, Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,237
On SlideShare
0
From Embeds
0
Number of Embeds
28
Actions
Shares
0
Downloads
37
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • 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
  • I counted 32 tips…
  • Oracle APEX Performance

    1. 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
    2. 2. who_am_i;
    3. 3. http://strategy2c.wordpress.com/2009/01/10/strategy-for-goldfish-funny-illustration-by-frits/
    4. 4. Agenda • Introduction • Prevention • Fluff • Diagnosis • Fluff • Time Management • Fluff • Conclusion • Drinks
    5. 5. Larry Lessig?
    6. 6. 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
    7. 7. This presentation what you can explore
    8. 8. prevention - innovate time management - educate diagnosis - interact not just Apex - maximise
    9. 9. prevention - innovate time management - educate diagnosis - interact not just Apex - maximise
    10. 10. example
    11. 11. checkboxes
    12. 12. 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;
    13. 13. begin forall i in indices of apex_application.g_f20 update resources set deleted = 'Y' where code = apex_application.g_f20(i); end;
    14. 14. http://www.perthnow.com.au/sport/fremantle-defender-chris-tarrant-in-doubt-for-afl- finals/story-e6frg1wu-1225899762230
    15. 15. move away from Oracle Forms (to Apex)
    16. 16. authentication
    17. 17. LDAP
    18. 18. FUNCTION return_ldap_groups RETURN t_ldap_group PIPELINED;
    19. 19. 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; /
    20. 20. 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
    21. 21. authorisation
    22. 22. -- To populate application item F_ADMIN_SCHEME -- (preferably via perhaps app_auth_pkg.post_authentication_process app_auth_pkg.fn_admin_scheme(:APP_USER) ;
    23. 23. :F_ADMIN_SCHEME = 'Y'
    24. 24. conditions
    25. 25. pagination style
    26. 26. ajax methods
    27. 27. 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
    28. 28. 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
    29. 29. post calculation computation
    30. 30. post query
    31. 31. REPLACE(:P1_EMAIL_LIST, ':', '<br>')
    32. 32. my_pkg.get_description(:P1_CODE)
    33. 33. bulk collects
    34. 34. << email_loop >> FOR r_rec IN (SELECT email FROM employees) LOOP lc_emails := lc_emails ||r_rec.email ||','; END LOOP email_loop; lc_emails := RTRIM(lc_emails,',');
    35. 35. SELECT DISTINCT email BULK COLLECT INTO lt_emails FROM employees; lc_emails := apex_util.table_to_string (p_table => lt_emails ,p_string => ',');
    36. 36. validation sequence
    37. 37. Apex_application.g_inline_validation_error_cnt = 0
    38. 38. CSS in SQL
    39. 39. SELECT emp_id ,'<b>'||ename||'</b>' ,salary FROM emp
    40. 40. network traffic
    41. 41. -- 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;
    42. 42. javascript validation
    43. 43. #TIMING#
    44. 44. cache
    45. 45. http://forums.oracle.com/forums/thread.jspa?threadID=486516
    46. 46. deterministic functions
    47. 47. SELECT * FROM my_table WHERE my_column = v('MY_ITEM')
    48. 48. SELECT * FROM my_table WHERE my_column = :MY_ITEM
    49. 49. SELECT * FROM my_table WHERE my_column = my_own_function(another_column)
    50. 50. SELECT * FROM my_table WHERE my_column = v('MY_ITEM')
    51. 51. SELECT * FROM my_table WHERE my_column = v('MY_ITEM')
    52. 52. From 10gR2
    53. 53. Pre Apex3.x
    54. 54. ie - Oracle XEpre-patch
    55. 55. 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/
    56. 56. SELECT * FROM my_table -- scalar subquery caching WHERE my_column = (SELECT v('MY_ITEM') FROM DUAL) http://www.oratechinfo.co.uk/scalar_subqueries.html
    57. 57. scalar subquery caching
    58. 58. implicit vs explicit conversion
    59. 59. To ensure your program does exactly what you expect, use explicit conversions wherever possible.
    60. 60. 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; /
    61. 61. select * from organisations where name = 123;
    62. 62. sequences
    63. 63. BEGIN INSERT INTO my_table (my_pk, ... VALUES (my_seq.NEXTVAL, ...); END; /
    64. 64. prevention – innovate time management – educate diagnosis - interact not just Apex - maximise
    65. 65. PL/SQL APIs
    66. 66. create or replace package "PARTIES_API" is -------------------------------------------------------------- -- create procedure for table "PARTIES" procedure "INS_PARTIES" (... -------------------------------------------------------------- -- update procedure for table "PARTIES" procedure "UPD_PARTIES" (... -------------------------------------------------------------- -- delete procedure for table "PARTIES" procedure "DEL_PARTIES" (... -------------------------------------------------------------- -- get procedure for table "PARTIES" procedure "GET_PARTIES" (... -------------------------------------------------------------- -- get procedure for table "PARTIES" including MD5 procedure "GET_PARTIES" (... -------------------------------------------------------------- -- build MD5 function for table "PARTIES" function "BUILD_PARTIES_MD5" (... ) return varchar2; end "PARTIES_API";
    67. 67. merge vs insert/update
    68. 68. multi-table insert
    69. 69. BEGIN INSERT INTO my_table (my_pk, ... VALUES (my_seq.NEXTVAL, ...); END; /
    70. 70. BEGIN INSERT INTO my_table (my_pk, ... VALUES (fn_get_my_seq, ...); END; /
    71. 71. 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; /
    72. 72. re-use shared components page zero copy object ui defaults subscriptions pl/sql packages
    73. 73. -- apex_application.g_inline_validation_error_cnt = 0 return my_pkg.run_validation
    74. 74. prevention - innovate time management – educate diagnosis – interact not just Apex - maximise
    75. 75. apex_dml_lock_wait_time
    76. 76. debug mode
    77. 77. wwv_flow.debug('my debug information');
    78. 78. firebug
    79. 79. tracing
    80. 80. http://download.oracle.com/docs/cd/E14373_01/appdev.32/e11838/debug.htm#BABGDGEH http:/.../f?p=100:1&p_trace=YES
    81. 81. http://www.talkapex.com/2010/10/oracle-xe-and-apex-where-is-my-trace.html show parameter USER_DUMP_DEST
    82. 82. jmeter
    83. 83. http://sagecomputing.com.au/presentations_sage_computing_services.html http://one-size-doesnt-fit-all.blogspot.com/2010/05/configuring-apache-jmeter-for-apex.html
    84. 84. page performance
    85. 85. monitor activity
    86. 86. prevention - innovate time management - educate diagnosis - interact not just Apex - maximise
    87. 87. short circuit evaluation
    88. 88. SELECT NVL(a_column ,expensive_fn(b_column)) my_column FROM a_table; SELECT COALESCE(a_column ,expensive_fn(b_column)) my_column FROM a_table;
    89. 89. IF a != b OR (a IS NULL AND b IS NOT NULL ) OR( a IS NOT NULL AND b IS NULL ) IF (COALESCE(a,-1) != COALESCE(b,-2)) IF NVL(a,-1) != NVL(b,-1)
    90. 90. queries
    91. 91. 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 /
    92. 92. remote database queries
    93. 93. small_table big_table
    94. 94. SELECT st.info, sum(bt.measure) total FROM small_table st JOIN big_table@remote_db bt ON st.id = bt.id
    95. 95. SELECT /*+ DRIVING_SITE(bt) */ st.info, sum(bt.measure) total FROM small_table st JOIN big_table@remote_db bt ON st.id = bt.id
    96. 96. experiment database version hardware table size statistics phase of the moon load data distribution
    97. 97. 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

    ×