分类目录归档:ORACLE

oracle进程简述

oracle中的各个进程要完成某个特定的任务或一组任务,每个进程都会分配内部内存(PGA 内存)来完成它的任务。oracle实例主要有3类进程:

服务器进程(server process):这些进程根据客户的请求来完成工作。我们已经对专用服务器和共享服务器有了一定的了解,它们就是服务器进程。

后台进程(background process):这些进程随数据库而启动,用于完成各种维护任务,如将块写至磁盘、维护在线重做日志、清理异常中止的进程等。

从属进程(slave process):这些进程类似于后台进程,不过它们要代表后台进程或服务器进程完成一些额外的工作。

一、服务器进程

专用服务器(dedicated server)连接,采用专用服务器连接时,会在服务器上得到针对这个连接的一个专用进程。数据库连接与服务器上的一个进程或线程之间存在一对一的映射。

共享服务器(shared server)连接,采用共享服务器连接时,多个会话可以共享一个服务器进程池,其中的进程由oracle实例生成和管理。你所连接的是一个数据库调度器(dispatcher),而不是特意为连接创建的一个专用服务器进程。

这些服务器进程是干重活的进程。在很多情况下,你都会发现这些进程占用的系统CPU时间最多, 因为正是这些进程来执行排序、汇总、联结等等工作,几乎所有工作都是这些进程做的。

二、连接和会话

连接(connection):连接是从客户到oracle实例的一条物理路径。连接可以在网络上建立,或者通过IPC机制建立。通常会在客户进程与一个专用服务器或一个调度器之间建立连接。不过,如果使用oracle的连接管理器(Connection Manager,CMAN),还可以在客户和CMAN之间以及CMAN和数据库之间建立连接。

会话(session):会话是实例中存在的一个逻辑实体。这就是你的会话状态(session state),也就是表示特定会话的一组内存中的数据结构。提到“数据库连接”时,大多数人首先想到的就是“会话” 。你要在服务器中的会话上执行SQL、提交事务和运行存储过程。

连接是物理概念上的,会话是逻辑概念上的,会话是建立在连接之上的,如果会话没有连接它会重新建立一个连接。在一条连接上可以建立0个、一个或多个会话。各个会话是单独而且独立的,即使它们共享同一条数据库物理连接也是如此。也就是说在一个连接里面可以多个用户登录,或一个用户登录多次。
继续阅读oracle进程简述

oracle distinct学习

1、distinct作用是去掉重复值。

select distinct ename from emp;

2、但是往往distinct是用来计算不重复记录的条数,而不是用它来返回不重记录的所有值。

distinct可以这样用:

select count(sal), count(distinct deptno) from emp;

3、如果distinct后面跟多个值,sql是怎么进行处理的呢?

select distinct job, sal from emp;

实际上是distinct后面字段的组合,去掉重复值!

PS:group by后跟多个列是先按第一个列分组,在第一个列分组内再按第二个列分组,以此类推。
PS2:order by后跟多个列是先按第一个列排序,在第一个列排序内再按第二个列排序,以此类推。

oracle跟踪文件、警告文件、重做日志文件

一、跟踪文件

跟踪文件(trace file)的作用,通常是一个服务器进程对某种异常错误条件做出响应时创建的诊断文件。

一个sql发到数据库,肯定会有一个“接收请求 -> 数据处理 -> 返回应答”的过程。那么就需要不同的进程来执行相应的步骤。

如果进程在执行过程中发生错误,那么就会记录到跟踪文件中。

1、打开跟踪文件

show parameter SQL_TRACE;

如果结果为FALSE,则设置打开

alter system set SQL_TRACE = TRUE SCOPE = both;

2、查看跟踪文件位置

show parameter DUMP_DEST

会看到有三个跟踪文件目录:
background_dump_dest(后台转储):/u01/app/oracle/diag/rdbms/xe/XE/trace
core_dump_dest(内核转储):/u01/app/oracle/diag/rdbms/xe/XE/cdump
user_dump_dest(用户转储):/u01/app/oracle/diag/rdbms/xe/XE/trace

