ORACLE 日常

新增重做日志组文件(记录事务操作,位于内存中)

alter database add logfile group 5('d:\ORACLE\LogFiles\REDO4_A.LOG','d:\ORACLE\LogFiles\REDO4_B.LOG') size 20M;

 

add database add logfile member 'xxx' to group 5

 

归档操作

archivelog - no archivelog

 

重做日志文件-记录用户日志信息,临时存档

重做归档文件-记录用户操作,在重做日志文件之前进行记录,相当于备份

重做控制文件- 加载数据库控制初始化进程

 

表空间

 

 

永久表空间- 存储数据的逻辑结构

  创建表空间

    create tablespace space_name datafile 'xxxxxxx\xxxx.dbf' size 10m autoextend on next 10m

    maxsize 1g ;

    

 

 

  对应的物理结构- 物理数据文件

  数据段

  数据分区

  数据块

临时表空间

  针对排序等临时性操作,系统创建临时信息

undo表空间

  记录未提交的记录信息,update 一条数据后,旧的记录保存在undo,再commit 后提交刷新。  

 

 

数据对象

  LOB 大数据类型-

  - blob   二进制文件最大128m

  - clob   大字符串最大128m,转为unicode 存储

  - bfile 保存二进制文件的指针- 只读

  rowid - 伪列

  保存数据指向的实际物理地址,使用rowid 访问数据是最快的一种访问方式 

 

PCT-FREE 与PCT-USEED

数据块中如果到达了PCT-FREE 的上限,则不再进行insert 此数据块,剩余的空闲空间用来作为update 与delete 操作

PCT-USERED - 相对限制参数

参数值相加必须低于等于100。

 

针对update操作多,且update会增量的表,pctfree 设置较大,pctused设置较小,避免在update 后数据溢出的情况,20:40

针对insert 与 delete 较多,设置pctfree 较小,pctused 较大,保证数据块中保存的空间重用性,10:60

 

和值与100 相差越大,存储效率越高。

-- 设置表空间大小,free/used

create table tb_name(

)

tablespace tb_space_name  -- 所属表空间

storage (initial 256K)  -- 盘区

pctfree 20  

pctused 60;

initrans -- 事物数据条目

nologging -- 重做日志记录,对表进行的操作不会记录到重做日志记录,但是insert、update、delete 还是会进行记录。

nocache -- 不使用缓存策略

LRU - 查询操作,优化策略后的查询计划会并入库告诉缓存,并会记录查询结果,当LRU 列表满或一定时间后会清空使用次数少的缓存。

 

-- 复制表

create table tb_name as select * from table_from;

 -- 增加删除字段

alter table tb_name add (xxx varchar2(2))

alter table tb_name drop [column col_name]/(c1,c2)

alter table tb_name modify c_name varchar(20);  -- 存在字段 兼容,从低到高  ,无值(高-低、低-高)

表名更改

alter table tb_name rename to new_name;

移动表空间

alter table tb_name move tablespace tb_space_name;

 删除表

drop table tb_name [cascade constraints];  -- 如果存在级联关系则需要使用参数

 

delete table - 删除表数据,保留结构,且可恢复(重做日志文件或归档)

drop table - 删除(可恢复)利用闪回记录 flashback table 

  --  select object_name,original_name from recyclebin ; 查询回收站

  

 

   --  flashback table emp to before drop; 回到删除之前

  

 

   -- drop table tb_name purge; -- 立即释放空间,不可恢复

truncate table -- 截断,不可恢复(文件不保留历史)

 

更改表的状态(只读,可写)(或模式、空间只读)

 

 

约束

- 主键、非空、唯一、其他、外键

主键: primary key

非空:not null

唯一:unique

alter table tb_name add constraint XX_NAME  unique(column_name)

外键:被引用键为唯一键,删除外键表(主表数据)后方可删除引用表中的引用数据

alter table tb_name add constraint XX_F_K  foreign key(column_name)

references tb2_name(column_name)  [on delete action];

外键级联选项:
no action - 默认行为,报错

set null - 删除引用,外键表设置为null

cascade - 级联删除,删除引用数据导致外键数据同时被删除

其他

alter table tt add constraint id_chk check(id>1 and id <20) [disable/];

禁用

alter table tt disable constraint id_chk ;

启动

alter table tt enable [novalidate] constraint con_name; 

索引(目录的存在,rowid- 页码的存在) 

- 将索引和对应的表放在不同的表空间里,可以提高查询速度(并行io进程)

 

存储方式:b树、位图、反向、函数

唯一性:唯一索引、非唯一

列数:单列所有、复合索引(多列)

索引的目的:提高查询速度,针对condition 查询条件或排序字段使用较为频繁的列建立索引,查询数据低于15% 应建立索引,相反使用较低的情况,建立的索引性能会不升反降。

索引会降低DML 操作的速度,因为每条数据需要建立索引,势必在进行dml操作时设计到额外的索引操作。

简化管理:索引与表在同一表空间

提高性能:索引与表分布在不同的表空间

使用nologging 建表,减少日志操作,提高建立索引的速度

在连接列上建立索引并且不要再小表上建立索引。

 

B树索引:(标准的一棵树)

无论查询某条数据,查询的层次都是一样的,相同的i/o操作,B- balance 平衡

 

 

