oracle性能优化建议综述
Oracle使用自底向上序列解析WHERE子句。根据这个原则,表之间的连接必须写在其他条件之前。可以筛选出最多记录数的条件必须写在WHERE子句的结尾处。
特别是主键id =这样的条件。
原则二:避免在SELECT子句中使用*:
Oracle在解析过程中,将*转换为所有的名称,这是通过查询数据字典完成的,这意味着会有更多的时间消耗。
总之,时间越短的语句的执行,更好的是(特别是对系统的最终用户),查询语句,因为这是由全表扫描的数据量大,特别是对于大表,它不仅具有慢查询的速度,但也使磁盘IO压力很大,通常是可以避免的,而避免它通常是使用索引的方式。
使用索引的优点和成本。
优势:
1)指标是表概念的一部分,为了提高数据检索的效率,Oracle使用一个复杂的自平衡树结构。通常,索引查询数据比完整的表扫描快。当Oracle找到执行查询和更新语句的最佳路径时,Oracle优化器将使用索引使用相同的路径。链接多个表的索引也可以提高效率。
2)使用索引的另一个优点是,它提供了对主键(主键)的唯一验证。这些长或长的原始数据类型可以索引几乎所有列。一般来说,索引在大表中尤其有效。当然,您也会发现索引在扫描小表时也能提高效率。
价格:虽然使用指数可以查询效率,但也要注意价格指数。它需要存储空间,也需要定期维护,每当表或索引或列中的记录被修改时,索引本身也将被修改。这意味着每个记录插入、删除。更新将比支付磁盘4, 5倍多,因为索引需要存储和处理额外的、不必要的索引,这将使查询响应时间变慢,而表越大,影响越严重。
你需要注意使用索引的地方:
1。避免在索引列上使用。
我们希望避免使用索引列。不会对索引列上的函数产生相同的影响。当Oracle不满足时,他将停止使用索引来执行全表扫描。
2。避免在索引列上使用计算。
在WHERE子句中,如果索引列是函数的一部分,优化器将使用一个完整的表扫描而不使用索引。例如:
复制代码代码如下所示:
效率低:从12×25000的部门中选择;
高效率:从12 > 25000的部门中选择;
三.避免在索引列中使用NULL而不是NULL。
避免使用任何索引都可以为空的列,Oracle将无法使用性能指数作为单个索引,如果列包含一个空值,则该索引将不存在于此记录中。对于复合索引,如果每个列为空,则该索引不存在于同一记录中。如果至少有一个列表是空的,则记录在索引中。例如:如果唯一的索引基于表的A和B列,表中有一个记录,B值(123,null),Oracle将不接受同一个B值(123,null)的记录(插入)。但是,如果索引列全部为空,Oracle会认为密钥是空的,空的不是空的。因此,您可以插入1000个具有相同键值的记录,当然它们是空的!因为索引中的列中不存在null值,所以索引列空值比较的WHERE子句将导致Oracle禁用索引。
复制代码代码如下所示:
效率低:(指标失效)部门在dept_code是无效的选择;
效率:(指数有效)部门在dept_code > = 0选择;
4。注意通配符的%的效果。
Oracle可以禁用索引时使用通配符等:
复制代码代码如下所示:
选择…从部门dept_code像% 123456%(无效)。
选择…从部门dept_code =123456(有效)
5。避免更改索引列的类型。
在比较不同数据类型的数据时,Oracle会自动对列执行简单的类型转换。
假设EMPNO是一个数值类型索引列。选择…从EMP在empno =123实际上,Oracle类型转换后的语句转换为:选择…从EMP在to_number empno =(123)。幸运的是,类型转换不会发生在索引列上,索引的用法没有改变。现在,假设emp_type是字符类型,索引列。选择…从EMP emp_type = 123,转化为oracle.from EMP whereto_number选择(emp_type)= 123型因为在转换的地方,索引将不会被使用为了避免你的Oracle类型!sql隐式转换,最好使用显式类型转换性能。注意,在比较字符和值时,Oracle会优先考虑字符类型的数值转换类型。
6,脾气的指数
如果A.检索表中有超过30%的数据的记录数,则使用索引的效率没有明显的提高。
在某些情况下可以使用索引,这可能比全表扫描慢,但这是相同数量级的差异。一般来说,使用索引比全表扫描要高几倍甚至几千倍。
除了使用索引外,还有其他方法可以减少资源消耗。
1。用存在替换:
当提交包含一对多表信息(如部门表和表)查询时,避免使用不同的信息。在SELECT子句中可以考虑为存在替换,存在使搜索更快速,因为RDBMS核心模块在子查询条件下一旦满足,立即返回结果。
例子:
复制代码代码如下所示:
(低效):选择不同的dept_no,dept_name从部D,EMP E
在d.dept_no = e.dept_no
E.sex =男人
(有效的):选择dept_no,从dept_name系D
在存在
(选择X从EMP在e.dept_no = d.dept_no
E.sex =男人
);
2。全部替换或合并(适合索引列)
一般来说,用工会替换或在WHERE子句中会有很好的效果。使用或索引列将导致一个完整的表扫描。
注意,上述规则只对多个索引列有效。如果没有索引列,则查询效率可能会因为没有选择或减少而降低。在下面的例子中,索引是建立在loc_id和区域。
如果你坚持使用,或者你需要返回最少记录的索引列到前面。
复制代码代码如下所示:
效率高:选择loc_id,loc_desc,区域位置loc_id = 10联盟所有
选择loc_id,loc_desc,从位置区域=墨尔本区
低效率:选择loc_id,loc_desc,从位置loc_id = 10 =墨尔本地区或区域
三.与union-all取代联盟(如果可能的话):
当SQL语句需要联合两个查询结果集,两组结果将合并union-all,然后排名在最后的输出结果。如果使用联合所有而不是联合,那么这是不必要的。提高分选效率。请注意,联邦将重复输出两个相同的记录集。因此,您应该分析从业务需要使用联合的可行性。联盟将对结果进行排序,此操作将用于sort_area_size记忆。这对于记忆的优化也是非常重要的。
4,逐点语句被添加到索引列中,最好是在主键PK上。
复制代码代码如下所示:
选择从为dept_type系dept_code(低效)
选择dept_code部门订单dept_code(效率高)
5。避免使用资源消耗的操作:
具有不同的联合、减号,SQL的交叉语句将启动SQL引擎来执行资源密集型排序(排序)。区分需要排序操作,而其他需要至少执行两种排序。通常,如果使用联合,减号,SQL的交叉语句可以在其他方式中使用,如果您的数据库被重写了。sort_area_size井的部署,使用联盟、减、相交可以考虑,毕竟,他们的可读性强
6。用在哪里而不用(如果可以的话)
分组优化:
通过语句提高组的效率可以过滤出组之前不需要的记录。下面两个查询返回相同的结果,但是第二个查询显然更快。
复制代码代码如下所示:
低效率:
选择作业,平均值(萨尔)
从EMP组工作有工作=president'and AVG(SAL)> XXX
效率高:
选择作业,平均值(萨尔)
从EMP
工作=总统
或工作=管理组工作,平均值为
7。一般来说,如果可以避免子查询的使用,您将无法使用子查询尽可能多的。因为子查询的开销是很昂贵的。具体的例子是在下列情况下SQL优化过程。
如果您对Oracle性能提升有任何建议,您可以在网站上的论坛上进行交流。