【发布时间】:2015-10-12 06:25:29
【问题描述】:
当通过应用程序处理任何订单时,我需要收集应用程序已使用的所有 SQL 查询(SELECT、UPDATE、DELETE、INSERT)。
如果我可以获取通过应用程序处理的至少 50 个订单的所有 SQL,那么我可以在找到这些信息后检查哪些 SELECT、UPDATE、DELETE 语句经常使用,以及应用程序经常使用哪些表。
我可以得出结论,我可以在哪个表上使用分区,就好像我使用 WHERE 子句获取整个 SQL 一样,我还可以知道哪种类型的分区对于任何特定的表和分区会更好。
然而,这似乎是一个忙碌的练习,因为应用程序可能使用很多 SQL,但它有助于我理解应用程序,而且在这个练习之后,我将获得一份关于我的应用程序行为与数据库的审查报告,这可以是供后来的员工使用。
为此,到目前为止,我使用了 DBMS_adivsor 包,它为我的数据库的一些表进行了分区,当我检查我在 DBMS_ADVISOR 中使用的 SQL 的解释计划时,我突然想到那些表已满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);
或
在我使用的 no-dba 用户上 --
ALTER SESSION SET SQL_TRACE = TRUE;
或
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
谢谢
【问题讨论】:
-
你可以使用 SQL Profiler
标签: oracle database-performance database-administration database-partitioning