zoukankan      html  css  js  c++  java
  • ORACLE小记

    一、用户操作:

    用户锁定和解锁/密码设置:

    alter user [USER] account lock;

    alter user [USER] account unlock;

    alter user scott identified by tiger;

    select * from dba_users; --查看用户信息表

    创建用户:create user [USER] identified by [PASSWD];

    删除用户:drop user [USER] cascade;

    二、简单赋权

    对于权限的赋予和收回语法如下:

    grant [权限] to [用户]

    revoke [权限] from [用户]

    在oracle里有俩个最著名的角色: connect、resource  除了dba之外的最大角色。

    查看当前用户的所有权限:select * from  session_privs; 我们与scott用户下的权限进行对比,发现多了一个 unlimited,其含义是拥有所有表空间配合的使用权限,这个权限太大了,一般来讲需要进行回收,然后重新进行分配一个表空间配合。

    revoke unlimited tablespace from [USER];

    查看用户缺省表空间:select username,default_tablespace from user_users;

    alter user [USER] quota 10m on users;。

    我们想让新建用户拥有对scott.emp表的查询权限:grant select on scott.emp to [USER];

    我们想让新建用户拥有对scott的建立表操作:grant create any table to tim;

    我们想让新建用户拥有对scott.emp表的修改权限:grant select, update(sal) on emp to tim;

    <注意:可以精确到字段>

     

     

    三、事务特性

    事务必须具备以下四个属性,简称ACID 属性:

    原子性(Atomicity):事务是一个完整的操作。事务的各步操作是不可分的(原子的);要么都执行,要么都不执行

    场景: 银行转账,A-100 B+100 同时成功或同时失败  

    一致性(Consistency):一个查询的结果必须与数据库在查询开始的状态一致(读不等待写,写不等待读)。

    场景: 查询数据,9:00开始查询数据 9:15查询完毕,在这期间所查询的数据被其他操作更新,且在9:00-1:15之间查询结果显示的是9:00时候并没有被更改的数据. 一般oracle是把这个没有更新的数据放入'undo'里, 如果oracle在'undo'里没有找到数据,则宁可报错,也不会让你看到其他操作更新的新的数据.  

    隔离性(Isolation):对于其他会话来说,未完成的(也就是未提交的)事务必须不可见。

    场景: 事务和事务之间相互隔离,2个session 一个查询 一个更新,那么在更新操作没有    commit之前, 查询所看到的数据是没有提交之前的,相互没有影响。 

    持久性(Durability):事务一旦提交完成后,数据库就不可以丢失这个事务的结果,数据库通过日志能够保持事务的持久性。

    场景: 事务提交之后不可逆, 提交数据是由内存的数据刷新到磁盘上,这个过程的快慢和性能有关。那么oracle主要是靠 'rudo' 日志,先记录日志,在写到磁盘上。

    事务采用隐性的方式,起始于session的第一条DML语句,注意登录的用户需要使用sysdba形式:conn system/tiger@orcl as sysdba;

    查看事务:select * from v$transaction;

    事务结束于:

        1)COMMIT(提交)或ROLLBACK(回滚)

        2)DDL语句被执行(提交)

        3)DCL语句被执行(提交)

        4)用户退出SQLPLUS(正常退出是提交,非正常退出是回滚)

        5)机器故障或系统崩溃(回滚)

        6)shutdowm immediate(回滚)

    四、锁

        锁大概分为:共享锁与排他锁。

        排他锁(独占),排斥其他排他锁和共享锁。

        共享锁,排斥其他排他锁,但不排斥其他共享锁。

    锁类型:

    DML锁(data locks,数据锁),用于保护数据的完整性。  TX(行级锁),TM(表级锁),我们日常所使用的DML操作就会产生事物和锁。

    查看事物:select * from v$transaction;

    查看锁:select * from v$lock;

    DDL锁(dictionary locks,数据字典锁),用于保护数据库对象的结构,如表、索引等的结构定义。

    SYSTEM锁(internal locks and latches),保护数据库的内部结构

    锁用途:只有有事物才会产生锁,保证数据的完整性和正确性。

     

    自动加锁,做DML操作时,如insert,update,delete,以及select....for update由oracle自动完成加锁.

    select * from emp1 where deptno = 10 for update;

    修改其部门为10的记录则会被锁定,我们可以进行试探要修改数据记录是否被加锁。如下三种形式均可:

    select * from emp1 where empno = 7782 for update nowait;

    select * from emp1 where empno = 7782 for update wait 5;

    select * from emp1 where job= 'CLERK' for update skip locked;

    如果这个锁占用的时间太长,我们可以通过管理员杀掉session用户。

    首先要找到是哪个sid占用了太长时间,查看v$lock表

    然后根据v$lock表的SID,去v$session里面去找到,进行kill操作。

     select sid, serial# from v$session where sid = 170;

     alter system kill session 'sid,serial';

    死锁问题:

     

    五、索引

     

    索引的说明:  

    索引是与表相关的一个可选结构,在逻辑上和物理上都独立于表的数据,索引能优化查询,不能优化DML操作,Oracle自动维护索引,频繁的DML操作反而会引起大量的索引维护。

    如果SQL语句仅访问被索引的列,那么数据库只需从索引中读取数据,而不用读取表,

    如果该语句同时还要访问除索引列之外的列,那么,数据库会使用rowid来查找表中的行,

    通常,为检索表数据,数据库以交替方式先读取索引块,然后读取相应的表块。 

    索引的目的是: 主要是减少IO,这是本质,这样才能体现索引的效率。

    1 大表,返回的行数<5%

    2 经常使用where子句查询的列

    3 离散度高的列

    4 更新键值代价低

    5 逻辑AND、OR效率高

    6 查看索引在建在那表、列:

       select * from user_indexes;

       select * from user_ind_columns;

    建立索引的方式:

     

    索引碎片问题:

    查看执行计划:set autotrace traceonly explain;

    索引碎片问题:由于对基表做DML操作,导致索引表块的自动更改操作,尤其是基表的delete操作会引起index表的index_entries的逻辑删除,注意只有当一个索引块中的全部index_entry都被删除了,才会把这个索引块删除,索引对基表的delete、insert操作都会产生索引碎片问题。

    在Oracle文档里并没有清晰的给出索引碎片的量化标准,Oracle建议通过Segment Advisor(段顾问)解决表和索引的碎片问题(053课程会涉及),如果你想自行解决,可以通过查看index_stats视图,当以下三种情形之一发生时,说明积累的碎片应该整理了(仅供参考)。

    1.HEIGHT >=4  

    2 PCT_USED< 50%  

    3 DEL_LF_ROWS/LF_ROWS>0.2

    建立表、索引:

    create table t (id int);

    create index ind_1 on t(id);

    执行插入记录:

    begin

      for i in 1..1000000 loop

             insert into t values (i);

                      if mod(i, 100)=0 then

                      commit;

                      end if;

      end loop;

    end;

    /

    分析索引:

    analyze index ind_1 validate structure;

    select name,HEIGHT,PCT_USED,DEL_LF_ROWS/LF_ROWS from index_stats;

    delete t where rownum<700000;

    alter index ind_1 rebuild [online] [tablespace name];

  • 相关阅读:
    三行Python代码查询IP
    剑指offer面试题29:数组中出现次数超过一半的数字
    【简】题解 AWSL090429 【数塔问题】
    Re.常系数齐次递推
    Re.多项式除法/取模
    【翻译】A simple stone game
    Re.多项式求逆
    Re.FFT
    题解 P4783 【【模板】矩阵求逆】
    关于win10企业版在极域电子教室软件 v4.0 2015 豪华版的全屏控制下如何取得自由
  • 原文地址:https://www.cnblogs.com/stevenlii/p/8632854.html
Copyright © 2011-2022 走看看