oracle用WHERE替代ORDER BY
ORDER BY 子句只在两种严格的条件下使用索引. ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序. ORDER BY中所有的列必须定义为非空. WHERE子句使用的索引和ORDER BY子句中所使用的索引不能并列. 例如: ????? 表DEPT包含以下列: ??????? DEPT_CODE??? PK??? NOT NULL ??????? DEPT_DESC?????????? NOT NULL ??????? DEPT_TYPE?????????? NULL ??? ?????? 非唯一性的索引(DEPT_TYPE) ???? 低效: (索引不被使用) ??????????? SELECT DEPT_CODE ??????????? FROM DEPT ??????????? ORDER BY DEPT_TYPE ? ?????EXPLAIN PLAN: ??????????? SORT ORDER BY ????????????????? TABLE ACCESS FULL ???? 高效: (使用索引) ?????????? SELECT DEPT_CODE ?????????? FROM DEPT ??????? WHERE DEPT_TYPE > 0 ??? EXPLAIN PLAN: ????? TABLE ACCESS BY ROWID ON EMP ???????????? INDEX RANGE SCAN ON DEPT_IDX ? ????? ORDER BY 也能使用索引! 这的确是个容易被忽视的知识点. 我们来验证一下: SQL>? select * from emp order by empno; Execution Plan ---------------------------------------------------------- ?? 0????? SELECT STATEMENT Optimizer=CHOOSE ?? 1??? 0?? TABLE ACCESS (BY INDEX ROWID) OF ‘EMP‘ ?? 2??? 1???? INDEX (FULL SCAN) OF ‘EMPNO‘ (UNIQUE) (编辑:威海站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |