oracle数据库,提高查询效率

1.FROM子句

ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理。 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。

例如:t1 400W数据,t2 40数据

from t1,t2 优于 fromt2,t1

如果有第三张连接表,则将连接表放在最后作为基础表:

from t1,t2,t3 where t1.no=t3.no and t2.id=t3.id


2.WHERE子句

ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾

例如: select * FROM table1 where a='a' and b1='b' and c1='c'

table1有a,b,c三个属性,上面的sql会报错:C1标识符无效,改了之后执行,报B1标识符无效

重右往左解析sql,从下往上执行,建议把过滤量大的语句写在后面。尽量把精确条件往后写,表之间的连接必须写在其他WHERE条件之前

精确条件 t1.a='a'  表连接条件t1.a=t2.a


3.避免使用 *

ORACLE在解析的过程中,会将’*’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的,这将耗费更多的时间。


4.EXISTS替代IN,用于连接另一个表


5.使用大写


6.用>=替代> :

高效:SELECT * FROM EMP WHERE DEPTNO >=4 低效: SELECT * FROM EMP WHERE DEPTNO >3

两者的区别在于,前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录。


7.使用表的别名


8.避免在索引列上使用IS NULL和IS NOT NULL

对于单列索引,如果列包含空值,索引中将不存在此记录。对于复合索引,如果每个列都为空,索引中同样不存在此记录。如果至少有一个列不为空,则记录存在于索引中。


9.使用索引

(1)‘!=' 将不使用索引。记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中。

(2)‘||'是字符连接函数。就象其他函数那样, 停用了索引。

(3)‘+'是数学函数。就象其他数学函数那样, 停用了索引。

(4)相同的索引列不能互相比较,这将会启用全表扫描。


猜你喜欢

转载自blog.csdn.net/beitacat/article/details/80940331