`
jeanboy
  • 浏览: 3246 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
社区版块
存档分类
最新评论

怎样保持Oracle数据库SQL性能的稳定性

阅读更多
有客户遇到SQL性能不稳定,突然变差导致系统性能出现严重问题的情况。对于大型的系统来说,SQL性能不稳定,有时突然变差,这是常常遇到的问题。这也是一些DBA的挑战。
  对于使用Oracle数据库的应用系统,有时会出现运行得好好的SQL,性能突然变差。特别是对于OLTP类型系统执行频繁的核心SQL,如果出现性能问题,通常会影响整个数据库的性能,进而影响整个系统的正常运行。对于个别的SQL,比如较少使用的查询报表之类的SQL,如果出现问题,通常只影响少部分功能模块,而不会影响整个系统。
  那么应该怎么样保持SQL性能的稳定性?
  SQL的性能变差,通常是在SQL语句重新进行了解析,解析时使用了错误的执行计划出现的。下列情况是SQL会重新解析的原因:
  1. SQL语句没有使用绑定变量,这样SQL每次执行都要解析。
        2. SQL长时间没有执行,被刷出SHARED POOL,再次执行时需要重新解析。
        3. 在SQL引用的对象(表、视图等)上执行了DDL操作,甚至是结构发生了变化,比如建了一个索引。
        4. 对SQL引用的对象进行了权限更改。
        5. 重新分析(收集统计信息)了SQL引用的表和索引,或者表和索引统计信息被删除。
        6. 修改了与性能相关的部分参数。
        7. 刷新了共享池。
        8. 当然重启数据库也会使所有SQL全部重新解析。
  SQL重新解析后,跟以前相比,性能突然变差,通常是下列原因:
  1. 表和索引的优化统计信息被删除,或者重新收集后统计信息不准确。重新收集统计信息通常是由于收集策略(方法)不正确引起。比如对分区表使用analyze命令而不是用dbms_stats包、收集统计信息时采样比例过小等等。Oracle优化器严重依赖于统计信息,如果统计信息有问题,则很容易导致SQL不能使用正确的执行计划。
  2. SQL绑定变量窥探(bind peeking),同时绑定变量对应的列上有直方图;或者绑定变量的值变化范围过大、分区数据分布极不均匀:
  1) 绑定变量的列上有直方图:
  假如表orders存储所有的订单,state列有3种不同的值:0表示未处理,1表示处理成功完成,2表示处理失败。State列上有一个索引,表中绝大部分数据的state列为1,0和2占少数。有下面的SQL:
1 select * from orders where state=:b1

  这里:b1是变量,在大多数情况下这个值为0,则应该使用索引,但是如果SQL被重新解析,而第一次执行时应用传给变量b1值为1,则不会使用索引,采用全表扫描的方式来访问表。对于绑定变量的SQL,只在第一次执行时才会进行绑定变量窥探,并以此确定执行计划,该SQL后续执行时全部按这个执行计划。这样在后续执行时,b1变量传入的值为0的时候,仍然是第一次执行时产生的执行计划,即使用的是全表扫描,这样会导致性能很差。
  2) 绑定变量的值变化范围过大:
  同样假如orders表有一列created_date表示一笔订单的下单时间,orders表里面存储了最近1年的数据,有如下的SQL:
1 Select * from orders where created_date >=:b1;

  假如大多数情况下,应用传入的b1变量值为最近几天内的日期值,那么SQL使用的是created_date列上的索引,而如果b1变量值为5个月之前的一个值,那么就会使用全表扫描。与上面描述的直方图引起的问题一样,如果SQL第1次执行时传入的变量值引起的是全表扫描,那么将该SQL后续执行时都使用了全表扫描,从而影响了性能。
  3) 分区数据量不均匀:
  对于范围和列表分区,可能存在各个分区之间数据量极不均匀的情况下。比如分区表orders按地区area进行了分区,P1分区只有几千行,而P2分区有200万行数据。同时假如有一列product_id,其上有一个本地分区索引,有如下的SQL:
1 select * from orders where area=:b1 and product_id =:b2 

  这条SQL由于有area条件,因此会使用分区排除。如果第1 次执行时应用传给b1变量的值正好落在P1分区上,很可能导致SQL采用全表扫描访问,如前面所描述的,导致SQL后续执行时全部使用了全表扫描。
  3. 其他原因,比如表做了类似于MOVE操作之后,索引不可用,对索引进行了更改。当然这种情况是属于维护不当引起的问题,不在本文讨论的范围。
  综上所述,SQL语句性能突然变差,主要是因为绑定变量和统计信息的原因。注意这里只讨论了突然变差的情况,而对于由于数据量和业务量的增加性能逐步变差的情况不讨论。
  为保持SQL性能或者说是执行计划的稳定性,需要从以下几个方面着手:
  1. 规划好优化统计信息的收集策略。对于Oracle 10g来说,默认的策略能够满足大部分需求,但是默认的收集策略会过多地收集列上的直方图。由于绑定变量与直方图固有的矛盾,为保持性能稳定,对使用绑定变量的列,不收集列上的直方图;对的确需要收集直方图的列,在SQL中该列上的条件就不要用绑定变量。统计信息收集策略,可以考虑对大部分表,使用系统默认的收集策略,而对于有问题的,可以用DBMS_STATS.LOCK_STATS锁定表的统计信息,避免系统自动收集该表的统计信息,然后编写脚本来定制地收集表的统计信息。脚本中类似如下:
1 exec dbms_stats.unlock_table_stats…
2 exec dbms_stats.gather_table_stats…
3 exec dbms_stats.lock_table_stats…

  2. 修改SQL语句,使用HINT,使SQL语句按HINT指定的执行计划进行执行。这需要修改应用,同时需要逐条SQL语句进行,加上测试和发布,时间较长,成本较高,风险也较大。
  3. 修改隐含参数” _optim_peek_user_binds”为FALSE,修改这个参数可能会引起性能问题(这里讨论的是稳定性问题)。
  4. 使用OUTLINE。对于曾经出现过执行计划突然变差的SQL语句,可以使用OUTLINE来加固其执行计划。在10g中DBMS_OUTLN.CREATE_OUTLINE可以根据已有的执行正常的SQL游标来创建OUTLINE。如果事先对所有频繁执行的核心SQL使用OUTLINE加固执行计划,将最大可能地避免SQL语句性能突然变差。
  注:DBMS_OUTLN可以通过$ORACLE_HOME/rdbms/admin/dbmsol.sql脚本来安装。
  5. 使用SQL Profile。SQL Profile是Oracle 10g之后的新功能,此处不再介绍,请参考相应的文档。
  除此之外,可以调整一些参数避免潜在的问题,比如将”_btree_bitmap_plans”参数设置为FALSE(这个参数请参考互联网上的文章或Oracle文档)。
  而在实际工作中,通过使用定制的统计信息收集策略,以及在部分系统上使用OUTLINE,系统基本上不会出现已有的SQL性能突然变差的情况。当然也有维护人员操作不当引起的SQL性能突然变差,比如建了某个索引而没有收集统计信息,导致SQL使用了新建的索引,而该索引并不适合于那条SQL;维护人员意外删除了表个索引的统计信息。
分享到:
评论

相关推荐

    oracle数据库sql优化大全

    SQL性能优化是数据库管理中的核心任务,尤其是在Oracle数据库系统中,优化查询性能能够显著提升系统的整体效率。本文将围绕数据库查询优化从需求分析、设计和使用三个方面进行深入探讨。 首先,详细的需求分析是...

    Oracle数据库sql语句 跟踪器

    总结来说,Oracle数据库SQL语句跟踪器是一个强大的性能分析工具,它通过Toad for Oracle等工具提供深入的洞察,帮助数据库管理员和开发者有效地优化数据库性能,提升系统的整体响应速度和稳定性。通过实时监控、性能...

    浅谈Oracle数据库SQL性能优化.pdf

    本文将深入探讨Oracle数据库SQL性能优化的必要性、目标以及具体的优化策略,为数据库系统性能提升提供参考。 一、SQL优化的必要性 在数据库系统中,查询操作是使用频率最高的操作之一,它对系统性能的影响至关重要...

    Oracle数据库进阶 高可用性、性能优化和备份恢复

    Oracle数据库是全球广泛使用的大型企业级关系型数据库管理系统,它提供了强大的数据管理能力和高可用性方案,以及性能优化和备份恢复策略。本资料主要聚焦在Oracle数据库的进阶主题,包括高可用性、性能优化和备份...

    省市县oracle数据库sql

    从给定的文件信息中,我们可以提取到关于Oracle数据库中SQL操作的重要知识点,特别是与创建表、定义主键约束以及插入数据相关的操作。下面将详细解释这些知识点。 ### 创建表 在Oracle数据库中,`CREATE TABLE`...

    oracle数据库系统性能和应用性能优化

    Oracle数据库是全球广泛使用的数据库管理系统,其性能直接影响到业务应用程序的响应速度和整体系统的稳定性。 首先,我们要理解影响系统性能的关键因素。这些因素包括但不限于: 1. **应用**:应用编写方法,如SQL...

    数据库性能指标,其中包括sql数据库和oracle数据库的性能指标介绍

    数据库性能指标是衡量数据库系统运行效率...总之,理解并关注SQL数据库和Oracle数据库的性能指标是数据库管理员和开发人员的必备技能,通过有效的监控和调优,可以确保数据库系统高效稳定地运行,为业务提供强大支持。

    压测Oracle的SQL语句的性能情况

    本文将深入探讨如何利用压力测试工具来评估和优化Oracle数据库中的SQL语句性能。 标题"压测Oracle的SQL语句的性能情况"暗示了我们关注的是在高负载情况下,Oracle数据库处理SQL查询的能力。压力测试(Pressure ...

    oracle与sql数据库备份与恢复工具

    首先,Oracle数据库的备份主要依赖于Oracle的RMAN( Recovery Manager)工具。RMAN是Oracle数据库管理员用于备份、恢复和数据库维护的命令行工具。它可以直接连接到数据库实例,执行完整备份、增量备份和表空间备份...

    oracle数据库连接工具

    8. **实时监控**:监控Oracle数据库的性能,例如查看会话、等待事件和数据库状态,以便优化数据库性能。 9. **提醒和计划任务**:可以设置提醒和定时任务,例如定期运行SQL脚本、数据备份等。 10. **版本控制**:...

    ORACLE数据库 ORACLE数据库

    Oracle数据库以其高效、稳定和强大的功能在金融、电信、医疗、政府等多个领域得到广泛应用。本篇文章将深入探讨Oracle数据库的核心概念、特点、主要组件以及一些关键操作。 1. **核心概念** - **SQL**:结构化查询...

    oracle数据库性能优化 合集 中文

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其性能优化是一项关键任务,直接影响到系统的响应速度、资源利用率和整体稳定性。本合集包含了11个文档,全面涵盖了Oracle数据库性能优化的各种方面,旨在...

    Oracle数据库系统应用与开发

    良好的数据库设计是系统稳定性和性能的基础。理解第一范式到第三范式,以及如何通过ER图进行概念设计,有助于创建高效、规范的数据模型。 八、性能调优 Oracle数据库性能优化包括查询优化、索引优化、内存管理、...

    Oracle数据库资料大全

    Oracle数据库以其高效、稳定和强大的功能在金融、电信、医疗、政府等多个领域得到广泛应用。本资料大全将围绕Oracle数据库的核心概念、管理和优化等方面进行深入探讨。 一、Oracle数据库基础 Oracle数据库系统基于...

    Oracle 数据库性能优化与运维最佳实践

    "Oracle数据库性能优化与运维最佳实践"的主题涵盖了如何确保Oracle数据库高效、稳定运行的关键技术和策略。 首先,性能优化涉及多个层面,包括SQL查询优化、存储结构优化、索引设计以及数据库参数调整。SQL查询优化...

    SQLserver2012链接Oracle数据库操作说明.docx

    ### SQL Server 2012 连接 Oracle 数据库操作说明 #### 一、概述 在实际工作中,经常需要在不同的数据库系统之间进行数据交互。本文档将详细介绍如何使用 SQL Server 2012 实现与 Oracle 数据库的连接,并进行数据...

    ORACLE数据库巡检模板

    - **初始化参数文件**:检查初始化参数设置是否合理,以满足性能和稳定性需求。 - **CRS日志文件**:分析CRS日志,寻找可能的错误或警告信息。 - **RDBMS运行日志和跟踪文件**:通过日志文件诊断数据库运行情况,...

    Oracle数据库大作业

    整个大作业可能还包括了系统测试部分,包括单元测试、集成测试和性能测试,以验证系统的正确性和稳定性。测试结果和调整措施也会在文档中有所体现。 总的来说,这个“Oracle数据库大作业”是一个综合性的学习资源,...

Global site tag (gtag.js) - Google Analytics