浏览 22949 次
锁定老帖子 主题:Oracle SQL优化技巧
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-04-11
1.去掉不必要的大型表的全表扫描 2.缓存小型表的全表扫描 3.检验优化索引的使用 4.检验优化的连接技术 5.尽可能减少执行计划的Cost 现在简单的举几个例子 Where子句中有“!=”将不使用索引 select account_name from test where amount != 0 (不使用) select account_name from test where amount > 0 (使用) Where条件中对字段增加处理函数将不使用该列的索引 select * from emp where to_char(hire_date,'yyyymmdd')='20080411' (不使用) select * from emp where hire_date = to_char('20080411','yyyymmdd') (使用) 避免在索引列上使用IS NULL和 IS NOT NULL select * from emp where dept_code is not null (不使用) select * from emp where dept_code > 0 (使用) 通配符% 的使用 select * from emp where name like '%A' (不使用索引) select * from emp where name like 'A%' (使用索引) 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-04-11
避免在索引列上使用IS NULL和 IS NOT NULL
select * from emp where dept_code is not null (不使用) select * from emp where dept_code > 0 (使用) --------------------- 这个应该是走索引的吧?! |
|
返回顶楼 | |
发表时间:2008-04-11
xiaoych 写道 避免在索引列上使用IS NULL和 IS NOT NULL
select * from emp where dept_code is not null (不使用) select * from emp where dept_code > 0 (使用) --------------------- 这个应该是走索引的吧?! 不好意思 是我錯了 應該是IS NULL不會用到索引 而IS NOT NULL用到索引全掃描 |
|
返回顶楼 | |
发表时间:2008-04-11
補充一下:
在含有子查询的SQL语句中,要特别注意减少对表的查询.例子: SELECT EMP_NO FROM EMP WHERE (GROUP,NAME) = ( SELECT COLUMN1,COLUMN2 FROM TEST WHERE TEST_ID = 604) 最高效的删除重复记录方法 ( 因为使用了ROWID)例子: DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID) FROM EMP X WHERE X.EMP_NO = E.EMP_NO); sql语句用大写的;因为oracle总是先解析sql语句,把小写的字母转换成大写的再执行 在java代码中用到preparedStatement的時候尽量少用连接符“+”连接字符串! |
|
返回顶楼 | |
发表时间:2008-04-11
通配符% 的使用
select * from emp where name like '%A' (不使用索引) select * from emp where name like 'A%' (使用索引) 可以通过建立反向索引..让 select * from emp where name like '%A' 也使用索引 |
|
返回顶楼 | |
发表时间:2008-04-11
yanyanlong 写道 可以通过建立反向索引..让 select * from emp where name like '%A' 也使用索引 好像我們一般不用反向索引 再説 reverse索引一般用于ops环境 |
|
返回顶楼 | |