1

我需要收集应用程序处理任何订单时应用程序使用的所有SQL查询(SELECT,UPDATE,DELETE,INSERT)。跟踪应用程序触发命令时执行的所有SQL查询

如果我可以通过应用程序处理至少50个订单来获取所有SQL,那么我可以在查找这些信息后检查哪些SELECT,UPDATE,DELETE语句经常使用以及应用程序经常使用哪些表。

我可以得出结论,在哪个表上我可以使用分区,就像我用WHERE子句获得整个SQL一样,我也可以知道哪种类型的分区对于任何特定的表和分区都会更好。

但是,它似乎是一个繁忙的练习,因为可能有很多SQL应用程序使用它,但它有助于我理解应用程序,并且在此练习之后,我将对数据库的应用程序行为进行审查报告被后面的员工使用。

对于这直到现在我已经使用DBMS_adivsor包,它给了我的数据库的一些表进行分区,当我检查我在DBMS_ADVISOR中使用的SQL的EXPLAIN PLAN,然后它发生在我正在EXPLAIN PLAN中的全表扫描DBMS_ADVISOR告诉我对它们进行分区。

问题是我不能根据这些信息对表进行分区,因为它是一个应用程序级别的分区,而且我的经理也不会被这些小信息所证实。所以我想出了上面的计划:(

我需要这样做来找出我可以执行表分区和其他性能调整的东西,如创建索引的表,因为我可以得到where子句与过滤器,所以它像数据库调优,我想这样做,因为这将帮助我成长我的职业生涯中的数据库开发。

请帮我出了这种情况。

将这个查询给我所需要的信息!

select st.command 
    from V$SQLTEXT_WITH_NEWLINES st, SYS.V_$SQL s 
where st.hash_value = s.hash_value 
    and parsing_schema_name = 'NETSERVICOS2CM' 
    and s.module = 'JDBC THIN CLIENT'; 

跟踪非DBA用户的----

GRANT SELECT ON SYS.V_$SESSION TO USER; 

GRANT SELECT ON SYS.V_$MYSTAT TO USER; 

要获得SID和SERAIL#

SELECT sid, serial# FROM SYS.V_$SESSION 

WHERE SID = (SELECT DISTINCT SID FROM SYS.V_$MYSTAT); 

然后在DBA用户执行这个 -

EXEC DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION (sid=>3002, serial#=>31833,sql_trace=> true); 

上没有DBA用户,我使用 -

ALTER SESSION SET SQL_TRACE = TRUE; 

OR

EXEC DBMS_SESSION.set_sql_trace(sql_trace => TRUE); 

触发跟踪会话特定用户----

CREATE OR REPLACE TRIGGER ON_MY_SCHEMA_LOGIN 
AFTER LOGON ON DATABASE 
WHEN (USER = 'NETSERVICOS1CM') 
BEGIN 
    EXECUTE IMMEDIATE 'ALTER SESSION SET TRACEFILE_IDENTIFIER = "net1cm"'; 
    EXECUTE IMMEDIATE 'alter session set statistics_level=ALL'; 
    EXECUTE IMMEDIATE 'alter session set events ''10046 trace name context  forever, level 12'''; 
EXCEPTION 
    WHEN OTHERS THEN 
    NULL; 
END; 

之后停止我正在使用的跟踪

ALTER SESSION SET EVENTS '10046 trace name context off'; 

ALTER SYSTEM SET EVENTS '10046 trace name context off'; 

正如Derek所建议的那样。

此之后,你可能有多个跟踪文件做出巩固跟踪文件,我们可以使用TRCSESS工具 -

trcsess output=net1cm_trcsess.trc module="JDBC Thin Client" *net1cm.trc 

这将创建在我的情况下产生的所有跟踪文件,一个跟踪文件net1cm_trcsess.trc (带有跟踪文件标识符net1cm)。

现在我们可以使用TKPROF工具来生成报告,这是在使用下面的示例命令人类可读的形式---

tkprof net1cm_trcsess.trc OUTPUT=net1cm_trcsess.txt EXPLAIN=netservicos1cm/netservicos1 SYS=NO 

感谢

+0

您可以使用SQL Profiler – HaveNoDisplayName

回答

0

您可以利用v$sqltext_with_newlines ,V$SESSION and v$session_longops。你可以谷歌这些词,看看这些可以用于你的要求。

+0

这个查询将在这里有任何用处!请参阅编辑问题 – mradul

1

所以这里是我的建议。

您可以对应用程序上下文操作使用多个不同的跟踪,例如INSERT,DELETE,UPDATE,SELECT甚至所有操作。

假设你有一个由应用程序运行的PL/SQL程序,或者对数据库有一个OCI调用。您将在模块/存储过程级别具有此oracle代码:

dbms_application_info.set_module(<module_name>,'execute'); 

在执行整个代码之前。 (在BEGIN之后的代码中)。

dbms_application_info.set_module(<module_name>,'UPDATE'); 

你做一个更新SQL语句之前。当你执行模块或运行更新语句

dbms_application_info.set_module(NULL,NULL); 

然后你想在模块中跟踪您将确保:;

要关闭应用程序上下文,你会(年底前)使用你这样做之前和之后模块运行

execute DBMS_MONITOR.SERV_MOD_ACT_TRACE_ENABLE(- 
service_name => '<service_name>', - 
module_name => '<module_name>', - 
action_name => DBMS_MONITOR.ALL_ACTIONS, - 
waits => TRUE, - 
binds => TRUE); 

所有行动将被跟踪,你会确切地知道该语句运行,并执行什么样的行动。

要关闭它:

execute DBMS_MONITOR.SERV_MOD_ACT_TRACE_DISABLE(- 
service_name => '<service_name>', - 
module_name => '<module_name>', - 
action_name => DBMS_MONITOR.ALL_ACTIONS); 

要在会话级别做到这一点,你会怎么做时,9是序列号和100是希德,例如以下。 (检查语法)。

execute DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(9,190,TRUE); 

要关闭它:

execute DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(9,190,FALSE); 

在数据库级别,(你必须要非常小心这一点,因为它会产生对整个数据库跟踪并能填补你的诊断目录在您的oracle数据库上。免责声明:使用注意事项)。

execute DBMS_MONITOR.DATABASE_TRACE_ENABLE(waits=>TRUE, binds=>TRUE, instance_name=>'<Instance_name>'); 
execute DBMS_MONITOR.DATABASE_TRACE_DISABLE(instance_name=>'<instance_name>'); 
+0

感谢Derek的回复,但我在这里有一个问题,如果没有dbms_application_info.set_module(,'execute');在我们的PLSQL程序中设置!我是否需要将它们放入我们的每个程序,函数和包中?如果只有一个纯SQL调用,比如SELECT,UPDATE,DELETE等,那该怎么办? – mradul

+0

@ Derek--我正在使用执行DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(sid => 3002,serial#=> 31833,sql_trace => true);来竞争会议,但我这样做是从一个DBA用户,但是当我试图在NON_DBA用户上使用它时,当我在授予ALETR SESSION权限后忽略此PAKCHGE并使用ALTER SESSION SET SQL_TRACE = TRUE时,它给了我DBMS_SYSTEM包的错误给用户然后它dis,但我无法找到文件跟踪文件的名称,而我可以在DBA用户做任何建议请这样做。 – mradul

+0

您可以在存储过程的开始和结尾使用dbms_application_info.set模块,并将上下文(存储应用程序会话信息)存储在数据库v $ sql和v $ sqlarea表中。如果在每个存储过程中进行设置都是太麻烦了。您可以使用DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION。 –