标签: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,就不要从会话层面分析(工具:执行计划/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>
没有并发就没有锁。
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.上面的锁就是一个会话阻塞另外一个会话。
1.Enqueues -- 队列类型的锁,通常和业务有关。
2.Latches -- 系统资源方面的锁,比如内存结构,SQL解析。
1.只有被修改时,行才会被锁定
2.当一条语句修改了一条记录,只有这条记录上被锁定,在Oracle数据库中不存在锁升级。
3.当某行被修改时,它将阻塞别人对它的修改。
4.当一个事务修改一行时,将在这个行上加上行锁(TX),用于阻止其它事务对相同行的修改。
5.读永远不会阻止写。
6.读不会阻塞写,唯一的例外,就是select ... for update。
7.写永远不会阻塞读。
8.当一行被修改后,Oracle通过回滚段提供给数据的一致性读。
1.TM表锁,发生在insert update delete 以及select for update操作时,目的是保证操作正常进行,并阻止其它对表执行DDL操作。
2.TX锁 事务锁(行锁)对于正在修改的数据,阻止其它会话进行修改。
3.示例
1.会话1中修改一条记录不提交
2.会话2中修改相同行的记录
3.会话3查看
ps:select ... for update的阻塞,在表上加上了表锁和事务锁。
相互持有对方资源不释放
1.会话1中修改一条记录
2.会话2中修改一条记录后并修改会话1中修改未提交的记录,此时出现等待。
3.在会话1中修改会话2中修改未提交的记录。
4.此时会话2中会报死锁错误
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; -- 释放锁
当对具有主外键关系的表做DML操作时,锁定不单单发生在操作表上,相应的引用表 上也可能加上相应的锁定。
1.创建主从表
2.在主表中插入数据
3.在从表上会加上TM锁
标签:pack 11.2.0.1 admin table code 索引 top oracle 一个
原文地址:https://www.cnblogs.com/wangzihong/p/10436034.html