封转数据库字段
varray 表
CREATE OR REPLACE TYPE EMPLOYER_NAME AS OBJECT
(
E_NAME VARCHAR(40)
)
;
CREATE OR REPLACE TYPE PRIOR_EMPLOYER_NAME_ARR AS VARRAY(10) OF EMPLOYER_NAME;
CREATE OR REPLACE TYPE FULL_MAILLING_ADRESS_TYPE AS OBJECT(STREET VARCHAR2(80), CITY VARCHAR2(80), STATE CHAR(2), ZIP VARCHAR2(10));
CREATE OR REPLACE TYPE EMPLOYEE AS OBJECT(LAST_NAME VARCHAR(40), FULL_ADDRESS FULL_MAILLING_ADRESS_TYPE, PRIOR_EMPLOYERS PRIOR_EMPLOYER_NAME_ARR);
CREATE TABLE EMP OF EMPLOYEE;
INSERT INTO EMP VALUES('Jim', FULL_MAILLING_ADRESS_TYPE('Airplan Ave', 'Rocky', 'NC', '2343'), PRIOR_EMPLOYER_NAME_ARR(EMPLOYER_NAME('IBM'), EMPLOYER_NAME('APPLE'), EMPLOYER_NAME('CNN')));
回滚
DROP TYPE PRIOR_EMPLOYER_NAME_ARR FORCE;
DROP TYPE FULL_MAILLING_ADRESS_TYPE FORCE;
DROP TYPE EMPLOYEE FORCE;
DROP TYPE EMPLOYER_NAME FORCE;
DROP TABLE EMP;
COMMIT;
封装字段的查询
SELECT P.LAST_NAME, PRIOR_EMPLOYERS.*
FROM EMP P, TABLE(P.PRIOR_EMPLOYERS) PRIOR_EMPLOYERS
WHERE P.LAST_NAME = 'Jim';
SQL 执行过程
1,检查安全性,确保sql数据执行者有权限执行
2,检查sql语法
3,可能发生的查询重新书写
4,执行
1.创建执行计划
2.生产器接受经过解析的sql
3.捆绑执行计划
4.执行执行计划
5.读取结果记录
6.排序结果集
SQL 执行级别
数据访问方式:
1,全表扫描 db_file_multiblock_read_count
顺序读取,知道结尾
1.当表中不存在索引
2.查询中不包含where字句
3.内置函数中的索引无效
4.like操作 %开头
5.使用基于成本优化器 数据量少时
6.当初始化文件中存在optimizer_mode = all_rows
2, 赛列获取
Oracle对单表簇和多表簇进行散列存储,用来在连接操作中减低输入 输出
3,ROWID 访问
通过Rowid访问单条数据最快的方式,在实际的引用中,首先从索引中收集ROWID,然后通过ROWID进行数据读取
索引访问方式
索引都可以看做一组符合主键和ROWID的组合,索引访问的目的是收集对目标快速读取时所需要的ROWID
B树索引,位图索引 基于函数的索引.
索引范围扫描:读取一个或者多个ROWID 索引数值升序排列
eg:select * from table where a = 'a';
快速全索引扫描
eg: select distinct color,count(*) from table group by color;
单个索引扫描:读取一个单独的ROWID
降序索引范围扫描:读取一个或者多个ROWID 索引数值降序排列
AND - EQUALS:
select * from table where a = 'a' and b > 34;
从where字句中收集多个ROWID
连接操作
嵌套循环连接
散列连接
排序合并连接
排序大小 sort_area_size_init.ora 参数
磁盘排序的执行速度要比内存排序的的执行速度慢14000倍
表连接的综合效率比较
sql优化器
目的是为sql语句生成最快 并且好资源最少的执行计划
1,基于规则的优化器
步骤
对于在where子句中的每一个表
- 生成一个可行的执行计划列表,这个列表中列出所有可以用来访问表的路径
- 为每一个执行计划指定级别数值
- 选择级别数值最低的计划
- 对结果集的选择级别最低 连接方法进行评估
2,基于成本的优化器
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。