Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to see the actual Oracle SQL statement that is being executed

Tags:

sql

oracle

I'm using a custom-built inhouse application that generates a standard set of reports on a weekly basis. I have no access to the source code of the application, and everyone tells me there is no documentation available for the Oracle database schema. (Aargh!)

I've been asked to define the specs for a variant of an existing report (e.g., apply additional filters to constrain the data set, and modify the layout slightly). This sounds simple enough in principle, but is difficult without any existing documentation.

It's my understanding that the logs can't help me because the report only queries the database; it does not actually insert, delete, or update database values, so there is nothing to log (is this correct?).

So my question is this: is there a tool or utility (Oracle or otherwise) that I can use to see the actual SQL statement that is being executed while the report generation job is still running? I figure, if I can see what tables are actually being accessed to produce the existing report, I'll have a very good starting point for exploring the schema and determining the correct SQL to use for my own report.

like image 603
mdy Avatar asked Sep 11 '08 06:09

mdy


People also ask

How do you check which SQL statements are running in Oracle?

The following query may give you the list of running SQL ( SQL_ID ) from Active Sessions: select inst_id, program, module, SQL_ID, machine from gv$session where type!=

How can I track the execution of PL SQL and SQL?

You can use SQL trace to capture execution stats for a procedure. But this only gathers SQL execution details. If you want to know details of the PL/SQL execution, you can use the hierarchical profiler.

What happens when a query is executed in Oracle?

Execute Phase - During the execute phase, Oracle executes the statement, reports any possible errors, and if everything is as it should be, forms the result set. Unless the SQL statement being executed is a query, this is the last step of the execution.


1 Answers

On the data dictionary side there are a lot of tools you can use to such as Schema Spy

To look at what queries are running look at views sys.v_$sql and sys.v_$sqltext. You will also need access to sys.all_users

One thing to note that queries that use parameters will show up once with entries like

and TABLETYPE=’:b16’ 

while others that dont will show up multiple times such as:

and TABLETYPE=’MT’ 

An example of these tables in action is the following SQL to find the top 20 diskread hogs. You could change this by removing the WHERE rownum <= 20 and maybe add ORDER BY module. You often find the module will give you a bog clue as to what software is running the query (eg: "TOAD 9.0.1.8", "JDBC Thin Client", "runcbl@somebox (TNS V1-V3)" etc)

SELECT   module,   sql_text,   username,   disk_reads_per_exec,   buffer_gets,   disk_reads,   parse_calls,   sorts,   executions,   rows_processed,   hit_ratio,   first_load_time,   sharable_mem,   persistent_mem,   runtime_mem,   cpu_time,   elapsed_time,   address,   hash_value  FROM    (SELECT    module,     sql_text ,     u.username ,     round((s.disk_reads/decode(s.executions,0,1, s.executions)),2)  disk_reads_per_exec,     s.disk_reads ,     s.buffer_gets ,     s.parse_calls ,     s.sorts ,     s.executions ,     s.rows_processed ,     100 - round(100 *  s.disk_reads/greatest(s.buffer_gets,1),2) hit_ratio,     s.first_load_time ,     sharable_mem ,     persistent_mem ,     runtime_mem,     cpu_time,     elapsed_time,     address,     hash_value    FROM    sys.v_$sql s,     sys.all_users u    WHERE    s.parsing_user_id=u.user_id     and UPPER(u.username) not in ('SYS','SYSTEM')    ORDER BY    4 desc)  WHERE  rownum <= 20; 

Note that if the query is long .. you will have to query v_$sqltext. This stores the whole query. You will have to look up the ADDRESS and HASH_VALUE and pick up all the pieces. Eg:

SELECT  * FROM  sys.v_$sqltext WHERE  address = 'C0000000372B3C28'  and hash_value = '1272580459' ORDER BY   address, hash_value, command_type, piece ; 
like image 113
Mark Nold Avatar answered Oct 14 '22 07:10

Mark Nold