`
zhanglei_2008
  • 浏览: 27054 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

oracle优化与管理SQL

阅读更多
1.查看当前正在执行的等待情况
SELECT TA.sid            ,
       TA.seq#           ,
       TB.Username       ,
       TB.Terminal       ,
       TB.Program        ,
       Decode(TB.Command,0 ,'[ 0] NoCommand',
                         1 ,'[ 1] CreateTable',
                         2 ,'[ 2] Insert',
                         3 ,'[ 3] Select',
                         6 ,'[ 6] Update',
                         7 ,'[ 7] Delete',
                         9 ,'[ 9] CreateIndex',
                         15,'[15] AlterTable',
                         21,'[21] CreateView',
                         23,'[23] ValidateIndex',
                         35,'[35] AlterDatabase',
                         39,'[39] CreateTablespace',
                         41,'[41] DropTablespace',
                         40,'[40] AlterTablespace',
                         53,'[53] DropUser',
                         62,'[62] AnalyzeTable',
                         63,'[63] AnalyzeIndex',
                         TB.Command || 'ther') Command,
       DECODE(TA.event,'db file scattered read','通表扫描',
                       'db file sequential read','索引扫描',
                       'latch free','latch contention',
                       'free buffer waits','等待DBWR 清除弄脏块',
                       'log file sync','LGWR写COMMIT或ROLLBACK数据',
                       'write complete waits','等待DBWR写',
                       'buffer busy wait','可能是FreeList竞争',
                       TA.event) Event,
       TA.p1text,TA.p1    ,TA.p1raw ,
       TA.p2text,TA.p2    ,TA.p2raw ,
       TA.p3text,TA.p3    ,TA.p3raw ,
       TA.wait_time      ,
       TA.seconds_in_wait,
       TA.state,
       TB.sql_address,
       TB.sql_hash_value
  FROM v$session_wait TA,
       v$session      TB
WHERE --TB.terminal='FUTURE-MGET' AND
       TA.SID = TB.SID AND
       TA.event NOT LIKE '% timer' AND
       TA.event NOT LIKE 'rdbms ipc message' AND
       TA.event NOT LIKE 'SQL*Net %'
2.查看连接等待事件
SELECT Sid || ' ' || Event || ' ' || Total_Waits || ' ' || Average_Wait
  FROM V$session_Event
WHERE Sid = &上面的SID
3.每个用户命中率(命中率应该超过90%)
SELECT TA.Sid           "连接ID",
       username         "用户名",
       consistent_gets  "读一致性",
       block_gets       "缓冲区读",
       physical_reads   "物理读",
       100*(consistent_gets+block_gets-physical_reads)/(consistent_gets+block_gets) hiratio,
       TA.sql_address,
       TA.sql_hash_value
  FROM v$session TA,
       v$sess_io TB
WHERE TA.sid=TB.sid
   AND (consistent_gets+block_gets)>0
   AND username IS NOT NULL
ORDER BY 6 ASC;
4.查询耗资源的SQL
SELECT ADDRESS,HASH_VALUE,
       SUBSTR(SQL_TEXT, 1, 20) TEXT,
       BUFFER_GETS,
       EXECUTIONS,
       BUFFER_GETS / EXECUTIONS AVG
  FROM V$SQLAREA
WHERE EXECUTIONS > 0
   AND BUFFER_GETS > 100000
ORDER BY 6;
5.查询耗CPU资源的SQL
SELECT SS.SID,
       Decode(SE.Command,0 ,'[ 0] NoCommand',
                         1 ,'[ 1] CreateTable',
                         2 ,'[ 2] Insert',
                         3 ,'[ 3] Select',
                         6 ,'[ 6] Update',
                         7 ,'[ 7] Delete',
                         9 ,'[ 9] CreateIndex',
                         15,'[15] AlterTable',
                         21,'[21] CreateView',
                         23,'[23] ValidateIndex',
                         35,'[35] AlterDatabase',
                         39,'[39] CreateTablespace',
                         41,'[41] DropTablespace',
                         40,'[40] AlterTablespace',
                         53,'[53] DropUser',
                         62,'[62] AnalyzeTable',
                         63,'[63] AnalyzeIndex',
                         SE.Command || 'ther'),
       SS.VALUE CPU,
       SE.USERNAME,
       SE.PROGRAM,
       SE.sql_address,
       SE.sql_hash_value
  FROM V$SESSTAT SS, V$SESSION SE
WHERE SS.STATISTIC# IN
       (SELECT STATISTIC#
          FROM V$STATNAME
         WHERE NAME = 'CPU used by this session')
   AND SE.SID = SS.SID
   AND SS.SID > 6
ORDER BY SS.SID;
6.v$session中的列部分说明
0 - WAITING (当前等待的 Session)
-2 - WAITED UNKNOWN TIME (最后等待持续时间未知)
-1 - WAITED SHORT TIME (最后的等待 <1/100 秒)
>0 - WAITED KNOWN TIME (WAIT_TIME = 最后等待持续时间)

STATUS VARCHAR2(8) Status of the session:
ACTIVE - Session currently executing SQL
INACTIVE - sql及其session没有释放或正常退出......
KILLED - Session marked to be killed
CACHED - Session temporarily cached for use by Oracle*XA
SNIPED - Session inactive, waiting on the client
7.根据上面的地址找对应的SQL
SELECT *
  FROM v$sqltext
WHERE address=HexToRaw('0700000036D20268')
   AND hash_value=2348072240
ORDER BY address,hash_value,piece;
--或者
SELECT *
  FROM v$sqlarea
WHERE address=HexToRaw('0700000036D20268')
   AND hash_value=2348072240
ORDER BY address,hash_value;

HexToRaw('0700000036D20268')和hash_value=2348072240
对应的是v$session中的sql_address,sql_hash_value,
这两个值分别在楼上的SQL中有取出
8.根据ID找SQL
SELECT tb.command_type,
       Tb.Piece,
       Tb.Sql_Text
  FROM V$open_Cursor Ta,
       V$sqltext     Tb
WHERE Ta.Sid = &SID
   AND Ta.Address = Tb.Address
   AND Ta.Hash_Value = Tb.Hash_Value
ORDER BY Tb.Address,
          Tb.Hash_Value,
          Tb.Piece ASC;
9.寻找没有使用绑定变量的sql语句
SELECT Plan_Hash_Value,
       COUNT(*)
  FROM V$sql
WHERE Plan_Hash_Value <> 0
GROUP BY Plan_Hash_Value
ORDER BY 2 DESC;
10.查询正打开的游标
SELECT User_Name,
       Sql_Text   
  FROM V$open_Cursor   
WHERE Sid IN (SELECT Sid
                 FROM (SELECT Sid,
                              Serial#,
                              Username,
                              Program   
                         FROM V$session   
                        WHERE Status = 'ACTIVE'))

子查询
SELECT Sid,
       Serial#,
       Username,
       Program   
  FROM V$session   
WHERE Status = 'ACTIVE'
查出的是不活动的session的sid
10.锁表检查
锁与等待,如果发生了锁等待,我们可能更想知道是谁锁了表而引起谁的等待以下的语句可以
查询到谁锁了表,而谁在等待。
SELECT /*+ rule */
       LPAD(' ', DECODE(L.XIDUSN, 0, 3, 0)) || L.ORACLE_USERNAME USER_NAME,
       O.OWNER,
       O.OBJECT_NAME,
       O.OBJECT_TYPE,
       --DECODE(L.TYPE, 'TM', 'TABLE LOCK', 'TX', 'ROW LOCK', NULL) LOCK_LEVEL,
       Decode(L.Locked_Mode,0,'[0] none',
                            1,'[1] null 空',
                            2,'[2] Row-S 行共享(RS):共享表锁,sub share ',
                            3,'[3] Row-X 行独占(RX):用于行的修改,sub exclusive ',
                            4,'[4] Share 共享锁(S):阻止其他DML操作,share',
                            5,'[5] S/Row-X 共享行独占(SRX):阻止其他事务操作,share/sub exclusive ',
                            6,'[6] exclusive 独占(X):独立访问使用,exclusive ',
                            '['||L.Locked_Mode||'] Other Lock') LockMode,
       S.SID,
       S.SERIAL#,
       S.sql_address,
       S.sql_hash_value
  FROM V$LOCKED_OBJECT L, DBA_OBJECTS O, V$SESSION S
WHERE L.OBJECT_ID = O.OBJECT_ID
   AND L.SESSION_ID = S.SID
ORDER BY O.OBJECT_ID, XIDUSN DESC;
11.锁类型检查
用户锁,数据库的锁有的时候是比较耗费资源的,特别是发生锁等待的时候,我们必须找到发生
等待的锁,有可能的话,杀掉该进程。
  
  这个语句将查找到数据库中所有的DML语句产生的锁,还可以发现,任何DML语句其实产生了两个锁,
一个是表锁,一个是行锁。
  
  可以通过《删除回话及进程》来杀掉会话
  
SELECT /*+ rule */
       S.USERNAME,
       DECODE(L.TYPE, 'TM', 'TABLE LOCK', 'TX', 'ROW LOCK', NULL) LOCK_LEVEL,
       Decode(L.LMode,0,'[0] none',
                      1,'[1] null 空',
                      2,'[2] Row-S 行共享(RS):共享表锁,sub share ',
                      3,'[3] Row-X 行独占(RX):用于行的修改,sub exclusive ',
                      4,'[4] Share 共享锁(S):阻止其他DML操作,share',
                      5,'[5] S/Row-X 共享行独占(SRX):阻止其他事务操作,share/sub exclusive ',
                      6,'[6] exclusive 独占(X):独立访问使用,exclusive ',
                      '['||L.LMode||'] Other Lock') LockMode,
       O.OWNER,
       O.OBJECT_NAME,
       O.OBJECT_TYPE,
       S.SID,
       S.SERIAL#,
       S.TERMINAL,
       S.MACHINE,
       S.PROGRAM,
       S.OSUSER,
       S.sql_address,
       S.sql_hash_value
  FROM V$SESSION S, V$LOCK L, DBA_OBJECTS O
WHERE L.SID = S.SID
   AND L.ID1 = O.OBJECT_ID(+)
   AND S.USERNAME IS NOT NULL
12.当前用户排序情况
SELECT s.sid    "连接ID",
       machine  "对方机器",username "系统用户",
       program  "应用程序",osuser   "登陆系统用户",
       sd.VALUE "磁盘排序",sm.VALUE "内存排序",
       sr.VALUE "排序行数",
       Round(sm.VALUE/Decode(Sign(sm.VALUE+sr.VALUE),0,NULL,(sm.VALUE+sr.VALUE)*100),4) "排序效率(%)",
       s.sql_address,
       s.sql_hash_value
  FROM v$session s,
       v$sesstat sd,
       v$sesstat sm,
       v$sesstat sr
WHERE s.sid = sd.sid AND
       s.sid = sm.sid AND
       s.sid = sr.sid AND
       sd.statistic# = 101 AND
       sm.statistic# = 100 AND
       sr.statistic# = 102 AND
       s.TYPE != 'BACKGROUND'
ORDER BY 6 Desc;
13.检查文件物理IO读写
SELECT name,phyrds,phywrts
         FROM v$datafile TA,
              v$filestat TB
        WHERE TA.file#=TB.File#
将读写比较多的文件放到速度比较快的硬盘上
或者将集中读写的文件分布到不同的硬盘上
14.优化日志缓存
日志高速缓存:
=================================================================================
SELECT Latch                          "Latch",
       Gets                           "成功",
       misses                         "失败",
       immediate_gets                 "立即成功",
       immediate_misses               "立即失败",
       IGetsHitRatio                  "IGets Hit Ratio (%)",
       GetsHitRatio                   "Gets Hit Ratio (%)",
       DECODE(Sign(GetsHitRatio-99),1,'正常','请增加log_buffer') "争用",
       DECODE(Sign(GetsHitRatio-99),1,'正常','请增加log_buffer') "立即争用"
  FROM (SELECT Substr(name,1,20)              Latch,
               gets                           Gets,
               misses                         misses,
               immediate_gets                 immediate_gets,
               immediate_misses               immediate_misses,
               Round(100*(1-immediate_misses/Decode(immediate_misses+immediate_gets,0,NULL,immediate_misses+immediate_gets)),2) IGetsHitRatio,
               Round(100*(1-misses/Decode(misses+gets,0,NULL,misses+gets)),2) GetsHitRatio
          FROM v$Latch
         WHERE name like '%redo%')
如果失败超过成功的1%,就可能出现Redo allocation和/或Redo Copy Latch争用,减少或消除
此争用是内存调整进程的一部分。


--查看日志缓冲区大小【三个值可能不一样V$parameter是初始化值】
SELECT Substr(NAME, 1, 10) NAME,
       Substr(VALUE, 1, 10) VALUE
  FROM V$parameter
WHERE NAME = 'log_buffer';

SELECT * FROM v$sgastat WHERE pool IS NULL

SELECT * FROM v$sga;
分享到:
评论

相关推荐

    ORACLE SQL性能优化系列

    ORACLE SQL性能优化是数据库管理员和开发者非常关心的一个话题。为了提高数据库的性能,ORACLE 提供了多种优化技术。下面我们将详细介绍 ORACLE SQL 性能优化系列中的一些重要知识点。 一、访问表的方式 ORACLE ...

    高清完整版 Oracle 高性能SQL引擎剖析SQL优化与调优机制详解

    Oracle的SQL优化与调优机制复杂多样,涵盖了从SQL语句的编写、执行计划的选择、到资源管理的全方位调优方法。为了深入理解Oracle SQL优化与调优机制,需要掌握以下几个核心知识点。 首先,要掌握Oracle SQL的基本...

    SQL优化 SQL优化软件 SQL优化工具

    SQL优化是数据库管理中的关键环节,它涉及到提升查询性能、减少资源消耗以及改善系统整体效率。SQL优化软件和工具能够帮助数据库管理员(DBA)和开发人员找出性能瓶颈,优化查询逻辑,从而提高数据库系统的响应速度...

    oracle性能优化之SQL语句优化

    `optimizer_mode`参数的`CHOOSE`和`RULE`选项在Oracle 10g中已被淘汰,取而代之的是`ALL_ROWS`、`FIRST_ROWS`、`FIRST_ROWS_N`等优化目标,这些目标分别针对整体查询性能、快速返回第一条记录和平衡首行与总行数的...

    ORACLE-SQL性能优化大全.pdf

    ### ORACLE-SQL性能优化大全知识点详述 #### 一、优化基础知识概述 - **性能管理**: - **尽早开始**:性能优化应该在项目的早期就开始考虑,而不是等到后期出现性能瓶颈时才去处理。 - **设立合适目标**:设定...

    Oracle 11g-SQL-优化

    3. 优化器的使用:Oracle优化器负责生成执行计划,决定如何以最有效的方式访问数据库中的数据。理解优化器的工作原理及其优化模式(如ALL_ROWS、FIRST_ROWS、FIRST_ROWS_n等)对于编写和调优SQL语句至关重要。 4. ...

    Oracle 高性能SQL优化(ppt)

    Oracle数据库的高性能SQL优化是确保系统高效运行的关键环节。SQL优化涉及多个层面,包括设计、开发、测试和运行维护阶段,旨在提高吞吐量,减少响应时间,以满足业务需求。 首先,Oracle性能管理分为主动和被动两种...

    《基于Oracle的SQL优化》PDF版本下载.txt

    通过对《基于Oracle的SQL优化》一书的学习,我们可以了解到SQL优化不仅是数据库管理员的基本技能之一,也是每个开发人员都应该掌握的重要知识。通过采用合适的方法和技术,我们可以在很大程度上提升数据库系统的整体...

    通过分析SQL语句的执行计划优化SQL

    本文档主要介绍了与SQL调整有关的内容,涉及多个方面:SQL语句执行的过程、ORACLE优化器、表之间的关联、如何得到SQL执行计划、如何分析执行计划等内容。通过从浅入深的方式了解SQL优化的过程,使大家逐步步入SQL...

    ORACLESQL性能优化.pptx

    Oracle SQL 性能优化是数据库管理中非常重要的一环。通过对 SQL 语句执行的过程、Oracle 优化器、表之间的关联、如何得到 SQL 执行计划、如何分析执行计划等内容的讨论,可以逐步掌握 SQL 优化的过程。 在 SQL ...

    oracle之SQL优化

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统之一,SQL(结构化查询语言)是与数据库交互的基础工具。在Oracle环境中,SQL优化对于提升系统性能、减少资源消耗至关重要。本篇文章将深入探讨Oracle中的SQL...

    Oracle 高性能SQL引擎剖析:SQL优化与调优机制详解

    Oracle数据库的性能优化直接关系到系统的运行效率,而影响数据库性能...《Oracle 高性能SQL引擎剖析:SQL优化与调优机制详解》内容丰富且深入,破解了Oracle技术的很多秘密,适合Oracle数据库管理员、应用开发人员参考。

    Oracle_SQL优化脚本_完整实用资源

    Oracle SQL优化是数据库管理员和开发人员提升系统性能的关键技能之一。这个"Oracle_SQL优化脚本_完整实用资源"压缩包包含了一系列工具和方法,旨在帮助你优化在Oracle数据库上运行的SQL查询,从而提高数据库的响应...

    Oracle 高性能SQL优化

    Oracle数据库的高性能SQL优化是数据库管理员和开发人员关注的关键领域,因为它直接影响到系统的响应时间和整体性能。Oracle性能管理是一个持续的过程,包括主动和被动两个方面。主动性能管理强调在系统设计和开发...

    ORACLE SQL优化工具sqlhc

    Oracle SQL优化是数据库管理中的关键任务,用于提升查询性能,减少资源消耗,进而改善整体系统效率。`SQLHC`(SQL Health Check)是Oracle提供的一种实用工具,它可以帮助DBA(数据库管理员)诊断和优化SQL语句。在...

    oracle sql优化

    在Oracle数据库环境中,SQL优化是提升系统...理解并应用上述知识点,能够帮助你更好地管理和优化你的Oracle数据库,实现更高效的SQL执行。通过持续学习和实践,你可以逐步掌握这个领域的精髓,提升你的数据库管理能力。

    大道相通,得鱼忘筌 - 从Oracle的SQL优化到MySQL的SQL优化.pdf

    在数据库管理与优化领域,SQL优化是至关重要的一环,它涉及到数据库性能的提升以及系统资源的有效利用。在不同数据库管理系统(DBMS)之间,如从Oracle迁移到MySQL,虽然两个系统有着各自的特性,但是优化的核心思想...

    Oracle的SQL监视工具SQLTracker

    Oracle的SQL监视工具SQLTracker是一款强大的性能分析工具,专为数据库管理员和开发人员设计,用于诊断和优化SQL查询性能。这款工具在Oracle数据库环境中扮演着重要角色,它可以帮助用户实时监控SQL语句的执行情况,...

    ORACLE_SQL性能优化(全).ppt

    Oracle优化器** Oracle的优化器负责选择执行计划,常见的有基于规则的优化器(RBO)和成本基优化器(CBO)。CBO通常更先进,根据统计信息计算成本来选择最佳执行路径。 **8. 执行计划分析** 分析执行计划可以帮助...

Global site tag (gtag.js) - Google Analytics