Oracle 数据库是功能性很好的数据库管理系统,至今为止在数据库市场中仍占有主要份额,下文中将为大家讲解 Oracle中 存储过程和 Sql 语句的优化重点 ,希望对大家能够有所帮助。
1. 全表扫描和索引扫描
大数据量表尽量要避免全表扫描,全部扫描会按顺序每条记录扫描,对于 >100万数据表影响很大。
Oracle中通过 RowID访问数据是最快的方式
对字段进行函数转换,或者前模糊查询都会导致无法应用索引而进行全表扫描
对 Oracle共享池和缓冲区中的Sql必须要大小写都完全用上才能够匹配上
2. 顺序问题
Oracle按照从右到左的顺序对数据表进行解析。因此 From最后面的表为基础表,一般要选择记录数最少的表作为基础表。
对于 Where条件的顺序,过滤到最大查询记录数量的条件必须写在Where条件的结尾处。
Where条件中涉及到使用复杂函数判定的必须注意要写到 Where条件的最前面
3. 索引方面
记录数少的表保留有主键索引就可以了,不要再去建其它索引,全表扫描也很快
索引最好单独建立表空间,必要时候对索引进行重建
必要时候可以使用函数索引,但不推荐使用
Oracle中的视图也可以增加索引,但一般不推荐使用
Sql语句中大量使用函数时候会导致很多索引无法使用上,要针对具体问题分析
4. 其它
避免使用 Select ,因为系统需要去帮你将转换为所有的列名,这个需要额外去查询数据字典。
Count(1)和 Count()差别不大。
多使用 Decode函数来作简单的代码和名称间的转换,以减少表关联
使用 Truncate替代delete来删除记录,但Truncate数据不记录日志,无法进行回滚
对于复杂的存储过程可以多次提交的数据的要多分多次 Commit,否则长事务对系统性能影响很大
Distinct和 Having子句都是耗时操作,应该尽可能少使用
在不需要考虑重复记录合并时候用 Union All来代替Union
使用显性游标而不使用隐性游标,特别是大数据量情况下隐性游标对性能影响很大
是否使用函数的问题
用直接的表关联来代替 Exist.用Exist或Not Exists来代理In。In进行子查询效率很差。
5.SQL 语句分析
通过 SQLPLUS中的SET TRACE 功能对Sql语句的性能进行分析
通过 Toad或PL/SQL Developer对语句的性能进行和索引的使用情况进行分析
对 Oracle缺省的优化不满意可以强制使用Hint,但一般不推荐使用
对 Flag等只存储是或否信息的字段,一般不推荐建立索引。必要可以采用位图索引
存在递归查询情况如果关联 Table太多对性能会造成较大影响,往往推荐采用临时表转为分步骤操作提高性能
尽量使用表关联查询而不使用函数,但涉及类似于代码表要重复关联多次取数据问题时候又适合使用函数
上文中就 Oracle中存储过程和Sql语句的优化重点作出了详细的讲解,希望大家都能够从中有所收获,这样,在以后的工作中遇到类似问题就能够轻松解决。