一般而言,我们只对后台和用户转储目标感兴趣。

跟踪文件名形如:XE_ora_5498.trc(SID名+进程名+进程ID),进程名不只有ora一个。

二、警告文件

警告文件记录了数据库运行过程中的各种错误提示,是一个查看数据库历史的极其有用的文件。
/u01/app/oracle/diag/rdbms/xe/XE/trace/alert_XE.log

三、重做日志文件

重做日志文件(redo log file)是数据库的事务日志,主要用于当数据库奔溃时,恢复实例和介质。

oracle使用在线和归档重做日志文件将其恢复到意外发生前的那个时刻。

oracle参数文件设置spfile

spfile是oracle服务端的参数文件,spfile参数文件是一个二进制文件,不能用文本工具打开。如果要修改它的值,使用alter system来修改。

1、显示目前参数文件位置

show parameter spfile;

2、设置
语法:

alter system set parameter = value <comment='text'> <deferred> <scope=memory | spfile | both> <sid='sid|*'>

说明:
1)parameter = value:设置参数的值。
2)<comment=’text’>:可选,添加注释。
3)<deferred>:可选,有些参数不能立即修改,需要以延迟方式修改。
查看哪些参数必须使用deferred:
select name from v$parameter where ISSYS_MODIFIABLE = ‘DEFERRED’;
4)<scope=memory | spfile | both>:可选,指示这个参数的作用域,默认是both。
SCOPE=memory 只在当前实例中修改,数据库重启后恢复成原先的值。
SCOPE=spfile 只修改spfile中的值,这个值直到数据库重启后才生效。
SCOPE=both 内存和spfile中都修改参数的值。
5)<sid=’sid|*’>:可选,主要用于集群环境;默认值为sid=’*’。这样可以为集群中任何给定的实例惟一地指定参数设置。除非你使用oracle RAC,否则一般不需要指定sid=设置。
继续阅读oracle参数文件设置spfile

oracle连接方式简述

oracle连接分为,专用服务器连接和共享服务器连接模式。

专用服务器连接就是,进来一个session,oracle就产生一个进程(或线程),专门处理这个session,session注销时,这个进程或(线程)也就消失了。

共享服务器连接就是,oracle建立一个进程(或线程)池,这些进程/线程将由所有会话共享。session的请求和应答处理,在进程/线程池里不是原路返回的,由不同进程/线程处理?

按照我的理解流程图如下:

PS:这里写进程(或线程)是因为oracle在不同平台上拥有不同的平台特性,比如在Linux平台它是多进程模型,但在windows平台它是单进程多线程模型。

这两种连接方法,服务器上的监听器(listener)进程会以不同的方式工作,这些监听器进程负责建立与服务器的物理连接。

专用服务器连接模式下,监听器收到一个请求,数据库生成一个进程,监听器将连接交给这个进程,客户端和数据库直接连接。

共享服务器连接模式下,监听器收到请求后,返回给客户端调度器的端口,客户端与调度器直接连接。

在用dbca建立实例时,会选择是dedicated server mode还是shared server mode。

oracle中空值讨论

在oracle里,空值是一个特殊的值,其它数据库可能空值可以等于空值,但oracle里是不行的,空值是“未知”的。

例子:

select * from dual where null = null; --结果为空
select * from dual where null <> null; --结果为空
select * from dual where null is null; --结果为X
select * from dual where null is not null; --结果为空

从结果中可以看出,null和null既不是相等,也不是不相等。
当null is null时,返回ture,结果为X。
当null is not null时,返回false,所以结果为空。

使用以下方法处理空值:
1、case语句或decode语句用is null或is not null判断。
2、COALESCE(Expr1, Expr2, … , Exprn) 返回参数中第一个非空的表达式的值
3、NVL(Expr1,Expr2) 如果Expr1为NULL,返回Expr2的值,否则返回Expr1的值
4、NVL2(Expr1,Expr2,Expr3) 如果Expr1为NULL,返回Expr3的值,否则返回Expr2的值
5、NULLIF(Expr1,Expr2) 如果Expr1和Expr2的值相等,返回NULL,否则返回Expr1的值

