如何通过跟踪客户端程序发出的sql的方法来优化SQL

简要说来,跟踪一个客户程序发出的SQL主要分成下面几步:

1) 识别要跟踪的客户端程序到数据库的连接(后面都用session代替),主要找出能唯一识别一个session的sid与serial#.

2) 设定相应的参数,如打开时间开关(可以知道一个sql执行了多长时间),存放跟踪数据的文件的位置、最大值。

3) 启动跟踪功能

4) 让系统运行一段时间,以便可以收集到跟踪数据

5) 关闭跟踪功能

6) 格式化跟踪数据,得到我们易于理解的跟踪结果。

现在就每一步,给出详细的说明:

1) 识别要跟踪的客户端程序到数据库的数据库连接

查询session信息(在sql*plus中运行):

set linesize 190

col machine format a30 wrap

col program for a40

col username format a15 wrap

set pagesize 500

select s.sid sid, s.SERIAL# "serial#", s.username, s.machine, s.program,

p.spid ServPID, s.server

from v$session s, v$process p

where p.addr = s.paddr ;

如得到的一个查询结果如下:

SID serial# USERNAME MACHINE PROGRAM SERVPID SERVER

---- ------- -------- ------------------ ------------- --------- ---------

8 3 SCOTT WORKGROUP\SUNNYXU SQLPLUS.EXE 388 DEDICATED

LOGON_TIME

------------------

2005.06.28 18:50:11

上面的结果中比较有用的列为:

sid, serial# : 这两个值联合起来唯一标识一个session

username : 程序连接数据库的用户名

machine : 连接数据库的程序所在的机器的机器名,可以hostname得到

program : 连接数据库的程序名,所有用java jdbc thin的程序的名字都一样,

servpid : 与程序对应的服务器端的服务器进程的进程号,在unix下比较有用

server : 程序连接数据库的模式:专用模式(dedicaed)、共享模式(shared)。

只有在专用模式下的数据库连接,对其进程跟踪才有效

logon_time : 程序连接数据库的登陆时间

根据machine, logon_time 可以方便的识别出一个数据库连接对应的session,从而得到该sesion的唯一标识sid, serial#, 为对该session进行跟踪做好准备

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/basis/

2) 设定相应的参数

参数说明:

timed_statistics : 收集跟踪信息时,是否将收集时间信息,如果收集,

则可以知道一个sql的各个执行阶段耗费的时间情况

user_dump_dest : 存放跟踪数据的文件的位置

max_dump_file_size : 放跟踪数据的文件的最大值,防止由于无意的疏忽,

使跟踪数据的文件占用整个硬盘,影响系统的正常运行

设置的方法:

SQL> exec sys.dbms_system.set_bool_param_in_session( -

sid => 8, -

serial# => 3, -

parnam => 'timed_statistics', -

bval => true);

SQL> alter system set user_dump_dest='c:\temp';

-- 注意这个语句会改变整个系统的跟踪文件存放的位置,所以我一般不改这个参数,而用系统的缺省值,要查看当前系统的该参数的值,可以用system用户登陆后:

SQL> show parameter user_dump_dest

SQL> exec sys.dbms_system.set_int_param_in_session( -

sid => 8, -

serial# => 3, -

parnam => 'max_dump_file_size', -

intval => 2147483647)

3) 启动跟踪功能

SQL> exec sys.dbms_system.set_sql_trace_in_session(8, 3, true);

注意,只有跟踪的session再次发出sql语句后,才会产生trc文件

4) 让系统运行一段时间,以便可以收集到跟踪数据

5) 关闭跟踪功能

SQL> exec sys.dbms_system.set_sql_trace_in_session(8,3,false);

6) 格式化跟踪数据,得到我们易于理解的跟踪结果。

对产生的trace文件进行格式化:

在命令提示符下,运行下面的命令

tkprof dsdb2_ora_18468.trc dsdb2_trace.out SYS=NO EXPLAIN=SCOTT/TIGER

时间: 2024-11-10 07:49:32

如何通过跟踪客户端程序发出的sql的方法来优化SQL的相关文章

Spark程序运行常见错误解决方法以及优化

