本文为读书笔记<<Oracle查询优化改写2.0技巧与案例》-电子工业出版社(有教无类、落落著)html
---------------------------------------------------基础----------------------------------------------------------------------------------sql
一、空值:查询(is null)、处理空值(NVL(null,0)、COALESCE(null,null,0))、空值不支持运算(+-*/ 比较 相等) 查询为空、排序(升序在后降,手动更改:nulls first)、'' is null(为true)dom
二、别名:AS 引用别名要再嵌套一层函数
三、拼接:||' '=>生成sql语句工具
四、列排序:列名(DESC ASC)、 序号(从1开始)、 多列排序(从左至右)、随机排序(dbms_random.value)、条件排序(order by case when..)oop
五、关联链接:INNER JOIN(两表匹配)、LEFT JOIN(左表全部,右表匹配)、RIGTH JOIN(右表全部,左表匹配)、FULL JOIN(所有数据)fetch
用(+) LEFT JOIN (+号在右表上) 连接与过滤条件(先过滤再JOIN 、先JOIN再关连)优化
六、多表插入:无条件INSERT 、有条件INSERT ALL WHEN THEN INTO 、INSERT FIRST WHEN THEN、转置:Isert all into t1() values ('',仁) 同价于union all :不一样列的数据插入到同一表中spa
七、批量更新:MERGE INTO EMP USING(select ...) DEPT ON (条件) when mathed then update set ... when not mathecd then insert ()code
八、树形查询:select LEVEL,(PRIOR 上级信息) from emp start with 开始条件 CONNECT BY LEVEL (PRIOR ID)=parentId
connect_by_isleaf isleaf:是否叶节点
sys_connect_by_path(t.orgname,','):',
排序:order SIBLINGS BY
select level,t.orgname ,sys_connect_by_path(t.orgname,',') from AUTH_ORG t where connect_by_isleaf=1 start with t.parentid='-1' connect by (prior t.id)=t.parentid order siblings by t.sortcode
九、分页排序:select rn,ename from (select rownum as rn,ename from (select ename from emp where .. order by ..) x where rownum<=10)) where rn>=6
select ename,rn from( select ename,row_number() over(patition deptid order by sal)as rn,ename from emp where)x where rn between 6 and 10;
十、partition by:分析函数,能够与聚合函数一块儿配合使用,OVER (PARTITION BY子句 ORDER BY子句 ROWS/RANGE子句),
rows与range窗口子句:若是分析函数没有指定ORDER BY子句,也就不存在ROWS/RANGE窗口的计算,range是逻辑窗口,是指定当前行对应值的范围取值,列数不固定,只要行值在范围内,对应列都包含在内;rows是物理窗口,即根据order by 子句排序后,取的前N行及后N行的数据计算
unbounded:无界限 preceding:从分区第一行头开始,则为 unbounded。 N为:相对当前行向前的偏移量 following :与preceding相反,到该分区结束,则为 unbounded。N为:相对当前行向后的偏移量 current row:顾名思义,当前行,偏移量为0
PARTITION BY W_PURCH_SCHEDULE_LINE_F.PRODUCT_WID ORDER BY TRUNC(W_DAY_D.DAY_DT) RANGE BETWEEN INTERVAL '2' day preceding and INTERVAL '1' day following
经常使用分析函数:row_number() sum() max() count()
十一、包结构:包含两部分包规范和包体,包定义PACKAGE:包内公有元素(类型 变量名等) 包体PACKAGE BODY:包的实现
十二、管道函数:能够返回行集合,能够像查询物理表同样查询它或者将其赋值给集合变量;PRAGMA AUTONOMOUS_TRANSACTION使用自治事务使管道函数做为独立事务处理; 最后空返回:return;
1三、%TYPE定义方式:一个变量的数据类型与另外一个已经定义了的变量(尤为是表的某一列)的数据类型 %ROWTYPE:使一个变量的数据类型与一个表中记录的各个列的数据类型相对应、一致
1四、游标: sys_refcursor; open cur for select * from t ; loop fetch cur into v_row exit when cur%NOTFOUND(v_cur%notfound有三种状态,true,false,null) pipe ROW(v_row) end loop; close cur;
1五、
---------------------------------------------------技巧----------------------------------------------------------------------------------
一、删除名称重复的记录:DELETE FROM TABLE T WHERE EXISTS(SELECT NULL FROM TABLE B WHERE B.NAME=T.NAME AND T.ROWID>B.ROWID)
二、计算字符在字符串中出现的次数:regexp_count(srcstr,pattern,position,modifer)
三、删除字符串中不须要的字符:TRANSLATE(str,'1'||replace,'1') regexp_replace(str,'[replace]')
四、行变分隔列表:listagg(t.username,',') within group(order by t.no)
五、复制表:create table t_2 as select * from t where 1=2
6.
---------------------------------------------------执行计划----------------------------------------------------------------------------------
explain plan --sql select * from table(dbms_xplan.display());
一、执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述
二、列的管理: 工具 —> 首选项 —> 窗口类型 —> 计划窗口 —> 根据须要配置要显示在执行计划中的列
基数(Rows):Oracle估计的当前操做的返回结果集行数
字节(Bytes):执行该步骤后返回的字节数
耗费(COST)、CPU耗费:Oracle估计的该步骤的执行成本,用于说明SQL执行的代价,理论上越小越好(该值可能与实际有出入)
时间(Time):Oracle估计的当前操做所需的时间
三、常见描述:
表访问的几种方式:(非所有):表上存在选择性很好的索引,却走了全表扫描,并且是大表的全表扫描,就说明表的访问方式可能存在问题,大表上没有合适的索引而走了全表扫描,就须要分析可否创建索引,或者是否能选择更合适的表链接方式和链接顺序以提升效率。
TABLE ACCESS FULL(全表扫描)
TABLE ACCESS BY ROWID(经过ROWID的表存取)
TABLE ACCESS BY INDEX SCAN(索引扫描)
索引扫描又分五种:
INDEX UNIQUE SCAN(索引惟一扫描)
INDEX RANGE SCAN(索引范围扫描)
INDEX FULL SCAN(索引全扫描)
INDEX FAST FULL SCAN(索引快速扫描)
INDEX SKIP SCAN(索引跳跃扫描)
四、hint:详见:https://www.cnblogs.com/emilyyoucan/p/7844795.html(hurong)
五、Oracle优化器:基于规则的优化方式(Rule-Based Optimization,简称为RBO)、基于代价的优化方式(Cost-Based Optimization,简称为CBO)
默认:Choolse:默认的状况下Oracle用的即是这种方式。指的是当一个表或或索引有统计信息,则走CBO的方式,若是表或索引没统计信息,表又不是特别的小,并且相应的列有索引时,那么就走索引,走RBO的方式。