oracle软解析和硬解析

一、软解析和硬解析
一个sql查询在执行前,oracle必须对查询进行解析、限定(命名解析)、安全性检查、优化等步骤。整个过程可以统称为编译sql语句。

oracle解析的步骤如下:
1)语法解析
2)语义解析
3)生成执行计划,这里分软解析和硬解析。硬解析是非常耗资源的。
4)sql的执行

解析会占用CPU时间,而解析后的结果会存储在shared pool里面。软解析可以重用执行计划,硬解析每次都要生成执行计划。

二、绑定变量

使用绑定变量可以使sql语句的编译时间大大减少。

当一个用户与数据库建立连接后,会向数据库发出操作请求,即向数据库送过去sql语句。oracle在接收到这些sql后,会先对这个sql做一个hash函数运算,得到一个Hash值,然后到共享池中寻找是否有和这个hash值匹配的sql存在。如果找到了,oracle将直接使用已经存在的sql的执行计划去执行当前的sql,然后将结果返回给用户。如果在共享池中没有找到相同Hash值的sql,oracle会认为这是一条新的sql。会进行解析。

绑定变量是一个占位符,使用了绑定变量后,oracle就记住了这个sql语句的模版,或者是模子(缓存在shared pool中)。以后遇到相同模子的sql语句,直接取shared pool中编译后的结果,执行sql。不同语句的区别只是传进来的变量的值不一样。概念和函数调用传入参数类似。

例子:
select * from emp where empno = 123;
select * from emp where empno = 456;
以上两句执行时,oracle会认为是两条不同的sql语句。每条语句都会分别解析。

select * from emp where empno = :no;
这条sql语句,往绑定变量no中传入不同的值123、456,oracle会认为执行的是同一条sql语句,只需要编译一次,达到sql重用的效果。

绑定变量是在P/L SQL中使用。

oracle 11xe版使用体会

其实xe版限制挺多的。

1、固定一个实例
2、4G表空间限制
3、不支持位图索引

11xe版创建位图索引报错

ORA-00439: feature not enabled: Bit-mapped indexes


select * from sys.v_$option where parameter='Bit-mapped indexes';
PARAMETER
----------------------------------------------------------------
VALUE
----------------------------------------------------------------
Bit-mapped indexes
FALSE

查了官方文档确实如此:
http://docs.oracle.com/cd/E17781_01/license.112/e18068/toc.htm#BABHACFJ

Bitmapped index, bitmapped join index No

参考资料:
http://www.oracle.com/pls/xe112/portal.all_books

oracle配置sqlplus环境和autotrace执行计划

一、sqlplus环境配置
创建一个sql脚本,sqlplus.sql:

vim /root/sqlplus.sql

输入以下内容:

set serveroutput on size 1000000
set trimspool on
set long 5000
set linesize 100
set pagesize 9999
column plan_plus_exp format a80
set timing on

以后每次登录sqlplus时执行下sqlplus.sql脚本。

其实oracle在$ORACLE_HOME/sqlplus/admin目录有glogin.sql,是sqlplus登录时自动调用的。可以加在这里面。

二、配置autotrace
1、sys用户
使用:

set autotrace on;

打开即可。
继续阅读oracle配置sqlplus环境和autotrace执行计划

oracle数据库对象-视图(2)

创建/修改视图语句:

create or replace view 视图名(列1, 列2, ... , 列n) as (select 列1, 列2, ... ,列n from 表名 where 筛选条件);

删除视图语句:

drop view 视图名;

1、视图就是一个虚表,一个子查询,会写sql语句就会写视图,难一点的就是把几个select结果union或union all连接到一块儿。

2、视图的列和子查询里select后的列,要一一对应关系。