码迷,mamicode.com
首页 > 数据库 > 详细

Oracle性能优化

时间:2019-02-26 15:12:54      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:pack   11.2.0.1   admin   table   code   索引   top   oracle   一个   

环境准备

1.在虚拟机linux上面安装好oracle环境。

2.启动Oracle

[oracle@WZH ~]$ sqlplus / as sysdba

3.开启一个实例

SQL> startup
ORACLE instance started.

Total System Global Area  845348864 bytes
Fixed Size		    1339796 bytes
Variable Size		  494931564 bytes
Database Buffers	  343932928 bytes
Redo Buffers		    5144576 bytes
Database mounted.
Database opened.
SQL> select status from v$instance;

STATUS
------------
OPEN

4.开启监听

[oracle@WZH ~]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 26-FEB-2019 03:05:07

Copyright (c) 1991, 2009, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=WZH)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.1.0 - Production
Start Date                26-FEB-2019 02:55:39
Uptime                    0 days 0 hr. 9 min. 27 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/WZH/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=WZH)(PORT=1521)))
Services Summary...
Service "orcl" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
The command completed successfully
[oracle@WZH ~]$ 

5.运程链接PL/SQL连接Oracle

技术图片

导致性能问题的可能原因

1.表没有正确的索引 --错误的执行计划

2.表没有及时的分析 --错误的执行计划

3.热块 --数据块的争用

4.锁的阻塞 --业务设计的缺陷

5.sql解析消耗大量cpu --变量绑定

6.低效的sql --sql自身的问题

......

性能问题的定位

SQL层

  如果能定位到SQL,就不要从会话层面分析(工具:执行计划/10053/10046...)

会话层

  如果能定位到会话,就不要从系统层面分析(v$SESSION,V$SESSTAT,V$SESSION_WAIT,V$SQL,V$LOCK...)。

系统层

  如果无法定位任何性能问题,从系统层面分析(AWR(STATSPACK),OS TOOLS(TOP,IOSTAT...))。

根据业务逻辑优化示例

1.创建一张测试表,得到一个累加的结果

技术图片

2.使用sql实现

技术图片

3.查看执行计划

SQL> explain plan for
  2  select
  3       t1.id,t1.value,sum(t2.value)
  4  from mytable t1
  5  join mytable t2
  6    on t2.id <= t1.id
  7  group by t1.id,t1.value;
 
Explained
SQL> select * from table(dbms_xplan.display);
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1972915077
--------------------------------------------------------------------------------
| Id  | Operation            | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |         |     1 |    80 |     9  (34)| 00:00:01 |
|   1 |  HASH GROUP BY       |         |     1 |    80 |     9  (34)| 00:00:01 |
|   2 |   MERGE JOIN         |         |     1 |    80 |     8  (25)| 00:00:01 |
|   3 |    SORT JOIN         |         |     3 |   120 |     4  (25)| 00:00:01 |
|   4 |     TABLE ACCESS FULL| MYTABLE |     3 |   120 |     3   (0)| 00:00:01 |
|*  5 |    SORT JOIN         |         |     3 |   120 |     4  (25)| 00:00:01 |
|   6 |     TABLE ACCESS FULL| MYTABLE |     3 |   120 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   5 - access(INTERNAL_FUNCTION("T2"."ID")<=INTERNAL_FUNCTION("T1"."ID")
              )
       filter(INTERNAL_FUNCTION("T2"."ID")<=INTERNAL_FUNCTION("T1"."ID")
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
              )
Note
-----
   - dynamic sampling used for this statement (level=2)
 
25 rows selected
 
SQL> 

4.可以根据业务逻辑改写为用分析函数。

SQL> explain plan for
  2  select
  3       id,value,sum(value) over(order by id)
  4  from mytable;
 
Explained
SQL> select * from table(dbms_xplan.display);
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3253109826
------------------------------------------------------------------------------
| Id  | Operation          | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |         |     3 |   120 |     4  (25)| 00:00:01 |
|   1 |  WINDOW SORT       |         |     3 |   120 |     4  (25)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| MYTABLE |     3 |   120 |     3   (0)| 00:00:01 |
------------------------------------------------------------------------------
Note
-----
   - dynamic sampling used for this statement (level=2)
 
13 rows selected
 
SQL>   

锁(LOCK)

  没有并发就没有锁。

示例演示

1.创建一张带主键的表

drop table t purge;
create table t(id int primary key);

2.打开两个会话窗口进行测试并设置开头区别

SQL> set sqlprompt "session01>"
session01>

  在第一个session01提交插入语句后在session02中提交同样的语句

-- session01 
session01>insert into t values(1);

1 row created.

session01>

-- session02 鼠标是一只停留不动
SQL> set sqlprompt "session02>"
session02>insert into t values(1);    

  当在session01中提交后由于主键的原因报错

session01>commit;

Commit complete.

session01>

-- session02中立即报错
insert into t values(1)
*
ERROR at line 1:
ORA-00001: unique constraint (TEST.SYS_C003783) violated

3.上面的锁就是一个会话阻塞另外一个会话。  

Oracle中锁的分类

1.Enqueues -- 队列类型的锁,通常和业务有关。

2.Latches -- 系统资源方面的锁,比如内存结构,SQL解析。

锁的原则

1.只有被修改时,行才会被锁定

2.当一条语句修改了一条记录,只有这条记录上被锁定,在Oracle数据库中不存在锁升级。

3.当某行被修改时,它将阻塞别人对它的修改。

4.当一个事务修改一行时,将在这个行上加上行锁(TX),用于阻止其它事务对相同行的修改。

5.读永远不会阻止写。

6.读不会阻塞写,唯一的例外,就是select ... for update。

7.写永远不会阻塞读。

8.当一行被修改后,Oracle通过回滚段提供给数据的一致性读。

TM锁和TX锁

1.TM表锁,发生在insert update delete 以及select for update操作时,目的是保证操作正常进行,并阻止其它对表执行DDL操作。

2.TX锁 事务锁(行锁)对于正在修改的数据,阻止其它会话进行修改。

3.示例

技术图片

update的阻塞

1.会话1中修改一条记录不提交

技术图片

技术图片

2.会话2中修改相同行的记录

技术图片

技术图片

3.会话3查看

技术图片

技术图片

ps:select ... for update的阻塞,在表上加上了表锁和事务锁。

死锁

  相互持有对方资源不释放

1.会话1中修改一条记录

技术图片

2.会话2中修改一条记录后并修改会话1中修改未提交的记录,此时出现等待。

技术图片

3.在会话1中修改会话2中修改未提交的记录。

技术图片

4.此时会话2中会报死锁错误

技术图片

TM锁的几种模式

技术图片

手工锁定

lock table dept in share mode;  -- 其它会话等待
update emp 
   set sal = sal * 1.1
 where deptno in (
 select deptno from dept where loc = ‘loc‘
 );
 
update budget
   set totsal = totsal * 1.1 
 where deptno in (
select deptno from dept where loc = ‘loc‘
 );
 
commit; -- 释放锁 

RI锁 

  当对具有主外键关系的表做DML操作时,锁定不单单发生在操作表上,相应的引用表 上也可能加上相应的锁定。

 1.创建主从表

技术图片

2.在主表中插入数据

技术图片

3.在从表上会加上TM锁

技术图片

 

 

 

 

  

  

  

Oracle性能优化

标签:pack   11.2.0.1   admin   table   code   索引   top   oracle   一个   

原文地址:https://www.cnblogs.com/wangzihong/p/10436034.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!