查询数据库速度慢常用语句

14.6查询数据库速度慢常用语句

14.6.1查询阻塞SQL语句
阻塞是DBA经常碰到的情形,尤其是不良的应用程序设计的阻塞将导致性能严重下降直至数据库崩溃。对DBA而言,有必要知道如何定位到当前系统有哪些阻塞,到底谁是阻塞者,谁是被阻塞者。本节主要介绍阻塞出现后处理的方法。
1.阻塞定义及其类型
阻塞的定义:一个会话持有某个资源的锁,而另一个会话在请求这个资源,就会出现阻塞。也就是说新的会话会被挂起,直到持有锁的会话放弃锁定的资源。大多数情况下,在一个交互式应用中被严重阻塞,即可表明应用逻辑有问题,这才是阻塞的根源。
数据库中常见的DML语句可能会阻塞,即:INSERT、UPDATE、DELETE、MERGE 和SELECT FOR UPDATE。
2.不同类型阻塞的处理办法:
INSERT阻塞主要是由于有一个带主键的表,或者表上有惟一的约束,在两个会话试图用同样的值插入一行数据时引发阻塞。多表通过引用完整性约束相互链接时,在其依赖的父表正在创建或删除期间,对子表的插入可能会阻塞。对于该类情形建议使用序列来生成主键唯一列值。
对于UPDATE、DELETE、MERGE 和SELECT FOR UPDATE阻塞,只要有任一会话使用这些操作已经锁定行,其余的必须处于等待状态。直到当前锁定行上的锁(排他锁)释放。对于该类情形,建议尽可能快速提交事务,或采用批量SQL方式提交。
【例14-4】写出查询数据库阻塞的代码。
具体代码如下:
–第十四章\yhgl.sql

select
blocksession.sid as block_session_sid,
blocksession.serial# as block_session_serial#,
blocksession.username as block_session_username,
blocksession.osuser as block_session_osuser,
blocksession.machine as block_session_machine,
blocksession.status as block_session_status,
blockobject.object_name as blocked_table,
waitsession.sid as wait_session_sid,
waitsession.serial# as wait_session_serial#,
waitsession.username as wait_session_username,
waitsession.osuser as wait_session_osuser,
waitsession.machine as wait_session_machine,
waitsession.status as wait_session_status
from
v l o c k b l o c k l o c k , v lock blocklock, v lockblocklockvlock waitlock,
v s e s s i o n b l o c k s e s s i o n , v session blocksession, v sessionblocksessionvsession waitsession,
v$locked_object lockedobject,
dba_objects blockobject
where
blocklock.block = 1
and blocklock.sid != waitlock.sid
and blocklock.id1 = waitlock.id1
and blocklock.id2 = waitlock.id2
and blocklock.sid = blocksession.sid
and waitlock.sid = waitsession.sid
and lockedobject.session_id = blocksession.sid
and lockedobject.object_id = blockobject.object_id;

14.6.2查询表空间使用率
【例14-5】当系统变慢时,写查询表空间的使用率语句。
具体代码如下:
–第十四章\yhgl.sql

select * from (
Select a.tablespace_name,
to_char(a.bytes/1024/1024,‘99,999.999’) total_bytes,
to_char(b.bytes/1024/1024,‘99,999.999’) free_bytes,
to_char(a.bytes/1024/1024 - b.bytes/1024/1024,‘99,999.999’) use_bytes,
to_char((1 - b.bytes/a.bytes)100,‘99.99’) || ‘%’ use
from (select tablespace_name,
sum(bytes) bytes
from dba_data_files
group by tablespace_name) a,
(select tablespace_name,
sum(bytes) bytes
from dba_free_space
group by tablespace_name) b
where a.tablespace_name = b.tablespace_name
union all
select c.tablespace_name,
to_char(c.bytes/1024/1024,‘99,999.999’) total_bytes,
to_char( (c.bytes-d.bytes_used)/1024/1024,‘99,999.999’) free_bytes,
to_char(d.bytes_used/1024/1024,‘99,999.999’) use_bytes,
to_char(d.bytes_used
100/c.bytes,‘99.99’) || ‘%’ use
from
(select tablespace_name,sum(bytes) bytes
from dba_temp_files group by tablespace_name) c,
(select tablespace_name,sum(bytes_cached) bytes_used
from v$temp_extent_pool group by tablespace_name) d
where c.tablespace_name = d.tablespace_name
) ;

执行后,如图14-6所示。

图14-6 查询最耗时的SQL
14.6.3查询耗时SQL语句和执行SQL语句执行时间
【例14-6】当系统变慢时,写可以查询系统中耗时的SQL 语句。
具体代码如下:

–第十四章\yhgl.sql

select *
from ( select sa.SQL_TEXT,
sa.SQL_FULLTEXT,
sa.EXECUTIONS “执行次数”,
round(sa.ELAPSED_TIME / 1000000, 2) “总执行时间”,
round(sa.ELAPSED_TIME / 1000000 / sa.EXECUTIONS, 2) “平均执行时间”,
sa.COMMAND_TYPE,
sa.PARSING_USER_ID “用户ID”,
u.username “用户名”,
sa.HASH_VALUE
from v$sqlarea sa
left join all_users u
on sa.PARSING_USER_ID = u.user_id
where sa.EXECUTIONS > 0
order by (sa.ELAPSED_TIME / sa.EXECUTIONS) desc)
where rownum <= 50;

执行后,如图14-7所示。

图14-7 查询最耗时的SQL
【例14-7】查询SQL语句执行的耗时的语句。
代码如下:
–第十四章\yhgl.sql

select *
from ( select s.SQL_TEXT,
s.EXECUTIONS “执行次数”,
s.PARSING_USER_ID “用户名”,
rank() over( order by EXECUTIONS desc) EXEC_RANK
from v$sql s
left join all_users u
on u.USER_ID = s.PARSING_USER_ID) t
where exec_rank <= 100;

执行后,如图14-8所示。

你可能感兴趣的:(oracle,数据库,sql)