数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

查找badsql的方法


发布日期:2020年01月31日
 
查找badsql的方法

查找bad sql的方法

查找运行系统里bad sql是一个古老的话题 我们要根据自己的实际情况来分析

绝不能教条的运用下面介绍的这些方法

使用这些SQL语句时会对系统表产生分组操作当然也增大了系统的负载

建议大家在系统启动了一段时间后在半夜负载较轻的时间定时(例如:一个月)来查一查一定要具体问题具体分析

下面是我收藏的一些查找bad sql的方法:

column sql_text format a;

值得怀疑的SQL 来自

select

substr(to_char(spct ) ) || % load

sexecutions executes

psql_text

from

(

select

address

disk_reads

executions

pct

rank() over (order by disk_reads desc) ranking

from

(

select

address

disk_reads

executions

* ratio_to_report(disk_reads) over () pct

from

sysv_$sql

where

command_type !=

)

where

disk_reads > * executions

) s

sysv_$sqltext p

where

sranking <= and

paddress = saddress

order by

saddress ppiece

/

逻辑读多的SQL

select * from (select buffer_gets sql_text

from v$sqlarea

where buffer_gets >

order by buffer_gets desc) where rownum<=;

执行次数多的SQL

select sql_textexecutions from

(select sql_textexecutions from v$sqlarea order by executions desc)

where rownum<;

读硬盘多的SQL

select sql_textdisk_reads from

(select sql_textdisk_reads from v$sqlarea order by disk_reads desc)

where rownum<;

排序多的SQL

select sql_textsorts from

(select sql_textsorts from v$sqlarea order by sorts desc)

where rownum<;

分析的次数太多执行的次数太少要用绑变量的方法来写sql

set pagesize ;

set linesize ;

select substr(sql_text) sql count(*) sum(executions) totexecs

from v$sqlarea

where executions <

group by substr(sql_text)

having count(*) >

order by ;

游标的观察

set pages ;

select sum(avalue) bname

from v$sesstat a v$statname b

where astatistic# = bstatistic#

and bname = opened cursors current

group by bname;

select count() from v$open_cursor;

select user_namesql_textcount() from v$open_cursor

group by user_namesql_text having count()>;

查看当前用户&username执行的SQL

select sql_text from v$sqltext_with_newlines where (hash_valueaddress) in

(select sql_hash_valuesql_address from v$session where username=&username)

order by addresspiece;

上一篇:ORACLE常用傻瓜问题1000问全集(三)

下一篇:超大型ORACLE数据库应用系统的设计