Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 跟踪应用程序触发订单时执行的所有SQL查询_Oracle_Database Performance_Database Administration_Database Partitioning - Fatal编程技术网

Oracle 跟踪应用程序触发订单时执行的所有SQL查询

Oracle 跟踪应用程序触发订单时执行的所有SQL查询,oracle,database-performance,database-administration,database-partitioning,Oracle,Database Performance,Database Administration,Database Partitioning,我需要收集应用程序在处理任何订单时使用的所有SQL查询(SELECT、UPDATE、DELETE、INSERT) 如果我可以通过应用程序处理至少50个订单的所有SQL,那么在找到这些信息后,我可以检查哪些SELECT、UPDATE、DELETE语句经常使用,哪些表经常被应用程序使用 我可以得出这样的结论:在哪个表上我可以使用分区,就像我通过WHERE子句获得整个SQL一样,我还可以知道哪种类型的分区对于任何特定的表和分区都更好 然而,这似乎是一个繁忙的练习,因为应用程序可能会使用很多SQL,但它

我需要收集应用程序在处理任何订单时使用的所有SQL查询(SELECT、UPDATE、DELETE、INSERT)

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

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

然而,这似乎是一个繁忙的练习,因为应用程序可能会使用很多SQL,但它有助于我理解应用程序,而且在这个练习之后,我将有一份关于我的应用程序行为和数据库的详细报告,供以后的员工使用

为此,到目前为止,我使用了DBMS_adivsor包,它给了我一些要分区的数据库表,当我检查我在DBMS_ADVISOR中使用的SQL解释计划时,我突然想到,在解释计划中,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用户的----

要得到SID和SERAIL#

然后在DBA用户上执行--

在没有dba用户的情况下,我正在使用--

用于跟踪特定用户会话的触发器----

之后,停止跟踪我使用

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

 ALTER SYSTEM SET EVENTS '10046 trace name context off';
正如德里克建议的那样

在此之后,您可能有多个跟踪文件来生成合并跟踪文件,我们可以使用TRCSESS实用程序--

它将为我的案例中生成的所有跟踪文件创建一个跟踪文件net1cm_trcsess.trc(带有跟踪文件标识符net1cm)

现在,我们可以使用TKPROF实用程序生成一个报告,该报告是人类可读的,例如,使用下面的命令---


谢谢

你可以利用
v$sqltext\u的新词、v$SESSION和v$SESSION\u longops
。你可以用谷歌搜索这些词,看看它们是否对你的需求有用。

所以我给你一些建议

您可以对应用程序上下文操作使用多个不同的跟踪,例如插入、删除、更新、选择,甚至所有操作

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

dbms_application_info.set_module(<module_name>,'execute');
然后,当您执行模块或运行要在模块中跟踪的update语句时,您将确保在模块运行之前和之后都执行了此操作

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);
execute DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(9,190,FALSE);
在数据库级别,(您必须非常小心,因为它将生成整个数据库的跟踪,并可以填充oracle数据库上的诊断目录。免责声明:请谨慎使用)

executedbms\u MONITOR.DATABASE\u TRACE\u ENABLE(waits=>TRUE,binds=>TRUE,instance\u name=>”;
执行DBMS\u MONITOR.DATABASE\u TRACE\u DISABLE(实例名称=>'';

您可以使用SQL Profiler此查询在此处是否有用!请参阅编辑的问题谢谢Derek的回复,但我在此处有一个问题,如果没有dbms\u应用程序\u信息。设置\u模块(,“执行”),该怎么办;在我们的PLSQL程序中设置!我需要将它们放在我们的每个过程、函数和包中吗?如果只调用纯SQL,如SELECT、UPDATE、DELETE等,该怎么办@Derek--我在会话中使用execute DBMS_SYSTEM.set_SQL_TRACE_(sid=>3002,串行#=>31833,SQL_TRACE=>true);对会话进行竞争,但我是从一个DBA用户那里进行的,但是当我试图在一个非DBA用户上使用它时,当我忽略这个包并在向用户授予ALETR会话权限后使用ALTER session SET SQL_TRACE=TRUE时,DBMS_系统包会出现错误,但我无法找到文件跟踪文件的名称请对DBA用户执行此操作。您可以在存储过程的开头和结尾使用dbms_application_info.set模块,它将显示上下文(存储应用程序会话信息)在数据库v$sql和v$sqlarea表中。如果在每个存储过程中都设置该值太多工作。您可以在会话中使用DBMS_SYSTEM.SET_sql_TRACE_。跟踪需要DBA权限才能运行。但是,如果您具有OEM_监视器等角色,并且在数据库中安装了诊断包,则可以收集历史记录来自自动工作负载存储库的对象DBA_HIST_SQLSTAT和DBA_HIST_SNAPSHOT table对象的信息。您仍然需要使用dbms_applicaton_info来获取应用程序上下文,但不必使用跟踪来收集DBA_HIST*表中的此信息。正如我前面提到的,在没有tra的情况下cing(这几乎需要DBA),您可以查看v$sql、v$sqlarea(共享池查询)或DBA HIST\u SQLSTAT和DBA HIST\u快照表(历史)获取数据库上运行的所有查询。如果不在存储过程中设置dbms_应用程序_信息,您将不知道它们来自哪些模块。无论如何,如果您需要这些表中的示例,请告诉我。我将发布另一个解决方案。Rega
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';
trcsess output=net1cm_trcsess.trc module="JDBC Thin Client" *net1cm.trc
tkprof net1cm_trcsess.trc OUTPUT=net1cm_trcsess.txt EXPLAIN=netservicos1cm/netservicos1 SYS=NO
dbms_application_info.set_module(<module_name>,'execute');
dbms_application_info.set_module(<module_name>,'UPDATE');
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);
execute DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(9,190,TRUE);
execute DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(9,190,FALSE);
execute DBMS_MONITOR.DATABASE_TRACE_ENABLE(waits=>TRUE, binds=>TRUE, instance_name=>'<Instance_name>');
execute DBMS_MONITOR.DATABASE_TRACE_DISABLE(instance_name=>'<instance_name>');