在Oracle中空不等于空,所以,就会插入若干条相同键值的记录,而他们的值都是空,而空值不进行索引,所以,当进行空值比较时,会使用Oracle,停止使用该索引。
低效:
Select …. From dep where dep_code is not null;
高效:
Select …. From dep where dep_code >=0;这里也会过滤掉null列
总是使用索引的第一个列:
如果索引建立在多个列上,只有咋他的第一个列,被where自居引用时,优化器才会选择使用该索引,当仅使用索引的第二个列是,优化器会忽略索引,使用全表索引。
15、>=是直接定位:
如果使用 >还需要一个判断的过程。
16、使用union替代where字句中的or:
对索引列使用or会导致全表扫描,针对多个索引列有效
17、在oracle8i下,两者执行路径似乎相同,但能用in的就别用or。
18、使用union-all:
union-all:不排序,查询所有的,不过滤重复的
nuion:排序(优化sort_raea_size这块内存),过滤重复的。
19、order by 用where 限定:
order by名中索引的条件比较苛刻
排序列必须包含在相同的索引中,并保持索引中的排列顺序,Order by中所有列不能定义为空。
20、需要当心的where子句:
!=将不使用索引
||字符连接函数,会停用索引
+ - * / 会停用索引
相同的索引列不能互相比较,否则会启用全表扫描
21、使用大写:
Oracle中会把所有的语句转换成大写,
有些内部表,如,查询表名时,判断某个表是否存在,如果是大写有效,小写就是无效的
22、根据磁盘读写速率调整块的大小:
一个Oracle数据库中,表空间、段、区、数据块的概念,可以根据服务器的I/O性能调整块的大小。
总结:
上面的点分的很细,他们都是根据Oracle的内部原理总结出的常用规律,所以,掌握原理要比记住这些跳跳框架更加重要,常用的规则有:
Oracle按照从右到左,从下至上、由外到内的执行顺序
在检索数据的时候,往往遵循查到即返回的原则
索引,记录的是有哪些数据,所以,不要在索引列上直接使用排除不存在条件的查询,也不要在索引上进行计算
Oracle认为空不等于空
where命中索引的几率比较高,通常情况下,优先选择使用where。