ITPub博客

首页 > Linux操作系统 > Linux操作系统 > SQL与ORACLE异同

SQL与ORACLE异同

原创 Linux操作系统 作者:sakuy 时间:2008-05-11 01:05:32 0 删除 编辑
001、SQL与ORACLE的内存分配 ORACLE的内存分配大部分是由INIT.ORA来决定的,一个数据库实例可以有N种分配方案,不同的应用(OLTP、OLAP)它的配置是有侧重的。SQL概括起来说,只有两种内存分配方式:动态内存分配与静态内存分配,动态内存分配充许SQL自己调整需要的内存,静态内存分配限制了SQL对内存的使用。

002、SQL与ORACLE的物理结构 总得讲,它们的物理结构很相似,SQL的数据库相当于ORACLE的模式(方案),SQL的文件组相当于ORACLE的表空间,作用都是均衡DISK I/O,SQL创建表时,可以指定表在不同的文件组,ORACLE则可以指定不同的表空间。 CREATE TABLE A001(ID DECIMAL(8,0)) ON [文件组] -------------------------------------------------------------------------------------------- CREATE TABLE A001(ID NUMBER(8,0)) TABLESPACE 表空间 注:以后所有示例,先SQL,后ORACLE

003、SQL与ORACLE的日志模式 SQL对日志的控制有三种恢复模型:SIMPLE、FULL、BULK-LOGGED;ORACLE对日志的控制有二种模式:NOARCHIVELOG、ARCHIVELOG。SQL的SIMPLE相当于ORACLE的NOARCHIVELOG,FULL相当于ARCHIVELOG,BULK-LOGGED相当于ORACLE大批量数据装载时的NOLOGGING。经常有网友抱怨SQL的日志庞大无比且没法处理,最简单的办法就是先切换到SIMPLE模式,收缩数据库后再切换到FULL,记住切换到FULL之后要马上做完全备份。

 004、SQL与ORACLE的备份类型 SQL的备份类型分的极杂:完全备份、增量备份、日志备份、文件或文件组备份;ORACLE的备份类型就清淅多啦:物理备份、逻辑备份;ORACLE的逻辑备份(EXP)相当于SQL的完全备份与增量备份,ORACLE的物理备份相当于SQL的文件与文件组备份。SQL的各种备份都密切相关,以完全备份为基础,配合其它的备份方式,就可以灵活地备分数据;ORACLE的物理备份与逻辑备份各司其职。SQL可以有多个日志,相当于ORACLE日志组,ORACLE的日志自动切换并归档,SQL的日志不停地膨胀……SQL有附加数据库,可以将数据库很方便地移到别一个服务器,ORACLE有可传输表空间,可操作性就得注意啦。

 005、SQL与ORACLE的恢复类型 SQL有完全恢复与基于时间点的不完全恢复;ORACLE有完全恢复与不完全恢复,不完全恢复有三种方式:基于取消的、基于时间的、基于修改的(SCN)的恢复。不完全恢复可以恢复数据到某个稳定的状态点。

 006、SQL与ORACLE的事务隔离 SET TRANSACTION ISOLATION LEVEL SQL有四种事务隔离级别: READ COMMITTED、READ UNCOMMITTED、REPEATABLE READ、SERIALIZABLE ORACLE有两种事务隔离级别 READ COMMITTED、SERIALIZABLE SQL虽然有四种事务隔离,事务之间还是经常发生阻塞;ORACLE则利用回退段很好地实现了事务隔离,不会产生阻塞。SQL与ORACLE如果发生死锁,都可以很快地识别并将之处理掉。

 007 SQL与ORACLE的外键约束 SQL的外键约束可以实现级联删除与级联更新,ORACLE则只充许级联删除。 CREATE TABLE A001(ID INT PRIMARY KEY,NAME VARCHAR(20)) CREATE TABLE A002(ID INT REFERENCES A001(ID)ON DELETE CASCADE ON UPDATE CASCADE,AGE TINYINT) CREATE TABLE A001(ID INT PRIMAY KEY,NAME VARCHAR2(20)) CREATE TABLE A002(ID INT REFERENCES A001(ID)ON DELETE CASCADE,AGE NUMBER(2,0))

 008、SQL与ORACLE的临时表 SQL的临时表用#或##开头,使用完后自动释放,ORACLE的临时表则存在数据库中,每个会话的数据都互不干涉。oracle临时表中的纪录可以被定义为自动删除(分commit方式和transaction方式),而表结构不会被自动删除。临时表的DML,DDL操作和标准表一样。 CREATE TABLE #TEMP(ID INT,NAME VARCHAR(20)) ------------------------------------------------------- CREATE GLOBAL TEMPORARY TABLE TEMP(ID INT,VARCHAR2(20))

 009、SQL与ORACLE的类型转换 SQL常用类型转换函数有:CAST、CONVERT、STR ORACLE常用类型转换函数有:TO_CHAR、TO_NUMBER、TO_DATE SELECT CONVERT(VARCHAR(20),GETDATE(),112) ------------------------------------------------------------------------------------------------ SELECT TO_CHAR(SYSDATE,‘YYYYMMDD’)FROM DUAL

010、SQL与ORACLE的自动编号 SQL的编号一般由IDENTITY字段来提供,可以灵活地设定种子值,增量,取值范围有BIGINT、INT、SMALLINT、TINYINT、DEIMAL等;ORACLE的编号一般由SEQUENCE来提供,由NEXTVAL与CURVAL函数从SEQUENCES取值。 CREATE TABLE A003(ID INT IDENTITY(-9999,9),NAME VARCHAR(20)) ------------------------------------------------------------------------------------------------------- CREATE SEQUENCE SEQ_001 START 9999 INCREMENT BY 9 CREATE TABLE A004(ID INT) INSERT INTO A004 VALUES(SEQ_001.NEXTVAL) INSERT INTO A004 VALUES(SEQ_001.CURVAL+1)

