Oracle Database 9i/10g/11g编程艺术
目录 |
序言
- 11g r1: SKIP LOCKED特性(用于记录的串行化处理,不同的事务能够得到不同的记录)
- pragma autonomous_transaction; //在大的事务中强制子事务执行,审计?
- 从SQL Server升级的要点:不要打开多个连接;使用绑定变量(Oracle太自大了,为什么不能模仿一下SQL Server呢?)
- 用SELECT ... FOR UPDATE锁定数据,以避免并发问题
- 事务性不表示一致性,因此需要了解‘并发控制’
- Oracle的MVCC:读一致;查询不会被写阻塞
- 9i+:闪回查询 select ... as of scn :scn;(这相当于把数据库放到一个版本管理系统下了。。。)
- exec :scn = dbms_flashback.get_system_change_number;
- id:创建trigger?
- 更好的方法:create sequence t_seq; insert into ... values(t_seq.nextval,....)
- 复制绝不简单(并发的insert from select例子)
- 又:父子表的关联汇总报表查询,Oracle提供了:
- 子查询分解(WITH子句)、内联视图(select from select)、标量子查询
- 不支持这些特性的数据库,要么手工迭代每行执行聚集查询,要么使用hash join(浪费空间)?
- 每个用户一个会话?系统设置:
- create profile p_one_user_one_session limit sessions_per_user 1;
- 细粒度访问控制(FGAC)
体系结构概述
- 一个实例一个数据库?(授权限制?)
- ‘专用服务器’进程?
- TNS连接字符串?
- 监听器:指示端口号,以连接到调度器(有点像ftp?)
文件
- V$PARAMETER
- show parameter db_block_s #自动前缀匹配
- 可供任何用户用的:dbms_utility.get_parameter_value
- SPFILE:索引init.ora?
- 重做日志:ARCHIVELOG
- 10g Data Pump:用于取代老的EXP/IMP,--使用XML表示元数据?
内存结构
- SGA PGA UGA
- 行列转换(pivot)?
Oracle进程
- 11g DRCP
- 会话:可暂时中断物理连接?
- 。。。
锁和闩
- 事务是‘核心’
- 要延迟到适当时候提交:不提交不会有压力。。。
- 只要需要,长期保持锁(不是稀有资源)
- 不会锁升级(escalation),但可以转换(conversion),或提升(promotion)
- 3 types:
- DML锁:TX TM
- DDL锁:排他、共享、可中断
- latch(spin lock?)
并发与MVCC
- 隔离级别:读未提交,--Oracle中不允许
- 可重复读:防止‘丢失更新’
- 可串行化:ORA-08177错误(试图更新某行,但它自事务开始后已经被修改--一般因为所在数据块有其他行被修改)
- READ ONLY事务
- 写一致:重启动?
事务
- 可后台提交,因此不能保证持久性
- 完整性约束:
- IMMDIATE
- DEFERRABLE
- 无法通过频繁提交来‘节省’undo空间
- !可重启动:写操作应该是‘幂等’的?
redo与undo
- 与redo不同,undo内部存储在特殊的段中(rollback segment)
- undo:逻辑地恢复!
- COMMIT:调用LGWR刷新redo
- 关闭redo:NOLOGGING?
- 块清除:删除所修改数据块上的‘锁定’相关信息
- 临时表(8i 8.1.5+):不会生成redo
- 分析undo
- ORA-01555: snapshot too old
- INSERT生成的undo最少(只需删除一个rowid),DELETE生成的undo最多(哈)
数据库表
- 9种表类型:
- 堆组织的、索引组织的(IOT)、聚簇(index clustered)、散列聚簇、sorted散列聚簇(10g)、嵌套表、临时表、对象表、外部表
- 列数>254时,使用额外的row piece
- 段(占用磁盘存储的对象)
- MSSM、ASSM
- 高水位线(HWM)
- MSSM中的FREELIST --这里的概念有点类似于‘内存管理’?
- PCTFREE和PCTUSED
- IOT:适合于查找表
- *嵌套表(create type):不支持引用完整性约束,不能引用任何表包括自己 --鸡肋?
- *对象表:create table t of Some_Type; //?
索引
- 位图联合索引(bitmap join index)?
- 函数索引:DETERMINISTIC
- CBO
数据类型
- DATE TIMESTAMP INTERVAL
- LOB(大对象):CLOB(=TEXT?)、NCLOB、BLOB、BFILE
分区
- CREATE TABLE emp ... PARTITION BY HASH(empno) ( ... )
- 9i r1:列表分区
- 11g r1:间隔分区、引用分区
- 组合分区 ?
并行执行
- 并行查询是不可扩展的 ?
- Oracle Exadata
- 并行DML(PDML)
- PDDL
- DIY
数据加载与卸载
- SQL *Loader(SQLLDR)
- 9i+:外部表(直接访问外部文件系统)
加密
- 11g r1:Oracle钱夹*
- 透明表空间加密*