If the application runs slowly, but you're only using 5% of the available CPU, the application/database is spending lots of time doing "something else".
This something else could be any combination of
- Disk I/O
- Network
- Blocking sessions
- Running application code
- ...
To figure out where the time is going, profile your application!
You can do this with SQL trace like so:
alter session set tracefile_identifier = app_trace;
exec sys.dbms_monitor.session_trace_enable ( session_id => :session, serial_num => :serial#, waits => true, binds => true );
... capture execution details ...
exec sys.dbms_monitor.session_trace_disable ( session_id => :session, serial_num => :serial# );
Then get the trace file from the database server with TKPROF (or other tool of your choice). Read more about how to do this at:
https://blogs.oracle.com/sql/how-to-create-an-execution-plan#tkprof Or if you're calling PL/SQL, you could use the hierarchical profiler:
https://oracle-base.com/articles/11g/plsql-hierarchical-profiler-11gr1 Once you have these profiles, you can see where the system is spending all its time. Without this, all we can do is give blind guesses (which will probably be wrong).
If you need help understanding the output of the above, post them as a review here and we'll see how we can help.