SQL优化
1、使用具体列名代替 * 号,根据执行计划,星号最好还是解析成具体列。
2、查询条件是从右到左解析,所以把最重要的条件放到最后面,简化查询。
3、能使用关联查询不要使用子查询,因为子查询最后根据执行计划还是解析成关联查询。
4、尽量不要使用集合运算,集合数越多,效率越低。union/union all/intersect/minus。
常见错误
1、含有null的表达式永远为null。
2、null不等于也不等于null。
3、in (xxx,xxx,null)可以, not in (xxx,xxx,null)不可以
select 1 from dual where 1!=null 这个是没有结果的,任何值null或者不是null!=null都没有结果,not in 等于 <>all。任何值!=null都是false,所以整个语句返回的就是没有结果。
in 等于 =any 只要符合一个最后的结果就是true,是可以返回结果的。
4、dml语句可以回滚,ddl语句不可以。ddl语句里自带commit操作。
set timing on;//打开执行sql时间显示
set timing off;//关闭执行sql时间显示
delete语句之后会产生碎片,删除数据位置不会再插入数据。因为高水位线已经在最新插入记录的上方,影响查询效率,所以要清除碎片。
alter table 表名 move;
oracle绝大多数操作都是可逆的;
oracle数据库delete比truncate删除的快。。。;
mysql正好相反;
rownum永远按照默认的顺序生成;
rownum只能使用<,<= 不能使用>,>=;(因为rownum永远从1开始),如果想用oracle分页,先查询所有排序,作为一个子查询的集合,然后外面包上rowunm,加上条件上限 rownum<=几,这作为第二层,把rownum 起别名r 作为第二层子查询的一个列,然后最外层在查询这个列的>=几,比较麻烦,如果是排序的分页查询需要两层子查询,如果不需要排序也需要一层子查询,重点是将rownum起别名 当成列 跟子查询的集合合在一起,然后外层再查这个列大于等于什么。
主键说到底是索引,所以通过主键查最快。
视图作用 简化复杂查询
数据库对象:1、表 2、视图 3、序列 4、索引 5、同义词 6、存储过程 7、存储函数 8、包头 9、包体 10、触发器