oracle不空顺序输出,Oracle应用笔记
简单整理自己的oracle笔记。
1、采用excel表格中的数据直接粘贴数据库记录中,默认会在后面加一个空格“”,操作完成后一定要记得对空格匹配然后修改一下。
2、查询数据库里的所有表结构,采用select * from dba_tables(sys登录);
查看某个用户所拥有的表:select * from all_tables WHERE owner='SCOTT' ;
或者 SELECT * FROM DBA_TABLES WHERE OWNER='SCOTT';
3、上午在PL/SQL dev中建表时提示ORA-00907: 缺失右括号,检查sql脚本发现
eu_bctype INT(50)
Oracle中int为定长的类型,不能再规定其长度,需要改成number;
4、intersect运算
返回查询结果中相同的部分既他们的交集
SQL> select * from abc
2 intersect
3 select * from abc2 ;
5、minus运算
返回在第一个查询结果中与第二个查询结果不相同的那部分行记录,
即两个结果的差集
SQL> select * from abc2
2 minus
3 select * from abc ;
6、TO_CHAR格式化小数点输出
select To_char(sum(score),9999999.99)from score;
7、有很多种方法可以用来找出哪些SQL语句需要优化,但是很久以来,最简单的方法都是分析保存在V$SQL视图中的缓存的SQL信息。通过V$SQL视图,可以确定具有高消耗时间、CUP和IO读取的SQL语句
7.1查看总消耗时间最多的前10条SQL语句
select *
from (select v.sql_id,
v.child_number,
v.sql_text,
v.elapsed_time,
v.cpu_time,
v.disk_reads,
rank() over(order by v.elapsed_time desc) elapsed_rank
from v$sql v) a
where elapsed_rank <= 10;
7.2查看CPU消耗时间最多的前10条SQL语句
select *
from (select v.sql_id,
v.child_number,
v.sql_text,
v.elapsed_time,
v.cpu_time,
v.disk_reads,
rank() over(order by v.cpu_time desc) elapsed_rank
from v$sql v) a
where elapsed_rank <= 10;
7.3查看消耗磁盘读取最多的前10条SQL语句
select *
from (select v.sql_id,
v.child_number,
v.sql_text,
v.elapsed_time,
v.cpu_time,
v.disk_reads,
rank() over(order by v.disk_reads desc) elapsed_rank
from v$sql v) a
where elapsed_rank <= 10;
8、oracle优化操作
1.不用“<>”或者“!=”操作符。对不等于操作符的处理会造成全表扫描,可以用“”代替
不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。推荐方案:用其它相同功能的操作运算代替,
如: 1)a<>0 改为 a>0 or a<0
2)a<>’’ 改为 a>’’
2. 选择最有效率的表名顺序(只在基于规则的优化器中有效):
ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须
选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.
3.WHERE子句中的连接顺序
ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.
4.SELECT子句中避免使用 ‘ * ‘
ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间
5.减少访问数据库的次数:
ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等;
6.在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 ,建议值为200
7.使用DECODE函数来减少处理时间:
使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.DECODE(input_value,value,result[,value,result…][,default_result]);
9.删除重复记录:
最高效的删除重复记录方法 ( 因为使用了ROWID)例子:
DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)
FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
10.用TRUNCATE替代DELETE:
当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是
恢复到执行删除命令之前的状况) 而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短. (译者
按: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML)
11.用Where子句替换HAVING子句:
避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的
开销. (非oracle中)on、where、having这三个都可以加条件的子句中,on是最先执行,where次之,having最后,因为on是先把不符合条件的记录过滤后才进行统计,它就可
以减少中间运算要处理的数据,按理说应该速度是最快的,where也应该比having快点的,因为它过滤数据后才进行sum,在两个表联接时才用on的,所以在一个表的时候,就
剩下where跟having比较了。在这单表查询统计的情况下,如果要过滤的条件没有涉及到要计算字段,那它们的结果是一样的,只是where可以使用rushmore技术,而having
就不能,在速度上后者要慢如果要涉及到计算的字段,就表示在没计算之前,这个字段的值是不确定的,根据上篇写的工作流程,where的作用时间是在计算之前就完成的,而
having就是在计算后才起作用的,所以在这种情况下,两者的结果会不同。在多表联接查询时,on比where更早起作用。系统首先根据各个表之间的联接条件,把多个表合成一
个临时表后,再由where进行过滤,然后再计算,计算完后再由having进行过滤。由此可见,要想过滤条件起到正确的作用,首先要明白这个条件应该在什么时候起作用,然后
再决定放在那里
12.使用表的别名(Alias):
当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误.
13.用EXISTS替代IN、用NOT EXISTS替代NOT IN:
在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率. 在子查询中,NOT IN子句将执
行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历). 为了避免使用NOT IN ,我们可以把它改写成外连接(Outer
Joins)或NOT EXISTS.
例子:
(高效)SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND EXISTS (SELECT ‘X' FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB')
(低效)SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = ‘MELB')
13.sql语句用大写的;因为oracle总是先解析sql语句,把小写的字母转换成大写的再执行
14.避免在索引列上使用NOT
我们要避免在索引列上使用NOT, NOT会产生和在索引列上使用函数相同的影响. 当ORACLE”遇到”NOT,他就会停止使用索引转而执行全表扫描.
15.避免在索引列上使用计算.
WHERE子句中,如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描.
举例:
低效:
SELECT … FROM DEPT WHERE SAL * 12 > 25000;
高效:
SELECT … FROM DEPT WHERE SAL > 25000/12;
16.用>=替代>
高效:
SELECT * FROM EMP WHERE DEPTNO >=4
低效:
SELECT * FROM EMP WHERE DEPTNO >3
两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录.
17.避免在索引列上使用IS NULL和IS NOT NULL
避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引.对于单列索引,如果列包含空值,索引中将不存在此记录. 对于复合索引,如果每个列都为空,索引中同样不存在此记录. 如果至少有一个列不为空,则记录存在于索引中.举例: 如果唯一性索引建立在表的A列和B列上, 并且表中存在一条记录的A,B值为(123,null) , ORACLE将不接受下一条具有相同A,B值(123,null)的记录(插入). 然而如果所有的索引列都为空,ORACLE将认为整个键值为空而空不等于空. 因此你可以插入1000 条具有相同键值的记录,当然它们都是空! 因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使ORACLE停用该索引.
低效: (索引失效)
SELECT … FROM DEPARTMENT WHERE DEPT_CODE IS NOT NULL;
高效: (索引有效)
SELECT … FROM DEPARTMENT WHERE DEPT_CODE >=0;
18.索引的弊端
a. 如果检索数据量超过30%的表中记录数.使用索引将没有显著的效率提高.
b. 在特定情况下, 使用索引也许会比全表扫描慢, 但这是同一个数量级上的区别. 而通常情况下,使用索引比全表扫描要块几倍乃至几千倍!
19.可能引起全表扫描的操作
在索引列上使用NOT或者“<>”
对索引列使用函数或者计算
NOT IN操作
通配符位于查询字符串的第一个字符
IS NULL或者IS NOT NULL
多列索引,但它的第一个列并没有被Where子句引用
9、oracle SQL分页查询处理
分页取11到20的记录,两种查询方法,如下,
通过rownum,然后对记录进行截取处理。
第一种的速度会比较快点,因为在tab1这层先过滤掉了一部分数据,第二种方法到最外层再进行处理
--分页查询1
SELECT TAB2.*
FROM (SELECT tab1.*, ROWNUM row_num
FROM (
--把需要分页的sql直接放进来就行了
SELECT t.* FROM T_T_DEPT t
) TAB1
WHERE ROWNUM<21
) TAB2
WHERE TAB2.row_num >10
--分页查询2
SELECT TAB2.*
FROM (SELECT tab1.*, ROWNUM row_num
FROM (
--把需要分页的sql直接放进来就行了
SELECT t.* FROM T_T_DEPT t
) TAB1
) TAB2
WHERE TAB2.row_num BETWEEN 11 AND 20
oracle不空顺序输出,Oracle应用笔记相关推荐
- oracle 命令日志输出,ORACLE常用命令日志
第一章:日志管理 1.forcing log switches sql> alter system switch logfile; 2.forcing checkpoints sql> a ...
- oracle生成顺序编号,Oracle排序以及序号的输出 | 学步园
在一般Select语句中我们通过Order by ...Asc/Desc来进行排序.但是这种排序方式在输出时,不包含排序后的序号信息. 现在介绍一下Oracle中可以用于排序输出的方法. 1. RAN ...
- oracle调用存储过程输出,oracle中存储过程调用存储过程(带有返回结果集)
在oracle中,存储过程是可以调用存储过程的.其中,被调用的存储过程可以带返回游标的结果集,或者是一个定义的变量,两者都可以,在实现过程中几乎没什么差别.在调用的存储过程,要注意写好对应的游标或者定 ...
- 冒泡排序 例题:给出一组数将这组数按从小到大的顺序输出出来
冒泡排序 例题:给出一组数将这组数按从小到大的顺序输出出来 学习笔记,方便自己日后复习,也可供大家参考学习 冒泡排序百度上是这样定义的: 冒泡排序:它重复的走访过要排序的元素列,依次比较两个相邻元素, ...
- oracle和mysql查询条件排序_Oracle数据库中ORDERBY排序和查询按IN条件的顺序输出
ORDER BY非稳定的排序提一个问题: oracle在order by 排序时,是稳定排序算法吗? 发现用一个type进行排序后,做分页查询,第一页的数据和第二页的数据有重复 怀疑是order by ...
- oracle中如何格式化输出,【学习笔记】数据库日期时间格式化输出案例
天萃荷净 分享一篇关于开发DBA在工作中常用到的日期时间格式化输出方法案例,含:mysql.sql server.oracle 3种数据库日期时间格式化输出 1.mysql数据库时间格式化输出 DAT ...
- “Oracle数据库并行执行”技术白皮书读书笔记
本文为白皮书Parallel Execution with Oracle Database(2019年2月20日版本)的读书笔记. 简介 数据快速增长,但业务仍要求数据的快速处理. 并行执行是大规模数 ...
- oracle中常用关键字,oracle常用函数及关键字笔记
--函数及关键字-- 1.trim,ltrim,rtrim 去除字符,无指定默认去除空格 SELECT TRIM('a' FROM 'aafhfhaaaaaaaa'), LTRIM('aafhfhaa ...
- oracle protocol=beq 不可用,学习笔记:Oracle数据库坏块 深入研究obj$坏块导致exp/expdp不能执行原因...
天萃荷净 深入研究Oracle坏块obj$导致exp/expdp不能执行导出的原因 上篇(案例:Oracle出现obj$坏块exp/expdp导出不能导出的解决办法ORA-01578 ORA-0111 ...
最新文章
- ajax 返回数组某个属性值,js中sort方法根据数组中对象的某一个属性值进行排序...
- 中国科技大学计算机考研复试内容,中国科学技术大学考研复试
- CentOS统的7个运行级别的含义
- mysql引擎模式_mysql引擎,完整的见表语句,数据库模式, 常用数据类型,约束条件...
- 【Cqoi2006】【BZOJ2222】猜数游戏(乱搞)
- Python定义函数及引用
- js 实现 间隙滚动效果
- Unity实现多语言切换
- 【雷达与对抗】【2014】MIMO雷达中的波束形成研究
- 针对特定人员和部门树形数据,重新拆分构造新的树形数据思路。
- java 图片 黑白_Java实现彩色图片转为黑白图片
- Effective Java 2.0_中英文对照_Item 7
- OpenCV3之——霍夫变换(霍夫线变换和霍夫圆变换)
- 浏览器崩溃原因大集合
- 访问的网页自动打开QQ对话
- 中国2001-2019年各省风险投资数据VC
- 核心期刊《中国兽医学报》
- Google面试题(java)—有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD
- Linux虐我千百遍,我待linux如初恋
- ubuntu9.04新氧中文定制版类似ghost
热门文章
- Spring+SpringMVC+Mybatis项目—企业权限管理系统(2)
- 如何修改服务器Tomcat的首页为项目
- 64位系统下,一个32位的程序究竟可以申请到多少内存,4GB还是更多
- java连接hbase时出现....is accessible from more than one module:
- Tomcat安装与环境变量的配置
- UVALive 6885	 Flowery Trails 最短路枚举
- 什么是Cookie对象,Session对象,Application对象等问题
- nyoj_111_分数加减法_201311281341
- linux-04-磁盘命令+进程命令
- Linux命令整理 —— 目录结构