`
nj_link
  • 浏览: 10869 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

oracle优化使用命令,记录到这(我也忘记哪来的)

阅读更多
登陆
sqlplus  <用户名>[/<密码>][@<服务名>] as sysdba
sqlplus sys/huhao@sa as sysdba 

set oracle_sid=sa
sqlplus / as sysdba


alter system
alter system命令用来修改Oracle的一些参数,我们修改Oracle的内存配置时就要用到它。
alter system 有一个scope选项,它有三个可选值:memory,spfile,both。
memory:只改变当前实例的参数,如果重启Oracle,则会恢复到修改前的值。
spfile:只改变spfile的参数,在Oracle重启后会使用修改后的值。spfile是指Oracle启动时用到的配置文件,一些参数都保存在这个文件里,Oracle在启动时读取这个文件并进行相应的初始化设置。
both:改变实例及spfile的参数。

Oracle的总体结构
每 个Oracle数据库都是由Oracle Instance(实例)与数据库(数据文件,控制文件、重做日志文件)组成,其中所谓的实例就是用户同数据库交互的媒介,用户通过与一个实例相连来操作 数据库。而实例又是由统一的内存结构(SGA,PGA,UGA)和一批内存驻留进程组成。实例在操作系统中用ORACLE_SID来标识,在Oracle 中用参数INSTANCE_NAME来标识,它们两个的值是相同的。数据库启动时,系统首先在服务器内存中分配系统全局区(SGA),构成了Oracle 的内存结构,然后启动若干个常驻内存的操作系统进程,即组成了Oracle的进程结构。内存区域和后台进程合称为一个Oracle实例。

SGA
系统全局区--System global area(SGA) 是一组共享的内存结构,它里面存储了oracle数据库实例(instance)的数据和控制文件信息。如果有多个用户同时连接到数据库,他们会共享这一 区域,因此SGA也称之为Shared Global Area。当数据库实例启动时,SGA的内存被自动分配;当数据库实例关闭时,SGA内存被回收。
SGA是占用内存最大的一个区域,同时也是影响数据库性能的重要因素。
SGA主要包括以下几部分:
 共享池
 数据缓冲区
 大型池
 Java池
 日志缓冲区
上面几部分内存加起来,就是SGA内存的总和。其中比较重要的是共享池和数据缓冲区,后面将会重点讲解它们。

查看SGA
SGA是可以动态调整大小的,也 就是说调整其大小是不用shutdown数据库的。在初始化参数中设置可以设置sga_max_size这个参数,当SGA的各部分的和要大于设置的 sga_max_size的参数的时候,设置的sga_max_size将会被忽略掉,而是将各部分的大小相加。当sga_max_size的大小大于各 部分的大小相加时,会使用sga_max_size的参数。
SGA是占用内存最大的一个区域,同时也是影响数据库性能的重要因素。
通过下面的命令来查看SGA:
show parameter sga;


共享池
共享池是对SQL,PL/SQL程序进行语法分析,编译,执行的内存区域。
它包含三个部分:
 库缓冲区(Library Cache)包含SQL,PL/SQL语句的分析码,执行计划;
 数据字典缓冲区(Data Dictionary Cache)表,列定义,权限;
 用户全局区(Usr Global Area)用户MTS会话信息。
这三个部分都不可单独定义大小,必须通过共享池间接定义。
你可能会问,为什么要缓存SQL语句呢?不缓存又能怎么样呢?要想搞清楚这个问题,我们要先了解一个SQL在Oracle里的执行过程。

SQL执行过程
在Oracle里执行一个SQL语句,一般都要经过下面几个步骤:
 Create a Cursor 创建游标;
 Parse the Statement 解析语句;
 Bind Any Variables 绑定变量;
 Run the Statement 运行语句;
 Close the Cursor 关闭游标;
如果是一个查询SQL,则还要经过下面的步骤:
 Describe Results of a Query 描述查询的结果集;
 Define Output of a Query 定义查询的输出数据;
 Fetch Rows of a Query 获取查询出来的行。

SQL解析过程
从上面的步骤可以看出,每执行一个SQL,都需要对它进行解析(Parse),而一个解析过程,需要完成下面的工作:
 语法检查,验证它是否是合法的语句,有没有语法错误;
 语义检查,实现数据字典的查找,以验证是否符合表和列的定义,类型是否正确;
 (如果是CBO优化模式,关于CBO,请看后面Oracle的优化器一章)收集参考对象的统计;
 在所要求的对象上获取语法分析锁,使得在语句的语法分析过程中不改变这些对象的定义;
 检查用户的权限是否足够;
 从许多可能的执行路径中选择此语句最佳的执行计划;
 将它装入共享SQL区;
 生成语句的编译版本(P-CODE)。
解析是一个昂贵的操作,因为解析过程中需要消耗许多资源,而且费时,正因为如此,Oracle创造了共享池的概念,共享池会自动将解析过的SQL缓存起来,以后碰到相同的SQL,就不用再解析了,这样可以大大提高SQL的执行速度。

缓存SQL的原理
ORACLE 执行SQL语句时,先将SQL语句的字串通过一个hash算法得出一个hash值,然后检查共享池中是否已存在这个哈希值,若有就用已缓存的执行计划来执 行这个语句(即缓存命中,后面我们会提到共享池的命中率,就是这个概念),若没有(即缓存缺失)则需进行解析。
由于Oracle是通过SQL字符的hash值来判断是否为相同的SQL语句,因此,如果你的SQL有一点小小的变换,在Oracle看来,就是另外一个SQL了,会对它进行重新解析。
例如:
 1.select id, name from members where id = 1403   
 2. select id, name From members where id = 1403   
 3. select name, id from members where id = 1403  

这三条SQL在Oracle看来就是三条不同的SQL。

绑定变量
 Statement stmt=conn.createStatement();   
 String member_id=member.id;   
 String sql="select id,name from members where id ="+member_id;   
 stmt.executeQuery(sql); 


修改共享池
alter system set shared_pool_size=90M scope=both;

shared_pool_size是一个动态参数,可以在运行时修改,因此这里的scope设置为both,新的内存大小马上生效,并且还将修改保存在Oracle的启动文件里。

查看共享池命中率
select sum(pinhits) / sum(pins) * 100 "看命中率咯" from v$librarycache;


数据缓冲区
如 果每次执行一个操作时,Oracle都必须从磁盘读取所有数据块并在改变它之后又必须把每一块写入磁盘,显然效率会非常低。数据缓冲区存放需要经常访问的 数据,供所有用户使用。修改数据时,首先从数据文件中取出数据,存储在数据缓冲区中,修改/插入数据也存储在缓冲区中,commit或DBWR(下面有详 细介绍)进程的其他条件引发时,数据被写入数据文件。数据缓冲区的大小是可以动态调整的,但是不能超过sga_max_size的限制。

show parameter db_cache_size; 
alter system set db_cache_size=50M scope=both;

查看命中率:
select (1 - ((physical.value - direct.value - lobs.value) / logical.value)) * 100 
"命中率" 
from v$sysstat physical,   
v$sysstat direct,   
v$sysstat lobs,   
v$sysstat logical   
where physical.name = 'physical reads'  
and direct.name = 'physical reads direct'  
and lobs.name = 'physical reads direct (lob)'  
and logical.name = 'session logical reads';  

PGA(Process Global Area),是server process一段私有内存区,它包含有全局变量,数据结构和一些控制信息。在Oracle8i 中,PGA调整非常复杂,要调整SORT_AREA_SIZE、HASH_AREA_SIZE、BITMAP_MERGE_AREA_SIZE、 CREATE_BITMAP_AREA_SIZE等参数。在ORACLE9I以后,只需要调整 PGA_AGGREGATE_TARGET。
每个 用户连接到Oracle,都会占用一定的内存,当然,用户一般连上之后还会做一些操作,比如一般的查询,有排序操作的查询,或用到Hash连接的查询。这 些都需要内存,而这些内存(还有一些其他的,这里就不说了。)加起来就是PGA的大小了。如果PGA设置的过小,会导致Oracle频繁同磁盘进行交换, 性能将会受到很大影响。

show parameter pga;
alter system set pga_aggregate_target=90M scope=both;

分享到:
评论

相关推荐

    oracle命令集.rar

    Oracle数据库是全球广泛使用的大型关系型数据库管理...这份命令集文档将会是数据库管理员和开发人员的宝贵参考资料,可以在忘记具体命令时快速查阅。通过深入学习和实践,我们可以更高效地管理和维护Oracle数据库系统。

    oracle基本命令[收集].pdf

    对于数据库管理员(DBA)或软件开发者来说,熟练掌握Oracle的基本命令是必不可少的技能之一。本文将根据提供的文件“oracle基本命令[收集].pdf”的内容,详细介绍Oracle中的基本操作命令,帮助读者更好地理解和应用...

    Oracle_Database10g_性能调整与优化-第10章_使用PLSQL提高性能

    ### Oracle Database 10g 性能调整与优化——使用PL/SQL提高性能 #### 1. 使用 DBMS_APPLICATION_INFO 进行实时监控 DBMS_APPLICATION_INFO 包为用户提供了一个强大的机制来交换环境中执行处理的时间点信息。通过...

    oracle数据库监控

    4. SQL语句监控:在实际运维过程中,有时候会忘记一些正在执行的SQL语句,这个时候可以通过查询动态视图比如V$SQL和V$SQLAREA来找到正在执行的SQL语句及其相关信息,包括执行次数、CPU时间、物理读取次数等。...

    自己总结的资料,在Linux下安装Oracle10g详细步骤

    在创建好目录后,将其所有权和权限设置为`oracle:oinstall`用户组,使用`chown`和`chmod`命令来完成这一操作。 安装Oracle 10g R2的下一步通常是下载并运行Oracle安装介质,如ISO镜像。挂载ISO镜像后,进入相应目录...

    win7orcl启停脚本11g

    在IT行业中,数据库管理系统是企业运营的核心组成部分,Oracle数据库系统尤其在企业级应用中占据了重要地位。...对于任何处理Oracle数据库的IT专业人员来说,理解并掌握这类脚本的编写和使用都是必不可少的技能。

    linux系统学习笔记

    解决方法是进入单用户模式(在启动时按任意键进入GRUB菜单,选择内核启动项并添加`s`参数),然后使用`chpasswd`或`passwd`命令来重设root密码。 #### 显示系统运行时间与开机自检内容 系统运行时间可以通过`...

    Orace10g安装文档(32bit)

    对于初次接触 Oracle 10g 的用户来说,了解如何在 32 位 Windows 系统下正确安装是非常重要的。本文将根据提供的文档信息,详细介绍 Oracle 10g 在 32 位 Windows 系统下的安装过程,并提供一些实用的技巧和建议。 ...

    sql中文查询手册

    2. 避免全表扫描:通过优化查询条件和使用索引减少扫描的记录数。 3. 减少JOIN操作:尽量避免大表之间的JOIN,优化JOIN条件和顺序。 4. 存储过程:封装复杂的操作,减少网络传输,提高执行效率。 七、安全性 SQL还...

    win10 java 11(JKD 11)安装包

    3. **选择安装路径**:你可以选择默认路径,也可以自定义安装位置,但记得记录这个路径,因为后续配置环境变量时会用到。 4. **安装过程**:点击“下一步”按钮,等待安装过程完成。 5. **配置环境变量**:安装...

    网管教程 从入门到精通软件篇.txt

    小编的确一直都想把这方面的命令做个总结,这次辛苦老范给我们整理了这份实用的秘笈。  Bootcfg  bootcfg 命令启动配置和故障恢复(对于大多数计算机,即 boot.ini 文件)。  含有下列参数的 bootcfg 命令仅在...

    整理-JVM相关面试题2024

    #### 9.9 如果忘记了使用什么参数你一般怎么处理? - **查阅文档**:查看官方文档或使用`--help`选项来获取帮助信息。 #### 10. 开发性问题:你碰到过哪些JVM问题? - **内存溢出**:通常由于对象生命周期管理不当...

    mysql笔记.doc

    `,这比`DELETE`快,因为`TRUNCATE`会删除表并重建,而`DELETE`则是逐条删除记录。 查看表结构的命令是`DESCRIBE tableName;`。字符集问题可以通过`SET NAMES gbk;`来调整,确保数据输入和显示的一致性。在输入错误...

    VC中用ADO访问数据库的示范例子

    在ADO中,主要使用Connection对象来建立与数据库的连接,Recordset对象用于存储查询结果并进行数据操作,Command对象则用于执行SQL命令。在VC++项目中,我们需要引入ADO的头文件,如`#import "msado15.dll"`,这会...

    超级有影响力霸气的Java面试题大全文档

    Stateless Session Bean 虽然也是逻辑组件,但是他却不负责记录使用者状态,也就是说当使用者呼叫 Stateless Session Bean 的时候,EJB Container 并不会找寻特定的 Stateless Session Bean 的实体来执行这个 method...

Global site tag (gtag.js) - Google Analytics