一.org.apache.spark.shuffle.FetchFailedException 1.问题描述 这种问题一般发生在有大量shuffle操作的时候,task不断的failed,然后又重执行,一直循环下去,非常的耗时. 2.报错提示 (1) missing output location org.apache.spark.shuffle.MetadataFetchFailedException: Missing an output location for shuffle 0  (2)

一个客户端程序,有自己的数据库文件,当程序需要升级并且更改数据结构时,SQL语句应该放在哪里执行?

问题描述 一个客户端程序,有自己的数据库文件,当程序需要升级并且更改数据结构时,SQL语句应该放在哪里执行? 如题,开发了一个windows客户端的程序,使用了SQLITE作为数据库,setting.db就是数据库文件.由于客户端升级有时需要更改数据结构,比如加个字段什么的,这个时候就有个问题了,如果要让升级之后原来的数据库文件还能用,需要执行一次更改数据结构的SQL,但是这个更改数据结构的SQL应该放在哪里执行?才能确保它能被执行并且只被执行一次? 解决方案 不知道描述清了没,就是类似发一条S

客户端程序-求类似淘宝调用阿里旺旺.exe的java实现

问题描述 求类似淘宝调用阿里旺旺.exe的java实现 网上找了一些java调用客户端的程序的代码,这样只能调用程序本地的客户端, Runtime rn = Runtime.getRuntime(); Process p = null; String exeFile = ""; try{ exeFile = "D:EditPlus 2editplus.exe"; p = rn.exec(exeFile);问题: 用户怎么能访问javaweb应用的时候,调用自己本地安

在WebLogic下ejb的客户端程序的形式和特点

web|程序|客户端 对于weblogic的客户端程序可以是JSP/servlet,也可以是Application的.1)jsp/servlet与EJB运行在同一个应用服务器上,其典型代码可如下:(无须建立t3协议下的连接,直接由客户端完成)                   Context ctx=new InitialContext();                 Object obj =ctx.lookup("ejb/com/J2EE/first/ejb/HelloHome&quo

在ASP程序应注意的问题---开发连接远程SQL Server

server|程序|问题 Microsoft SQL Server7.0是一种大型.分布式数据库系统,也可被认为是一种大型.分布式数据仓库.由于其与Windows NT和BackOffice以及Visual Studio具有紧密的配合,已被越来越多的网络应用系统所采用.而ASP程序也以其和NT的紧密连接,可使用ActiveX对象.CGI接口对象化等特点向CGI程序发起了有力的挑战.下面,就谈谈开发连接远程SQL Server 的ASP程序应注意的几个问题. SQL Server是一个十分注重安全

客户端程序和web程序的紧密结合-谈AmazeU.net的设计构想

web|程序|客户端|设计 由于作者水平有限,如有不妥之处,请见谅. 毫无疑问,web应用是将来的一个大的趋势,因为B/S结构相对于传统的客户端程序来说,有以下几大优点:1.B/S 结构是基于浏览器的, 有比较丰富和生动的表现方式. 并且难度较低,开发成本较小. 2.B/S 结构的对象大多是整个互联网的用户,范围相当大.3.B/S 结构系统安装和维护比较方便,不需要每个用户都安装和打升级补丁. 但同时我们也要看到,web方式有着先天缺陷:1.响应速度较慢.即使是完全一样的信息,用户每次都需要从服

请教如何改善C#中socket通信机客户端程序的健壮性

程序|客户端   我是做Socket的新手,最近做了一个Socket客户端程序,连接Server的时候,如果server存在,并且允许连接的话,程序无错,正常执行:但是如果Server不存在,或者拒绝连接,程序就会卡住,此时不提示出错.开始我以为是没有Catch异常,但是检查了程序,异常情况都Catch掉了,程序还是卡. 请各位大虾帮忙指正!谢谢,以下是我这个模块的代码! using System;using System.Collections;using System.ComponentMo

Udp的服务器程序和客户端程序

//服务器程序: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #define PORT 8082 #define BUFSIZE 512 char buf[BUFSIZE+

Tcp多线程服务器和客户端程序

//服务器程序: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #define PORT 8082 #define BUFSIZE 512 char buf[BUFSIZE+