友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
oracle从入门到精通(PDF格式)-第8部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
*、包含了大量不同值的列;
*、包含了大量空值的列;
*、一个或者多个列经常被一起出现在 WHERE 条件中或者作为连接的条件出现;
*、表的数据量很大,而且对表的查询经常是得到表中数据的 2%到 4%(少量数据)。
不应该创建索引的情况:
*、一个很小的表;
*、列很少被用于查询的条件;
*、表上的大多数查询是得到大量数据的;
*、表中的数据经常发生变动;
*、要被索引的列被作为条件表达式的一部分。
查看:
user_indexes 得到索引的定义和唯一性。
user_ind_columns 得到索引的名称,表名和列名。
select ic。index_name;ic。column_name;ic。column_position; ic。uniquenes
from user_indexes ix;user_ind_columns ic
where ic。index_name=ix。index_name and ic。table_name='table_name';
第 40 页,共 106 页
…………………………………………………………Page 41……………………………………………………………
资源来自网络,仅供学习! Oracle 从入门到精通
删除索引:
DROP INDEX index_name;
为了删除索引,必须拥有索引或者拥有 DROP ANY INDEX 权限。
2。8 控制用户的访问
1。数据库的安全性
系统安全性:
系统权限(system privilege),获得访问数据库的能力。
超过一百个
创建新用户:
CREATE USER user_name IDENTIFIED BY password;
删除用户
删除表
授予权限:
GRANT priv_list TO user/public/role(角色);
grant create session ;create table;create sequence to user_name;
在授予建表权限的同时也应该赋予存储空间。
分配配额:ALTER USER user_name QUOTA nM ON space_name;
数据安全性:
对象权限(object privilege),获得维护数据库的能力。
每种对象的权限都不相同。
对象的所有者拥有对象的所有权限。
对象的所有者可以将自己的对象权限赋予其他人。
GRANT object_priv_list '(col_list)'
ON owner。object TO user/role/public
'WITH GRANT OPTION';……将权限授予用户的同时,该用户也拥有了授予其他用户对象权限的
功能。(及联授予)会导致及联移除。
移除权限:
REVOKE priv_list/all ON object FROM user;
方案:数据库对象的集合,包括表、视图、序列。。。。。。
2。角色:
CREATE ROLE role_name;
GRANT priv_list TO role_name;
GRANT role_name TO user_list/role_list;
修改口令:
方法 (1)ALTER USER user_name IDENTIFIED BY password;
(2)password + 回车
第 41 页,共 106 页
…………………………………………………………Page 42……………………………………………………………
资源来自网络,仅供学习! Oracle 从入门到精通
USER_SYS_PRIVS 当前用户的系统权限。
USER_ROLE_PRIVS 当前用户的角色权限。
USER_tab_privs_made 用户对象被授予的他人的信息。
3。使用集合操作
UNION
select employee_id;job_id from employees
union
select employee_id;job_id from job_history;
两个表的并集,但不显示重复行。执行的时候要先排序再剔重,所以结果集是有序的。
union all
也是两个表的并集,而且显示重复行。
语法同上。
intersect
select employee_id;job_id from employees
intersect
select employee_id;job_id from job_history;
minus
select employee_id;job_id from employees
minus
select employee_id;job_id from job_history;
e…j=e…e 与j的交集;
j…e=j…j 与e的交集;
注:在 select 列表中的表达式必须有同样的数目和类型。
匹配 SELECT 语句
select employee_id;job_id;salary from employees
union
select employee_id;job_id;0 from job_history;
括号可以用拉修改序列的执行顺序。
4。ORDER BY 子句:
只能在整个集合的最后出现;
可以按照第一个 SELECT 语句中的列名,别名或者位置号排序。
第 42 页,共 106 页
…………………………………………………………Page 43……………………………………………………………
资源来自网络,仅供学习! Oracle 从入门到精通
5。GROUP BY 子句的增强
CUBE 操作符的 GROUP BY
在 GROUP BY 子句中使用 ROLLUP 或者 CUBE 来产生分组小计;
ROLLUP 分组产生包括规则的分组结果和小计的结果的组合;
GROUP BY 'ROLLUP'(col_name_list)
ROLLUP:
a ab abc
abc
ab ab
a a a
all all all
CUBE 分组产生包括 ROLLUP 产生的结果和交叉分组小计。
cube:
a ab abc
a ab abc
all a ab
b ac
all bc
a
b
c
all
6。GROUPING 函数
参数一定是在 CUBE 或 ROLLUP 里进行分组排序的字段或表达式之一。
通过 1 或0来判断结果集中的空值是由于本身列的值是空的,还是由于使用 CUBE或 ROLLUP 产
生的空值。
1 代表是由于分组产生的空值,没有参与分组。
0 代表是由于列本身产生的空值,参与了分组,但分组中没有包含它。
GROUPING SETS
可以使用 GROUPING SETS 在同一个语句中定义多个组集。
只需要访问一次基表。
不需要写很复杂的 UNION 语句。
GROUPING SETS 子句中组合的元素越多,语句的执行性能就越好。
group by GROUPING SETS((abc);(ab);(bc);(a);(b))
组合列:
是一个列的组合,在分组计算时被作为一个单元处理。
第 43 页,共 106 页
…………………………………………………………Page 44……………………………………………………………
资源来自网络,仅供学习! Oracle 从入门到精通
2。9 高级子查询
1。 成对子查询:
行内视图的性能比成对子查询的性能高。
相关子查询:
主查询的字段在子查询里做条件(特征)。
主查询先执行,取出第一条数据,把该数据传入子查询做比较,返回查询结果给主查询,主查
询根据这个结果再做查询
依次类推
直到主查询中没有可查询列为止。
EXISTS 操作符
EXISTS 操作符测试子查询的结果是否存在;
返回 TRUE 或 FALSE
查询机制:
如果一个子查询找到了结果:
在内部子查询中不在继续执行,条件被设为 TRUE
如果一个子查询没有找到结果:条件被设为 FALSE
select col_list from table_name tab_alias
where exists (select 'x' from table_name where col=tab_alias。col);
用的是相关子查询
NO EXISTS 操作符
和 NOT IN 相对应,速度要快,性能好。
UPDATE 中的相关子查询
update emp e
set department_name in(select d。department_name from departments d where
e。department_id=d。department_id);
delete 中的相关子查询
2。层次查询
select 'level';column;expr from table 'where condition'
'start with'起点(自底向上/自顶向下)
'connect by prior + 主键/外键=外键/主键'//看你往哪个方向查
自顶向下 左边放主键,右边放外键
select employee_id;last_name;salary;job_id;manager_id
from employees
start with manager_id is null
connect by prior employee_id=manager_id;
自底向上 右边放主键,左边放外键
level(伪列)
层次的级别:不固定值。
第 44 页,共 106 页
…………………………………………………………Page 45……………………………………………………………
资源来自网络,仅供学习! Oracle 从入门到精通
使用 level 和 LPAD 层次化格式的显示
修剪分支
Oracle 9i 对 DML 和DDL 语句的扩展
多表插入的 INSERT 语句
insert 。。。。 select 语句可以被用来在单个 DML 语句中向多个表插入数据。
多表插入语句:
无条件 INSERT
条件 ALL INSERT
条件 FIRST INSERT
轮巡 INSERT
二、Management:
1。Oracle的构件和组件
instance 实例/例程
database 数据库
SGA 系统全局区
shared pool 共享池
library cache 库高速缓存区
data dictionary cache 字典高速缓存区
database buffer cache 数据库高速缓存区
redo log buffer 重做日志缓冲区
java pool java 池
large pool 大池
PMON 进程监视进程
SMON 系统监视进程
DBWR 数据库写进程
LGWR 日志写进程
CKPT 检查点进程
data file 数据文件
control file 控制文件
redo log file 重做日志文件
parameter file 初始化参数文件
password file 口令文件
archived log file 归档日志文件
user process 用户进程
server process 服务进程
PGA 程序全局区
tablespace 表空间
第 45 页,共 106 页
…………………………………………………………Page 46……………………………………………………………
资源来自网络,仅供学习! Oracle 从入门到精通
2。数据库的物理结构:
1。控制文件
2。 数据文件
3。 重做日志文件
4。 data file 数据文件:
5。 作用:存放数据。
6。 数据文件大小可以扩展。
7。 tablespace 表空间:一个或多个数据文件的逻辑组成。
一个数据库最少有一个 system 表空间,一个表空间最少有一个数据文件。
8。 redo log file 重做日志文件
重做日志:在数据库中发生的所有改变,改变的每一条信息都叫做一条重做日志信息。
存放重做日志信息的文件就叫做重做日志文件。
作用:利用日志记录可以恢复损坏的数据库,保证数据的可恢复性。
重做日志组:包含一个或多个日志文件。
特点:
一个数据库最少有两个组,一个组最少有一个组成员。
重做日志的大小是固定的。
写入方式是顺序写入,按时间。
切换(一个写满往下一个写),循环(都写满了就重新回到头组写)。
9。 control file 控制文件
数据库中的核心文件。
存放内容:
数据库的名称和编号,数据库的结构信息(数据文件和重做日志文件的地址)
当前的 SCN system change number 系统改变号:
给系统的每一次改变编号(最后一次同步的 SCN 号)。
控制文件的 SCN 号和所有存放数据文件的头部的 SCN 相同。
启动的时候,一样启动,不一样恢复。
特点:一个数据库最少需要一个控制文件,但一般情况下都会有复用/副本。
10。 parameter file 初始化参数文件
非必要文件
跟实例有关。
第 46 页,共 106 页
…………………………………………………………Page 47……………………………………………………………
资源来自网络,仅供学习! Oracle 从入门到精通
11。 password file 口令文件
非必要文件。
作用:做特权身份认证。
sysdba/sysoper/普通身份
12。 archived log file 归档日志文件
非必要文件。
内容:
重做日志文件(redo log file)内容的备份。
作用:使数据库所有的日志都会保留下来。
特点:每个重做日志内容都会对应一个归档文件。
LOG SEQUENCE 日志序列号:重做日志内容的序列号。
非归档日志:
没有归档日志文件;
性能要好一些;
可以选择归档模式或非归档模式。
3。instance 实例/例程
启动的步骤:
(1)启动实例;
实例包含:
1。SGA
2。后台进程
一个实例只有一个 SGA,可以有多个 PGA,建立一次连接(会话)就产生一次PGA。
ORACLE 的内存结构:
SGA 在实例启动的时候分配,是 ORACLE 实例的基本组件; 大小可以动态改变(内部大
小)
通过 SGA_MAX_SIZE 定义大小(总大小是静态的)
PGA 程序全局区(私有区域):在服务进程启动的时候分配。
PGA 程序全局区
是为每个用户进程连接 ORA 数据库提供的内存区域;
当进程创建时分配;
当进程结束时释放;
一个 PGA 只被一个进程使用;
包含:有连接的信息
SGA 系统全局区
所有数据库的后台进程和服务进程的共用内存区域。
包含:
1。shared pool 共享池
第 47 页,共 106 页
…………………………………………………………Page 48……………………………………………………………
资源来自网络,仅供学习! Oracle 从入门到精通
设置大小的参数:SHARED_POOL_SIZE
包含:
library cahce 库高速缓存区
大小由共享池决定。
包含:SQL 语句和 SQLPLUS 文本,分析代码,执行计划
存储目的:与性能有关。
当两个语句相同的时候不需要重新分析,使用相同的执行计划即可。
管理方法:采用 LRU (最近使用算法)least recent used 当空间不足的时候,使用 LRU。
结构: SQL 区域、PL/SQL 区域
data dictionary cache 字典高速缓存区
内容:最近最多使用的数据字典信息
作用:为了能够在分析的时候所需要的字典信息能在内存中找到,避免使用物理 I/O。
管理方法:采用 LRU (最近使用算法)
2。database buffer cache 数据库高速缓存区
单位:块。
内容:最近最常数据块
作用:减少物理 I/O,提高性能
参数:DB_BLOCK_SIZE 决定主数据块的大小。
会影响性能;
设置后不允许修改;
管理方法:采用 LRU (最近使用算法)
由独立的自缓冲区组成:
DB_CACHE_SIZE
CB_KEEP_CACHE_SIZE
DB_RECYCLE_CACHE_SIZE
可以通过 ALTER SYSTEM 命令动态增加或收缩:
ALTER SYSTEM SET DB_CACHE_SIZE =96M;
redo log buffer 重做日志缓冲区
记录了对数据块所作的所有修改。
作用:数据库的恢复
大小由 LOG_BUFFER 决定。
顺序单条写入,批量写出到文件。
java pool java 池
可选
java_pool_size 大小
large pool 大池
可选
减轻共享池的负担。
被用于: 1。在共享服务器中的会话的内存需求(UGA);
2。I/O 辅助;
3。备份恢复操作或 RMAN;
4。并行执行的信息缓冲区;
large_pool_size 大小
第 48 页,共 106 页
…………………………………………………………Page 49……………………………………………………………
资源来自网络,仅供学习! Oracle 从入门到精通
4、进程结构
1。 用户进程:开始于数据库用户请求连接数据库
2。 服务进程:与 ORA 实例连接,开始于用户会话的建立。
分为: 专用服务进程、共享服务进程
性能专用更好。
利用资源方面共享更好(网站方面)。
3。 后台进程:当 ORA 实例启动时启动
后台进程包含:
1。PMON 进程监视进程
监视用户进程(客户端连接服务器的进程)到服务进程(在服务器端响应用户进程的进程)的
连接。
创建会话。
监视会话是否异常中断,如果中断:PMON 会回滚事务、解锁、释放资源。
2。SMON 系统监视进程
任务:会检测 SCN 号,相等:启动
不相等,实例恢复(1)前滚将日志应用
(2)打开数据库
(3)恢复数据库
恢复的起点是走后一次 CHECKPOINT 的位置。
每 3 秒合并空闲空间
释放临时段
临时段:暂时存放在排序时中没有空间的字段值。
在排序中产生的。
数据量大的时候,排序是分成若干块执行的,当字段值排好序之后就放到临时段中。
1。 DBWR 数据库写进程
/DBW0/DBWn n:0…9
将脏数据写回到数据文件中。
当发生以下情况执行:
当发生检查点事件的时候,checkpoint
第 49 页,共 106 页
…………………………………………………………Page 50……………………………………………………………
资源来自网络,仅供学习! Oracle 从入门到精通
脏块达到极限值;
没有空间的缓冲空间
超时
RAC PING 请求
表空间离线
表空间只读
在表执行 DROP 或TRUNCATE
表空间上执行 BEGIN BACKUP
2。 LGWR 重作日志写进程
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!