CDR_DATA表数据比较大,并且没有index,下面这条语句比较简单,就是想取出满足条件的纪录的条数。不用index
大侠们看看有没有优化性能的可能。
现在大概是5秒,希望能提高的越快越好。SELECT count(*) INTO d_count
FROM cdr_data
WHERE
account_no <> v_billed_account_no
and subscr_no = v_subscr_no
and subscr_no_resets = v_subscr_no_resets
and msg_id>-1;primary-key on msg_id。200分相送。
大侠们看看有没有优化性能的可能。
现在大概是5秒,希望能提高的越快越好。SELECT count(*) INTO d_count
FROM cdr_data
WHERE
account_no <> v_billed_account_no
and subscr_no = v_subscr_no
and subscr_no_resets = v_subscr_no_resets
and msg_id>-1;primary-key on msg_id。200分相送。
我们要避免在索引列上使用NOT, NOT会产生在和在索引列上使用函数相同的影响. 当ORACLE”遇到”NOT,他就会停止使用索引转而执行全表扫描.
WHERE子句中,如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描.
举例:
低效:
SELECT … FROM DEPT WHERE SAL * 12 > 25000;
高效:
SELECT … FROM DEPT WHERE SAL > 25000/12;
ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间
高效:
SELECT * FROM EMP WHERE DEPTNO >=4
低效:
SELECT * FROM EMP WHERE DEPTNO >3
两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录.