011、SQL与ORACLE的分区表 从严格意思上来讲,SQL还没有分区表,它的分区表是以UNION为基础,将多个结果集串起来,实际上是视图;ORACLE的分区表有多种:PARTITION BY RANGE、PARTITION BY HASH、PARTITION BY LIST,其它就是混合分区,以上三种基础分区的混合使用。当然ORACLE也可以象SQL那样分区视图。 CREATE TABLE A1999(ID INT,NAME VARCHAR(20)) CREATE TABLE A2000(ID INT,NAME VARCHAR(20)) CREATE VIEW V_PART AS SELECT * FROM A1999 UNION SELECT * FROM A2000 -------------------------------------------------- CREATE TABLE A_PART1(ID INT,NAME VARCHAR2(20)) PARTITON BY RANGE(ID)( PARTITION P1 VALUES LESS THEN (2000000) PATITION P2 VALUES LESS THEN (MAXVALUE)) CREATE TABLE A_PART2(ID INT,NAME VARCHAR2(20)) PARTITION BY HASH(ID) PARTITIONS 2 STORE IN (USERS01,USERS02) CREATE TABLE A_PART3(ID INT,NAME VARCHAR2(20)) PARTITION BY LIST(ID)( PARTIION P1 VALUES(‘01’,’03’,’05’) PARTITON P2 VALUES(‘02’,’04’))

 012、SQL与ORACLE的存储过程 SQL的存储过程可以很方便地返回结果集,ORACLE的存储过程只有通过游标类型返回结果集,这种结果集ADO不可识别,如果想使用ORACLE存储过程的结果集,只有使用ODAC开发包(DELPHI/BCB控件组 www.51delphi.com 与www.playicq.com有下载),SQL的过程参数如果是字符必须指定参数长度,ORACLE的过程则不充许指定字符参数的长度。 CREATE PROCEDURE UP_001(@ID INT) AS BEGIN SELECT ID ,SUM(QTY) FROM A_TEST WHERE ID=@ID GROUP BY @ID END ------------------------------------------------------------ CREATE OR REPLACE PACKAGE UP_002 AS TYPE MYCURSOR IS REF CURSOR; FUNCTION GETRECORD RETURN MYCURSOR; END; CEEATE OR REPLACE PACKAGE BODY UP_002 AS FUNCTION GETRECORD RETURN MYCURSOR AS MC MYCURSOR; SL VARCHAR2(999); BEGIN OPEN MC FOR SELECT * FROM A001; RETURN MC; END; END; ORACLE的存储函数返回结果这么艰难,但SQL的触发器竟然也充许返回结果集就令人费解啦,触发器的调试比较麻烦,在SQL实际开发中,一般都将触发器要执行的代码放到过程中进行调试,在查询分析器中可以对过程进行设断点调试。

013、SQL与ORACLE的触发器 触发器的事务是引起触发动作事务的延续,在SQL的触发器中是可以无BEGIN TRAN而可以直接COMMIT TRAN的。SQL的触发器是表级触发器,DML影响一行或无数行触发动作只触发一次,ORACLE分表级触发器与行级触发器,触发的粒度更细腻一些,SQL在处理多行时就必须使用CURSOR啦。ORACLE使用INSERTING、DELTING、UPDATING判断执行了什么DML操作,SQL只有判断INSERTED、DELETED的记录数来判断执行了什么操作,只有INSERTED映象表记录数大于0表示INSERT,只有DELETED映象表记录数大于0表示DELETE,若两个表记录数都大于0表示UPDATE。 用SQL的触发器实现级联添加、级联删除、级联更新 CREATE TABLE A1(ID INT,NAME VARCHAR(20)) CREATE TABLE A2(ID INT,NAME VARCHAR(20)) CREATE TRIGGER TRI_A1_INS ON A1 FOR INSERT , DELETE , UPDATE AS BEGIN DECLARE @I INT,@D INT,@ID INT SELECT @I=COUNT(*) FROM INSERTED SELECT @D=COUNT(*) FROM DELETED --IF (@I>0 AND @D>0) 执行更新,由于用到游标,故略去 IF @I>0 INSERT INTO A2 SELECT * FROM INSERTED IF @D>0 DELETE FROM A2 WHERE ID=@ID END ---------------------------------------------------------------------- 用ORACLE的触发器实现级联添加、级联删除、级联更新 CREATE OR REPLACE TRI_A1_INS AFTER INSERT OR DELETE OR UPDATE ON A1 FOR EACH ROW BEGIN IF INSERTING THEN INSERT INTO A2 SELECT * FROM :NEW; END IF; IF DELETING THEN DELETE FROM A2 WHERE ID = :OLD.ID ; END IF; IF UPDATING THEN UPATE A2 SET ID = :NEW.ID , NAME = :NEW.NAME WHERE ID = :OLD.ID ; END IF; END

014、SQL与ORACLE的游标 SQL的游标用@@FETCH_STATUS判断是否还有数据,ORACLE的游标用%FOUND、%NOTFOUND来判断游标是否结束,游标分服务端游标与客户端游标,在存储过程、函数、触发器中声明的游标为服务端游标,其它处声明的游标为客户端游标,游标需要使用较多的内存,但它比临时表的性能要优一些,因为临时表占用的是DISK I/O,DISK I/O应该比服务器的内存要更珍贵一些吧。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10687260/viewspace-264937/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-04-20

  • 博文量
    14
  • 访问量
    23629