深度对比Oracle与SQL Server——第二部分
数据库实例结构 事务一致性(Transactional Consistency)和基于时间点的恢复(Point-in-time Recovery) 系统元数据
top数据库实例结构
当Oracle实例启动之后,所看到的就是在服务器内存上的一个个不同内存块加上产生的与这些内存交互的后台进程。Oracle文档将这些内存结构和进程收的很详细。
由Oracle实例所占用的内存块成为SGA(System Global Area),它的大小可以通过调整Oracle初始化参数(initialisation parameter)进行修改,在SGA里边至少会创建3个不同的区域,它们分别是:
数据块缓存区(Database Buffer Cache)这里缓存的是数据块。和SQL Server一样,用户不会直接的访问数据文件上的数据:当读取数据时,相关的数据块会从数据文件中拷贝到内存中;修改数据时也是修改内存中的数据,然后再由单独的进程将数据缓存区中被修改的数据写入到数据库中。重做日志缓存(Redo Log Buffer)SGA中的这个区域连续的记录着数据缓存区数据修改的记录,重做日志缓存中的内容会被写入到在线日志文件中去。共享池(Shared Pool)SGA中有一大块的内存用作共享池,共享池等价于SQL Server中的执行缓存(Procedure Cache)。它的主要作用就是缓存数据库中最近执行过的SQL语句。共享池由下面的模块组成: 数据字典缓存(Dictionary Cache)数据字典缓存缓存了Oracle最近使用的数据字典信息。库缓存(Library Cache)这个区域包含了最近执行的SQL和PL/SQL语句和对应的执行计划。SQL区还能进一步分成共享区和私有区:共享SQL区保存的语句可以由多个用户使用而私有区保存的则是跟各个连接对应的绑定变量的信息。PL/SQL是Oracle对于行业标准SQL的程序扩展,当PL/SQL程序执行时,它的代码会拷贝到库缓存中的共享PL/SQL区中。除了缓存执行代码和执行计划外,库缓存还包含锁、阀以及字符集等信息。
根据你所使用的组件的不一样,Oracle的SGA中也可能存在其它一些可选的内存区域。在Oracle中使用Java应用时要使用到Java池(Java Pool),Oracle内置的备份恢复工具RMAN(Recovery Manager)要用到大池(Large Pool),当使用Oracle高级队列机制时要用到流池(Steams Pool)。
上面介绍的各个内存区域都是属于SGA的一部分,它们是通过一序列的进程(process)来和数据库进行交互。下面就开始介绍包括用户进程和服务器进程在内的Oracle进程了。
当用户或者是应用连接到Oracle数据库时就会产生一个用户进程(user process)。在一个两层的系统架构中,用户
相关文档:
ORACLE数据库启动时分配一大块非常大的内存区域。ORACLE运行过程中所有的操作都在这里进行。
ORACLE内存=SGA+PGA。
SGA=数据高速缓冲区+日志缓冲区+共享池+大池+Java池。
数据高速缓冲区:数据高速缓冲区是最近从数据文件中检索出来的数据,缓存起来供所有用户共享。
日志缓冲区:缓存用户对数据库执行的各类操作的重做 ......
自增字段:
表atable(id,a) id需要自增 首先建立一个序列:
create sequence seq_atable minvalue 1 maxvalue 999999999999999999 start with 1 increment by 1 nocache
有二种方式使用自增字段:
使用序列+触发器实现自增,插入语句不需要管自增字段
如:create or replace trigger trg_atable before insert on ......
使用sql语句获得当前月天数
--获得当月天数
select day(dateadd(mm,1,getdate())-day(getdate())) as 本月天数 ;
select getdate() as 当前日期;
&nb ......
看看以下SQL语句:
select row_number() over(partition by xs.xsbh, xs.kch order by coalesce(xs.bkxnxqh, xs.xnxqh) desc) rn
row_number():代表列
partition by 代表按什么进行分组
order by对每一组信息进行排序
coalesce()是替换的意思 例如:上面的SQL语句的意思是,如果bkxnxqh为空,那么就去xnx ......