低效:
SELECT DISTINCT DEPT_NO,DEPT_NAME
FROM DEPT D,EMP E
WHERE D.DEPT_NO = E.DEPT_NO
高效:
SELECT DEPT_NO,DEPT_NAME
FROM DEPT D
WHERE EXISTS ( SELECT ‘X’
FROM EMP E
WHERE E.DEPT_NO = D.DEPT_NO);
10、下面的查询将强迫对orders表执行顺序操作:
SELECT * FROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008
虽然在customer_num和order_num上建有索引,但是在上面的语句中优化器还是使用顺序存取路径扫描整个表。因为这个语句要检索的是分离的行的集合,所以应该改为如下语句:
SELECT* FROM orders WHERE customer_num=104 AND order_num>1001
UNION
SELECT * FROM orders WHERE order_num=1008
这样就能利用索引路径处理查询。
11、避免相关子查询
一个列的标签同时在主查询和where子句中的查询中出现,那么很可能当主查询中的列值改变之后,子查询必须重新查询一次。查询嵌套层次越多,效率越低,因此应当尽量避免子查询。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。
12、在缺省情况下,ORACLE采用CHOOSE优化器, 为了避免那些不必要的全表扫描(full table scan) , 你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器.
13、一般情况下性能上:count(一个索引字段) > count(*) > count(一个非索引字段)
14、在select和where中尽量不要使用sysdate函数;因为它是每处理一行数据就要到系统中取一次系统时间;一般的解决的方法先把系统时间取出来当做一个变量传入:select sysdate from dual;
15.CHAR的长度是固定的,而VARCHAR2的长度是可以变化的;
CHAR的效率比VARCHAR2的效率稍高;
但VARCHAR2比CHAR节省磁盘空间。如磁盘空间节省的多;有时VARCHAR2也会比CHAR的效率稍高;看实际情况而定。
16.数字 — 长整型 Number(11)
数字 — 字节型 Number(3)
数字 — 整型 Number(5)
日期/时间 Date Date
布尔型 Number(1) 或 char(1)
精度型 一般是 Number(M,N),M是有效数字,N是小数点后的位数(默认0)
Number默认是Number(M,N); M=38,可以根据数字随机适应;但占用磁盘空间大。
17.nchar,nvarchar2,nclob和char:varchar2, clob:
在utf-8的oracle数据库时;最大char(4000);nchar(2000);
但一个汉字char(3);nchar(1);
所以在汉字用的多和频繁的文本时;建议用nchar();其它的clob;varchar2和char相似。