create index xxx_index on tb_name(col_name)

pctfree 15

tablespace tp_name;

此处的pctfree 是针对索引的,跟原表的pctfree 无关。

 

B树索引的建立(normal) 基于“基数低”,oracle 建议低于1% 的情况建立normal index

比如10000行数据中有100中不同,则计算为 1%

 

位图索引

低于上述的基数,可以建立位图索引,oracle 通过图表的方式进行存储

位图索引的大小建立通过 create_bitmap_area_size 确定,默认8m 值越大查询速度越快

create bitmap index index_name on(tb_name)

tablespace ts_name;

 

更改位图索引的大小(必须重启数据库)

alter system set create_bitmap_area_size = 00000000 scope = spfile ;

 

反向索引

针对自增有序的列值使用反向索引,避免b树索引中叶子指向过大的情况,反向索引(随机索引)

create index index_name on (tb_name) reverse 

tablespace ts_name;

 

- 重建索引

rebuild

-- 重建为反向索引

alter index index_name

rebuild reverse;

 

函数索引

某些情况下,索引没有起到一定的作用,如

select * from tb_name where col_name = upper('xxxx');

针对这个col_name 建立了普通索引,但是upper 函数导致索引无效,最终查询需要检索全表,因为upper 需要先更改为大写。

这种情况下建立函数索引。

create index index_name on tb_name(upper(col_name))

tablespace ts_name;

 

合并索引- 重新组合索引(针对表的dml 操作产生的索引碎片进行合并)不会释放索引空间

alter index index_name 

coalesce deallocate unused;

 

 重建索引- 释放索引空间在建索引

alter index index_name rebuild;

 

查询所有索引dba_indexes、all_indexes 当前用户所有可访问的索引、user_indexes 当前用户索引

 

同义词

建立表的别名,在源表修改后可以进行修改,通过同义词解耦与数据表引用表

共有

所有用户可访问

 

 

 

私有

创建用户可访问

 

 

 

当源表名更改后必须重新编译

 

视图(没有实际的存储地址,数据基于实际的表)

 

 

 

 create or replace view v_name (col_1,col_2)

as select col_11,col_22 from table_name

with read only;

 

简单视图

  针对单一的表,且没有执行表达式,聚集函数等。(可以执行dml 操作)

只读视图

  with read only 

复杂视图

  使用表达式建立的视图(group 、 函数等)

连接视图(常用)

  多个视图连接后的视图,使用连接,否则会出现笛卡尔积的情况。

create or replace view v_name as 

select col_1,col_2 from a,b where a.id = b.subid;

 

序列(自增、自减序号)

 

 

 

 

 

 

 

 

 

nextval 下一个值,currentval 当前值

 

修改序列

alter sequence tt_seq 

maxvalue xxxx;

 

分区(表分区-索引分区)

范围分区(range )如日期

create table tb_name(

  id varchar2(20) primary key,

  col_tt int

)

partition by range(col_name)

(

  partition  par_n_1 values less than (to_date('1999-01-01','yyyy-mm-dd') ) tabspace ts_name,

  partition  par_n_2 values less than (to_date('1999-01-01','yyyy-mm-dd') ) tabspace ts_name

);

 

通过分区查询

select * from tb_name partition(par_n_1);

 

散列分区 hash (高速,均匀,但无法或者数据具体存放在哪个分区)

create table tb_name(

  xxx  varchar2(20)

)

partition by hash(xxx)

(

  partition p_1 tablespace ts_1

)

 

列表分区(枚举分区)如省份

create table tt_t(

  id varchar2(20),

  province varchar2(50)

)

partition by list(province)

(

  partition p1 values('山东省'),

  partition p1 values('江苏省')

)

 

组合分区(主分区与子分区)

sub partition...

 

interval 分区(范围分区增强版)

随着数据表的增加会自动增加分区

create table ...

(

...

d date

)

partition by range(d)

interval(numtoyinterval(1,'year')) -- 设置自动分区间隔

(

partition p_first values less then(to_date('xxxx-xx-xx','yyyy-mm-dd'))

);

 

添加表分区(已分区的表)

alter table tb_name 

add partition p_new values('XX')  -- 添加一个列表分区

storage(initial 10K next 20K) tablespace tt_1

nologging;

 

合并分区

hash

alter table tb_name  coalesce partition;

 

复合分区(指定分区名)

 

删除分区

范围分区和复合分区中删除分区,散列分区只能通过合并进行删除。

alter table tb_name drop partition p_x;

删除分区后如有索引的存在需要进行重建索引(rebuild) 否则会为不可用状态。

 

针对有约束的分区需要先禁用约束在执行删除分区操作,最后在激活约束。

 

索引分区(全局索引分区、局部分区)

 

局部分区(与表分区采用同样分区结构)

create table t(

  ...

)

partition by range(xxx)

(

  partition t_1 values less than (xxx)

)

--  根据表分区进行索引分区

local(

  partition i_1 tablespace ts_name

)

 

全局索引分区(不一定与表分区一致(不能进行位图索引分区))

create table index on tb_name(col_name)

global partition by range(col_name)

(

  partition p_1 values less than (xxx)

);

 

posted @ 2020-03-15 00:25  李鹏飞ONLINE  阅读(183)  评论(0编辑  收藏  举报