您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > sql server与oracle的区别
第1页不足之处,敬请指正xzhui@vip.sina.comQQ77056803疯狂SQL之魔兽争霸本人平时比较沉默,但朋友们都说我很疯狂—疯狂地学习、疯狂地工作。很久就有写点东西的打算啦,一直懒于打字,近来稍有空闲,决定杜撰此文,献给现些喜欢或不喜欢沉默的朋友。----自序网上已经有很多SQL与ORACLE的对比,但本人要讲的即不是单纯的SQL,也不是单纯的ORACLE,更不是评价谁好谁坏(意思不大),而是两种数据库之相同和异同,本人曾讲授过SQL与ORACLE的课程,讲SQL时说SQL好,讲ORACLE时又说ORACLE棒,现在终于可以平心而评啦。估计有人现在会嘿嘿冷笑(又一个误人子弟的骗子),老实说,当初每次讲完课,就有这种感觉—教的人不得其法,学的人不得其道。说点严肃的事吧,据说比尔与艾里森在洗手间相遇,两个又是拥抱,又是KISS,不多久就吵了起来,比尔对查询分析器(SQLQUERYANALYZE)赞不经绝口,艾里森嘿嘿冷笑,只说了一句话—SQLPLUS内秀。言归正传,且听我一一道来1.SQL与ORACLE的内存分配ORACLE的内存分配大部分是由INIT.ORA来决定的,一个数据库实例可以有N种分配方案,不同的应用(OLTP、OLAP)它的配置是有侧重的。SQL概括起来说,只有两种内存分配方式:动态内存分配与静态内存分配,动态内存分配充许SQL自己调整需要的内存,静态内存分配限制了SQL对内存的使用。1.002、SQL与ORACLE的物理结构总得讲,它们的物理结构很相似,SQL的数据库相当于ORACLE的模式(方案),SQL的文件组相当于ORACLE的表空间,作用都是均衡DISKI/O,SQL创建表时,可以指定表在不同的文件组,ORACLE则可以指定不同的表空间。CREATETABLEA001(IDDECIMAL(8,0))ON[文件组]--------------------------------------------------------------------------------------------CREATETABLEA001(IDNUMBER(8,0))TABLESPACE表空间注:以后所有示例,先SQL,后ORACLE2.003、SQL与ORACLE的日志模式SQL对日志的控制有三种恢复模型:SIMPLE、FULL、BULK-LOGGED;ORACLE对日志的控制有二种模式:NOARCHIVELOG、ARCHIVELOG。SQL的SIMPLE相当于ORACLE的NOARCHIVELOG,FULL相当于ARCHIVELOG,BULK-LOGGED相当于ORACLE大批量数据装载时的NOLOGGING。经常有第2页不足之处,敬请指正xzhui@vip.sina.comQQ77056803网友抱怨SQL的日志庞大无比且没法处理,最简单的办法就是先切换到SIMPLE模式,收缩数据库后再切换到FULL,记住切换到FULL之后要马上做完全备份。3.004、SQL与ORACLE的备份类型SQL的备份类型分的极杂:完全备份、增量备份、日志备份、文件或文件组备份;ORACLE的备份类型就清淅多啦:物理备份、逻辑备份;ORACLE的逻辑备份(EXP)相当于SQL的完全备份与增量备份,ORACLE的物理备份相当于SQL的文件与文件组备份。SQL的各种备份都密切相关,以完全备份为基础,配合其它的备份方式,就可以灵活地备分数据;ORACLE的物理备份与逻辑备份各司其职。SQL可以有多个日志,相当于ORACLE日志组,ORACLE的日志自动切换并归档,SQL的日志不停地膨胀……SQL有附加数据库,可以将数据库很方便地移到别一个服务器,ORACLE有可传输表空间,可操作性就得注意啦。4.005、SQL与ORACLE的恢复类型SQL有完全恢复与基于时间点的不完全恢复;ORACLE有完全恢复与不完全恢复,不完全恢复有三种方式:基于取消的、基于时间的、基于修改的(SCN)的恢复。不完全恢复可以恢复数据到某个稳定的状态点。5.006、SQL与ORACLE的事务隔离SETTRANSACTIONISOLATIONLEVELSQL有四种事务隔离级别:READCOMMITTED、READUNCOMMITTED、REPEATABLEREAD、SERIALIZABLEORACLE有两种事务隔离级别READCOMMITTED、SERIALIZABLESQL虽然有四种事务隔离,事务之间还是经常发生阻塞;ORACLE则利用回退段很好地实现了事务隔离,不会产生阻塞。SQL与ORACLE如果发生死锁,都可以很快地识别并将之处理掉。6.007SQL与ORACLE的外键约束SQL的外键约束可以实现级联删除与级联更新,ORACLE则只充许级联删除。CREATETABLEA001(IDINTPRIMARYKEY,NAMEVARCHAR(20))CREATETABLEA002(IDINTREFERENCESA001(ID)ONDELETECASCADEONUPDATECASCADE,AGETINYINT)CREATETABLEA001(IDINTPRIMAYKEY,NAMEVARCHAR2(20))CREATETABLEA002(IDINTREFERENCESA001(ID)ONDELETECASCADE,AGENUMBER(2,0))第3页不足之处,敬请指正xzhui@vip.sina.comQQ770568037.008、SQL与ORACLE的临时表SQL的临时表用#或##开头,使用完后自动释放,ORACLE的临时表则存在数据库中,每个会话的数据都互不干涉。oracle临时表中的纪录可以被定义为自动删除(分commit方式和transaction方式),而表结构不会被自动删除。临时表的DML,DDL操作和标准表一样。CREATETABLE#TEMP(IDINT,NAMEVARCHAR(20))-------------------------------------------------------CREATEGLOBALTEMPORARYTABLETEMP(IDINT,VARCHAR2(20))8.009、SQL与ORACLE的类型转换SQL常用类型转换函数有:CAST、CONVERT、STRORACLE常用类型转换函数有:TO_CHAR、TO_NUMBER、TO_DATESELECTCONVERT(VARCHAR(20),GETDATE(),112)------------------------------------------------------------------------------------------------SELECTTO_CHAR(SYSDATE,‘YYYYMMDD’)FROMDUAL9.010、SQL与ORACLE的自动编号SQL的编号一般由IDENTITY字段来提供,可以灵活地设定种子值,增量,取值范围有BIGINT、INT、SMALLINT、TINYINT、DEIMAL等;ORACLE的编号一般由SEQUENCE来提供,由NEXTVAL与CURVAL函数从SEQUENCES取值。CREATETABLEA003(IDINTIDENTITY(-9999,9),NAMEVARCHAR(20))-------------------------------------------------------------------------------------------------------CREATESEQUENCESEQ_001START9999INCREMENTBY9CREATETABLEA004(IDINT)INSERTINTOA004VALUES(SEQ_001.NEXTVAL)INSERTINTOA004VALUES(SEQ_001.CURVAL+1)10.011、SQL与ORACLE的分区表从严格意思上来讲,SQL还没有分区表,它的分区表是以UNION为基础,将多个结果集串起来,实际上是视图;ORACLE的分区表有多种:PARTITIONBYRANGE、PARTITIONBYHASH、PARTITIONBYLIST,其它就是混合分区,以上三种基础分区的混合使用。当然ORACLE也可以象SQL那样分区视图。CREATETABLEA1999(IDINT,NAMEVARCHAR(20))第4页不足之处,敬请指正xzhui@vip.sina.comQQ77056803CREATETABLEA2000(IDINT,NAMEVARCHAR(20))CREATEVIEWV_PARTASSELECT*FROMA1999UNIONSELECT*FROMA2000--------------------------------------------------CREATETABLEA_PART1(IDINT,NAMEVARCHAR2(20))PARTITONBYRANGE(ID)(PARTITIONP1VALUESLESSTHEN(2000000)PATITIONP2VALUESLESSTHEN(MAXVALUE))CREATETABLEA_PART2(IDINT,NAMEVARCHAR2(20))PARTITIONBYHASH(ID)PARTITIONS2STOREIN(USERS01,USERS02)CREATETABLEA_PART3(IDINT,NAMEVARCHAR2(20))PARTITIONBYLIST(ID)(PARTIIONP1VALUES(‘01’,’03’,’05’)PARTITONP2VALUES(‘02’,’04’))11.012、SQL与ORACLE的存储过程SQL的存储过程可以很方便地返回结果集,ORACLE的存储过程只有通过游标类型返回结果集,这种结果集ADO不可识别,如果想使用ORACLE存储过程的结果集,只有使用ODAC开发包(DELPHI/BCB控件组有下载),SQL的过程参数如果是字符必须指定参数长度,ORACLE的过程则不充许指定字符参数的长度。CREATEPROCEDUREUP_001(@IDINT)ASBEGINSELECTID,SUM(QTY)FROMA_TESTWHEREID=@IDGROUPBY@IDEND------------------------------------------------------------CREATEORREPLACEPACKAGEUP_002ASTYPEMYCURSORISREFCURSOR;FUNCTIONGETRECORDRETURNMYCURSOR;END;CEEATEORREPLACEPACKAGEBODYUP_002ASFUNCTIONGETRECORDRETURNMYCURSORASMCMYCURSOR;SLVARCHAR2(999);BEGINOPENMCFORSELECT*FROMA001;RETURNMC;END;END;ORACLE的存储函数返回结果这么艰难,但SQL的触发器竟然也充许返回结果集就令人费解啦,触发器的调试比较麻烦,在SQL实际开发中,一般都将触发器要执行的代码放到过程中进行调试,在查询分析器中可以对过程进行设断点调试。第5页不足之处,敬请指正xzhui@vip.sina.comQQ7705680312.013、SQL与ORACLE的触发器触发器的事务是引起触发动作事务的延续,在SQL的触发器中是可以无BEGINTRAN而可以直接COMMITTRAN的。SQL的触发器是表级触发器,DML影响一行或无数行触发动作只触发一次,ORACLE分表级触发器与行级触发器,触发的粒度更细腻一些,SQL在处理多行时就必须使用CURSOR啦。ORACLE使用INSERTING、DELTING、UPDATING判断执行了什么DML操作
本文标题:sql server与oracle的区别
链接地址:https://www.777doc.com/doc-5906390 .html