一 Oracle的结构1 实例(instance) 是内存和后台进程的集合, 数据库是数据的物理储存;实例和数据库的关系是一对多的关系;
2 多个实例同时驱动一个'数据库'的架构 叫集群(RAC)
3 Oracle的内存由PGA(程序全局区,包含服务器进程的数据和控信息,内容不共享),和SGA;
4 Oracle的逻辑结构由表空间(tablespace),段(segment),区(extent),数据块(datablock)组成,
二 oracle的数据字典(DATA DICTIONARY)
1 数据字典的内容
1)数据字典的表的拥有者是sys
2)内容:所有Oracle用户的信息;
表空间,数据文件的信息
权限,角色信息
模式,对象的信息(表,视图,过程,函数,触发器等)
完整性约束信息
数据库中 对象的空间分布以及当前使用情况
审计信息(谁修改过对象)
3)结构:
base TABLES :用户无法读取
基表视图: 用户可以访问,这些视图以USER ALL DBA 作为前缀,不同前缀代表的权限不同
三 Oracle的逻辑结构
1 数据块:datablock
1)块头:HEADER 存放块的基本信息
2)表目录: TABLE DICTIONARY 存放表的信息,如果表的数据存放在这个块,则表的相关信息存放在这个块的表目录
3)行目录: ROW DIRECTORY 如果块中有行数据存在,则这些行的信息存在行目录中 包含行的存放地址
4)行数据: ROW DATA 正真存放表数据 和索引数据的地方
5)空余空间: free SPACE 未使用分区域,用于新行的插入和行的更新
6)头部信息区:Overhead 块头 表目录 行目录的合称 ,此区不存放数据 只存放整个块的信息(84BYTE 到 107byte)
(当块中自由空间不够的时候,数据库会自动合并不连续的自由空间)
7)行链接:如果一行数据很大 ,则可能占用多个块,则此行 叫做 链接行, oracle操作的过程叫做行链接(ROW chaining)
8)行迁移;ROW migrating 更新数据的时候 块的iyou空间不够,将这行数据迁移到新块,原块保留指针,指向此处
(行链接和迁移都会影响数据库性能)
9) 块的标准大小由初始化参数db_block_size指定;
2区extent:
1)由连续的块(datablock)构成,是一段连续的储存空间
2)创建表时 自动创建初始区(INITIAL extent) (一个表由一个段或者多个段构成,比如分区表)
3)一个区的数据满了 会再分配一个,依次递增;段的头部含有区的一个目录;
4)区的分配机制:
存储参数:规定如何给段(表)分配空间;存储参数分成表空间级别 和表级别
例1:
CREATE TABLESPACE space1
DATAFILE 'D:\hundsun\space1_1.dat' SIZE 20M
DEFAULT STORAGE (INITIAL 128k NEXT 128k PCTINCREASE 40 MINEXTENTS 1 MAXEXTENTS 999)-- 表空间级别的存储参数
ONLINE;
例2:
CREATE TABLE tb1(
ID NUMBER(10) NOT NULL,
NAME VARCHAR2(10) NOT NULL
)
TABLESPACE space1
storage(INITIAL 1M NEXT 2M PCTINCREASE 60 MINEXTENTS 2 MAXEXTENTS unlimited);--表级别存储参数
-- 初始区大小 第二个区大小 后续区大小增长百分比 给该表/段 分配的最小/大的区数量
如果例2中不指定存储参数,则直接继承space1的存储参数
例3:
CREATE TABLESPACE space2
DATAFILE 'D:\hundsun\space2_1.dat' SIZE 50M
EXTENT MANAGEMENT LOCAL AUTOALLOCATE --- 又oracle自动决定分配区的大小
或者
EXTENT MANAGEMENT LOCAL/DICTIONARY UNIFORM SIZE 128k ---自己指定区的大小
-- 区的管理方式:本地管理/字典管理
SEGMENT SPACE MANAGEMENT MANUAL / AUTO ;
-- 段的管理方式: 手动/自动
5)去空间的释放
1 DROP TABLE 或者drop CLUSTER 命令会自动回收区空间
2 TRUNCATE ...drop STORAGE / ALTER TABLE ... DEALLOCATE UNUSED 会回收还未使用的区
四 段(segment)
1)段的分类 数据段(DATA segment)索引段(INDEX segment) 临时段(TEMPORARY segment) 回滚段(ROLLBACK segment)
2)普通表由一个段构成,分区表由多个段构成
3)创建表的实质就是创建一个或者多个段;
4)数据段可以存放:1 一个普通的表的数据;2 分区表(patition table)的一个分区;3 聚簇表(CLUSTER table)
5)索引段: 同普通表;一个非分区索引有一个单独的索引段
6)临时段:查询且内存不足的时候会用到临时段;用到临时段说明数据库性能降低了;比如排序的时候:
CREATE INDEX...
SELECT ... ORDER BY
SELECT destinct ...
SELECT ... GROUP BY
SELECT UNION ...
SELECT ... INTERSECT
SELECT ... MINUS 以上语句会用临时段,应该尽量避免
五 表空间(TABLESPACE )
1)表空间分类:1大/小文件表空间;2系统表空间(自动);3辅助表空间(自动);4回滚表空间;5临时表空间
2)回滚表空间(UNDO TABLESPACE )的理解:
(1)回滚段存放在回滚表空间中,
(2)回滚段中的区是循环使用的,头到尾,满了之后,如果第一个区未被使用则被oracle调用
3)当用户输入了DML(INSERT UPDATE DELETE)的时候 会用到回滚段
4)一个回滚段至少2个区 便于循环使用 最大默认是32765个区
5)表空间的离线(offline)和在线(online),表空间离线,则表空间的数据不可访问
对于表空间的操作实例:
例1:创建大文件表空间
CREATE BIGFILE TABLESPACE bigspace1
DATAFILE 'D:\hundsun\bigspace1.dbf'
SIZE 500M ---初始大小
AUTOEXTEND ON; --允许大文件自动扩展
例2:创建表空间
CREATE TABLESPACE space1
DATAFILE 'D:\hundsun\space1_1.dbf' SIZE 10M, 'D:\hundsun\space1_2.dbf' SIZE 20M
AUTOEXTEND ON --允许space1_2.dbf自动扩展
NEXT 1M --space1_2.dbf每次扩展1M
MAXSIZE unlimited --space1_2.dbf大小 不限制
例3:删除表空间
DROP TABLESPACE space1
INCLUDING CONTENTS --连内容一起删除
AND DATAFILES --将操作系统文件一起删除
CASCADE CONSTRAINTS; --连参照完整性约束一起删除
例4 查询表空间又哪些文件组成
SELECT file_name FROM Dba_Data_Files WHERE TABLESPACE_name ='space1';
例5 显示标准块大小
SHOW parameter db_lock_size;
例6 创建块大小是16k的非标准表空间
CREATE TABLESPACE space1
BLOCKSIZE 16k
DATAFILE 'D:\hundsun\space1.dbf'
SIZE 30M AUTOEXTEND ON;
其他语句如下:
ALTER TABLESPACE sapce1 READ ONLY;
ALTER TABLESPACE DATAFILE 'D:\hundsun\space1.dbf' RESIZE 50M;
ALTER TABLESPACE space1 ADD DATAFILE'D:\hundsun\space2.dbf' SIZE 100M;
ALTER USER test1 QUOTA 50M ON SPACE1 --限制用户test1 在space1中只能使用50M空间
ALTER TABLESPACE space1 ONLINE/OFFLINE ;
SELECT * FROM dba_tablespaces;--查询表空间信息
查询每个表空间的使用情况
SELECT b.file_id AS id,
b.tablespace_name AS NAME,
b.bytes / 1024 / 1024 AS tatal,
(b.bytes - SUM(nvl(a.bytes, 0))) / 1024 / 1024 AS used,
SUM(nvl(a.bytes, 0)) / 1024 / 1024 AS remaind,
(100 - (SUM(nvl(a.bytes, 0)) / (b.bytes) * 100)) 已经使用百分比
FROM dba_free_space a,
dba_data_files b
WHERE a.file_id = b.file_id
GROUP BY b.tablespace_name,
b.file_name,
b.file_id,
b.bytes
ORDER BY b.tablespace_name
六 sql语言
1)SELECT 语句中使用回车
SELECT 'hello' ||CHR(10)||'world,i am home' FROM dual;
2) 设置日期格式
ALTER SESSION SET nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
SELECT SYSDATE FROM dual;
3) 使用行号
SELECT ROWNUM FROM tsys_parameter WHERE ROWNUM <20;
七 Oracle高级查询
1 分组
SELECT kind_code,COUNT(*) FROM tsys_dict_entry GROUP BY kind_code;
2 自循环:
SELECT key,
m_1
FROM dual model dimension BY(0key) --定义维度列名=key值等于0
measures(CAST(NULL AS VARCHAR2(100)) m_1) --定义一个度量类型是 varchar2(100) 列名=m_1
rules --规则约束
iterate(5) --定义自循环次数 =5从 0开始循环
(m_1 [ 0 ] = nvl(m_1 [ 0 ], 'TEST') || 'x' || '/' || iteration_number || '/')
3 日期操作
select add_months(sysdate,3) from dual; --后推三个月
SELECT ADD_MONTHS(TO_DATE('2016-05-01 19:15:26','yyyy-mm-dd HH24:MI:SS'), 3) FROM dual; --变形1
SELECT ADD_MONTHS(TO_DATE('20160501191526','yyyymmddHH24MISS'), 3) FROM dual; --变形2
SELECT add_months(to_date(20140702, 'yyyymmDD'),1) from dual; --获取下一个月
SELECT to_number(to_char(Sysdate,'yyyymmddhh24miss')) FROM dual; --日期转换
select MONTHS_BETWEEN(sysdate,to_date('2012-01-30','yyyy-mm-dd')) from dual;--日期之间相差的月数
select next_day(sysdate,3) from dual; --下周二
select LAST_DAY(sysdate) from dual; --本月最后一天
select round(sysdate,'day') from dual; --本周/年/月/日的最开始
SELECT sysdate + numtoyminterval(1,'hour') FROM dual -- 下个月的同一天 month ,year,
SELECT sysdate + NUMTODSINTERVAL(1,'day') FROM dual -- 参数day,hour,minute,second
4 数字处理
SELECT ROUND('22222.22222',2) FROM cc_dbo.record_template t; -- 四舍五入
5字符串处理
SELECT wm_concat( s.user_id) FROM tsys_user s Where 1=1 and s.user_status =0 --多行结果用逗号连接
select replace('HelloWoreld!','o','1111') FROM dual --替换
select reverse('abc') FROM dual --翻转
select SUBSTR('HelloWorld!',6,6) FROM dual --截取
SELECT SUBSTR('1230',0,2)||':'||SUBSTR('1230',2,2) FROM dual
SELECT DECODE('1','12',123,'1','234') FROM dual; --swich
SELECT INSTR2('dcabcd','abc') FROM dual; -- 是否有摸个字符
select instr('abcd,efgh',',') position from dual; --是否有摸个字符
select chr(54740) zhao,chr(65) chr65 from dual; --编码转换成字符
select userenv('language') from dual; --当前oracle编码
==========================================================
查询质检任务分数
SELECT LEVEL,
connect_by_isleaf AS is_leaf,
d.*,
r.qck_result_id,
r.qck_score_point,
r.qck_item_comment,
r.qck_has_fatal
FROM qck_template_dir_item d,
(SELECT r.*
FROM qck_result r
WHERE r.qck_tsk_id = 4835871) r
WHERE d.qck_item_id = r.qck_item_id(+)
AND d.qck_template_id = 5000000
AND d.qck_item_status = '1'
START WITH d.qck_p_item_id = 0
CONNECT BY PRIOR d.qck_item_id = d.qck_p_item_id
ORDER SIBLINGS BY d.qck_item_sort, d.qck_item_id;
----3.3数据字典查询
SELECT wm_concat(NAME||CODE) FROM sys_dict WHERE code LIKE '715%'; -- 字典表
----4.0数据字典查询
SELECT '/*' || MAX(te.dict_entry_name) || '[' ||
wm_concat(t.dict_item_code || ':' || t.dict_item_name) || ']*/' AS 数据字典
FROM tsys_dict_item t,
tsys_dict_entry te
WHERE t.dict_entry_code = te.dict_entry_code
AND t.dict_entry_code LIKE
-- LOWER('qck_src_type');
upper('QCK_TEMPLATE_COPYID');
--添加权限
--添加邮件群发权限
CALL sp_update_subtrans('myEmailSpace', 'emailSends', '邮件群发', '', '', '1');
--添加短信群发权限
CALL sp_update_subtrans('mySendSpace', 'smsSends', '短信群发', '', '', '1');
COMMIT;