


Oracle8i與MS SQL SERVER之比較
添加時(shí)間:2012-11-14 16:54:48
添加:
思海網(wǎng)絡(luò)
1、關(guān)于數(shù)據(jù)庫的概念
我怎么找到或者創(chuàng)建自己的數(shù)據(jù)庫
Oracle的數(shù)據(jù)庫的概念已經(jīng)完全不同于MS SQL
Oracle的服務(wù)和數(shù)據(jù)庫,相當(dāng)于MS SQL的數(shù)據(jù)庫服務(wù)
Oracle的服務(wù)=后臺(tái)進(jìn)程+相關(guān)內(nèi)存
數(shù)據(jù)庫=數(shù)據(jù)文件的集合
而且Oracle的服務(wù)是完全可以與數(shù)據(jù)文件脫離開來的
那么MS SQL的數(shù)據(jù)庫,在Oracle哪兒能找到呢,
Oracle的Schema,Schema的中文意思:方案,意思是一個(gè)用戶所擁有所有對(duì)象的集合
這里的對(duì)象包括表、視圖、實(shí)例化視圖、序列、過程、函數(shù)、程序包、同義詞
(下面我會(huì)詳細(xì)解釋這其中的一些陌生的概念)
所以我們要建立一個(gè)在Oracle中的類似于MS SQL的數(shù)據(jù)庫:大致過程
·建立數(shù)據(jù)表空間(相當(dāng)于MS SQL的數(shù)據(jù)庫的數(shù)據(jù)文件)
·建立臨時(shí)表空間(相當(dāng)于MS SQL的數(shù)據(jù)庫的事務(wù)日志文件)
·建立用戶,他的卻省表空間和臨時(shí)表空間是剛建立的兩個(gè)表空間
·給用戶授權(quán),最起碼的角色權(quán)限是Connect 的角色
·以該用戶登陸,創(chuàng)建自己的表、視圖、實(shí)例化視圖、序列、過程、函數(shù)、程序包、同義詞等
2、關(guān)于Oracle Manager Server與MS SQL的Enetrprise manager
應(yīng)該說這兩者有很大的差別,DBA Studio工具提供了與MS SQL的Enetrprise manager同樣的功用,
DBA Studio工具對(duì)一般使用來說已經(jīng)足夠了。
但這里有必要對(duì)Oracle Manager Server解釋一下
·它是Oracle 管理分布式數(shù)據(jù)庫的服務(wù),注意他是服務(wù)
·它卻省并不安裝
·它需要有自己管理所需要的資料庫,在某個(gè)數(shù)據(jù)庫中需要建立相應(yīng)的用戶
·它的等錄需要身份驗(yàn)證,注意這里的身份驗(yàn)證,與管理所需要的資料庫的用戶是不是一個(gè)概念,
也不是數(shù)據(jù)庫中的Sys和、system用戶,它的卻省用戶是oemtemp
·它的功能有
·使用它,在管理端要啟動(dòng)Manager Server服務(wù)和智能代理服務(wù)(OracleAgent),被管理的數(shù)據(jù)庫服務(wù)器
要啟動(dòng)智能代理服務(wù)(OracleAgent)
3、關(guān)于Oracle 的Sys、System的用戶與MS SQL的master的比較
MS SQL的master數(shù)據(jù)庫存儲(chǔ)了當(dāng)前數(shù)據(jù)庫服務(wù)的一些配置信息如
數(shù)據(jù)庫設(shè)備(在MS SQL已經(jīng)弱化)、字符集、數(shù)據(jù)文件、登陸帳號(hào)、擁有的數(shù)據(jù)庫、整個(gè)服務(wù)參數(shù)配制等信息
Oracle的Sys存儲(chǔ)Oracle服務(wù)或者實(shí)例的信息及所有用戶的數(shù)據(jù)字典信息
這一點(diǎn)不同于MS SQL,MS SQL每一個(gè)數(shù)據(jù)庫擁有自己的對(duì)象的數(shù)據(jù)字典信息
System用戶擁有數(shù)據(jù)字典是視圖信息,有了這些視圖,我們的查詢數(shù)據(jù)庫的信息就特別方便
卻省情況下,system用戶擁有DBA系統(tǒng)角色權(quán)限,而sys不僅擁有DBA 的權(quán)限還擁有SysDBA的權(quán)限
DBA、SysDBA這兩個(gè)系統(tǒng)角色有什么區(qū)別呢
在說明這一點(diǎn)之前我需要說一下Oracle服務(wù)的創(chuàng)建過程
·創(chuàng)建實(shí)例
·啟動(dòng)實(shí)例
·創(chuàng)建數(shù)據(jù)庫(system表空間是必須的)
啟動(dòng)過程
·實(shí)例啟動(dòng)
·裝載數(shù)據(jù)庫
·打開數(shù)據(jù)庫
SysDBA,是管理Oracle實(shí)例的,它的存在不依賴于整個(gè)數(shù)據(jù)庫完全啟動(dòng),
只要實(shí)例啟動(dòng)了,他就已經(jīng)存在,以SysDBA身份登陸,裝載數(shù)據(jù)庫、打開數(shù)據(jù)庫
只有數(shù)據(jù)庫打開了,或者說整個(gè)數(shù)據(jù)庫完全啟動(dòng)后,DBA角色才有了存在的基礎(chǔ)!
4、Oracle中新的數(shù)據(jù)庫對(duì)象:實(shí)例化視圖、快照、序列、程序包、同義詞、抽象的數(shù)據(jù)類型
·實(shí)例化視圖又稱顯形圖:實(shí)例化說明他有自己的存儲(chǔ)空間,視圖:說明他的數(shù)據(jù)來源于其他表數(shù)據(jù)。
實(shí)例化視圖中的數(shù)據(jù),設(shè)置為隔一段時(shí)間更新數(shù)據(jù),更新的模式可以定義為完全更新和增量更新
·快照基本上同實(shí)例化視圖,只不過數(shù)據(jù)來源不同,快照數(shù)據(jù)來愿于遠(yuǎn)程數(shù)據(jù)庫,而實(shí)例化視圖則來源于本地?cái)?shù)據(jù)表
·序列,相當(dāng)于MS SQL中的identity列,他是一個(gè)數(shù)字順序列表
·程序包:他是過程、函數(shù)、全局變量的集合,他封裝了私有變量、私有過程和私有函數(shù)
如:dbms_out包
·同義詞:是對(duì)數(shù)據(jù)庫中的對(duì)象的別名,同義詞可以是全局的也可以是私有的(屬于某個(gè)用戶的)
如:Tab,col等
·抽象的數(shù)據(jù)類型,類似于C中的結(jié)構(gòu)體或Pascal記錄類型
關(guān)于類型,這里還有一個(gè)題外話:A Tab%RowType,這是一個(gè)特別的抽象的數(shù)據(jù)類型,該類型的分量就是TAB的字段
B Tab.TName%Type,這定義了一個(gè)和tab的字段TNAME相同的數(shù)據(jù)類型的變量,想想他有什么好處
5、Oracle數(shù)據(jù)庫連接和MS SQL遠(yuǎn)程連接
兩者都是為了實(shí)現(xiàn)分布式數(shù)據(jù)庫的操作。
兩者都能實(shí)現(xiàn)分布式事務(wù),參見MS SQL的聯(lián)機(jī)幫助
6、Oracle回滾段和MS SQL的數(shù)據(jù)庫事務(wù)日志文件
回滾段提供了事物回滾需要使用的數(shù)據(jù)變化以前的映象.這些映象是按條目存儲(chǔ)的,
如果這些條目過少,一個(gè)事務(wù)等待另一個(gè)事務(wù)的幾率增大,就會(huì)影響數(shù)據(jù)庫的性能
卻省安裝時(shí),提供一個(gè)系統(tǒng)回滾段他在System表空間.為了提高性能system 表空間
不應(yīng)存儲(chǔ)有任何數(shù)據(jù)字典信息以外的信息.
MS SQL數(shù)據(jù)庫事務(wù)日志文件功能雷同于回滾段,只不過他是同特定的數(shù)據(jù)庫密切相關(guān)的
7、關(guān)于數(shù)據(jù)表的管理
·超大型數(shù)據(jù)表的管理
一個(gè)數(shù)據(jù)表,尤其是那種流水帳表,長年累月后急劇膨脹,最后影響查詢性能
怎么辦,Oracle和MS SQL都提供了一種方法,把數(shù)據(jù)文件及其索引存放在一個(gè)特定的
數(shù)據(jù)文件或表空間里,但這個(gè)還是不能解決問題,怎么辦,開發(fā)人員只能給表添加
時(shí)間的標(biāo)志:如CWSJ2000(財(cái)務(wù)數(shù)據(jù)2000),CWSJ2001,CWSJ2002, 這種命名方式,
確實(shí)能提高查詢性能,但是給開發(fā)帶來了不少的麻煩(浪潮財(cái)務(wù)就是這樣做的),
而且當(dāng)你不知道數(shù)據(jù)在哪個(gè)表中的時(shí)候,你要聯(lián)合這么表進(jìn)行查詢,豈不長哉!
Oracle提供了很好的手段解決了這個(gè)問題:表及索引分區(qū)存儲(chǔ)。按字段值的范圍
進(jìn)行分區(qū)存儲(chǔ).具體做法不在說明。
·Oracle索引組織表和MS SQL簇索引表
兩者的數(shù)據(jù)存放順序都是按照索引值的順序存放的。
·無事務(wù)回滾概念的表,對(duì)這種表的操作不村在事務(wù)的概念
記得以前MySQL是不提供事務(wù)的回滾(不知現(xiàn)在有否變化)
而Oracle提供了建表參數(shù)nologging,使對(duì)該表的操作不參與事物的回滾
·索引
Oracle提供了多種MS SQL沒有的索引類型
··位圖索引,
比方說性別:僅有男女
第1條記錄:男
第2條記錄:男
第3條記錄:女
第4條記錄:男
第5條記錄:女
第6條記錄:男
.........
那它的索引:110101............
看這種索引多節(jié)省空間,它適用于字段值是的已知幾個(gè)中的一個(gè)
··基于函數(shù)或者說表達(dá)式的索引,這個(gè)功能可謂強(qiáng)大
8、外連接
·MS SQL SERVER 支持兩種形式表間連接
①從Sybase繼承來的形式:
字段1 *= 字段2 (左連接)
字段1 =* 字段2 (右連接)
沒有這種形式的全外連接語法
②標(biāo)準(zhǔn)的外連接語法
left [outer] join on 邏輯表達(dá)式
right [outer] join on 邏輯表達(dá)式
full [outer] join (全外連接) on 邏輯表達(dá)式
這里的邏輯表達(dá)式 可以是很復(fù)雜的表達(dá)式例如 :A.ID=B.ID AND (A.Parebt_ID=1 OR A.Parent_ID=2)
需要提醒大家的是:你寫的查詢語句報(bào)告過這樣的錯(cuò)誤
Joined tables cannot be specified in a query containing outer join operators. Joined tables cannot be specified in a query containing outer join operators. View or function 'dbo.VU_CAF_BILLS' contains joined tables
這句話告訴你,你查詢語句引用的視圖或者子查詢也用到了外連接,但是引用視圖或者子查詢外連接語法與你的外連接語法不一直導(dǎo)致的
例如:select A.[ZONE],A.FLAG,A.FlagDesc,A.CAF_NO
from dbo.VU_CAF_BILLS A,TU_Flag
where A.CAF_NO*=TU_Flag.ObjNo
視圖dbo.VU_CAF_BILLS的外連接語法是標(biāo)準(zhǔn)的SQL語法,而本語句中的外連接語法卻是Sybase式的外連接語法。
·Oracle不支持標(biāo)準(zhǔn)的外連接語法,也沒有全外連接,這是它的缺陷
字段1 = 字段2(+) (左連接)
字段1(+) = 字段2 (右連接)
·使用外連接語句的用處
①不想因?yàn)楸磉B接而使主表數(shù)據(jù)行丟失,這一點(diǎn)毋庸多說
①找某條記錄在A表存在,而在B表不存在,按常規(guī)做法使用not in (select 查詢子句)語法,
使用not in 最大的缺點(diǎn)速度慢,原因是每個(gè)數(shù)據(jù)行都去做:select 查詢子句
而使用下面的語法:
select TU_COMPANY.*
from TU_COMPANY left join TU_Comp_Agent on TU_COMPANY.ID=TU_Comp_Agent.CompCode
where TU_Comp_Agent.Id is null
9、觸發(fā)器
·從我了解到的,MS SQL SERVER,僅有表的觸發(fā)器,而且觸發(fā)時(shí)機(jī)不夠豐富
如插入觸發(fā)在子,不區(qū)分單條插入還是多條插入,也不區(qū)分插入前觸發(fā)還是插入后觸發(fā)
碰到多條數(shù)據(jù)的插入,需要使用游標(biāo)處理每條插入的數(shù)據(jù)
·Oracle提供的觸發(fā)器不僅有基于表的觸發(fā)器,而且其他類型的,例如數(shù)據(jù)庫級(jí)的觸發(fā)器:數(shù)據(jù)庫啟動(dòng)、數(shù)據(jù)庫關(guān)閉
對(duì)于表級(jí)的觸發(fā)器,區(qū)分單條插入還是多條插入,也區(qū)分插入前觸發(fā)還是插入后觸發(fā)
10、表數(shù)據(jù)復(fù)制
·庫內(nèi)數(shù)據(jù)復(fù)制
·MS SQL Server
Insert into 復(fù)制表名稱 select 語句 (復(fù)制表已經(jīng)存在)
select 字段列表 into 復(fù)制表名稱 from 表 (復(fù)制表不存在)
·Oracle
Insert into 復(fù)制表名稱 select 語句 (復(fù)制表已經(jīng)存在)
create table 復(fù)制表名稱 as select 語句 (復(fù)制表不存在)
·文本文件轉(zhuǎn)入、轉(zhuǎn)出的批量處理
·MS SQL Server
BCP命令行程序
·Oracle
SQLLDR命令行程序
11、多表更新、刪除
一條更新語句是不能更新多張表的,除非使用觸發(fā)器隱含更新,我這里說的意思是:根據(jù)其他表數(shù)據(jù)更新你要更新的表
一般形式:
·MS SQL Server
update A
SET 字段1=B表字段表達(dá)式,
字段2=B表字段表達(dá)式
from B
WHERE 邏輯表達(dá)式
·Oracle
update A
SET 字段1=(select 字段表達(dá)式 from B WHERE ...),
字段2=(select 字段表達(dá)式 from B WHERE ...)
WHERE 邏輯表達(dá)式
從以上來看,感覺oracle沒有ms sql好,主要原因:假如A需要多個(gè)字段更新,MS_SQL語句更簡(jiǎn)練
你知道剛學(xué)數(shù)據(jù)庫的人怎么做上面這件事情嗎,他們使用游標(biāo)一條一條的處理
12、關(guān)于存儲(chǔ)過程或函數(shù)中使用的臨時(shí)表,兩者都提供了這個(gè)功能
臨時(shí)表,最主要的好處是,操作不留任何痕跡、不產(chǎn)生日志,
所以速度快
·MS SQL SERVER
CREATE TABLE #表名稱(........) 或者 SELECT 字段表達(dá)式列表 INTO #表名稱 FROM
表名稱前加#即可,這些臨時(shí)表都是只在一個(gè)數(shù)據(jù)庫連接會(huì)話期間有效
·Oracle
create [Global] Temporary Table ,加上[Global]就是全局的臨時(shí)表(所有數(shù)據(jù)庫連接會(huì)話都是可見的),
不則為私有的(在一個(gè)數(shù)據(jù)庫連接會(huì)話期間有效)
13、兩者都提供了自己的桌面版的數(shù)據(jù)庫
·MS SQL SERVER 毋庸我多說了
基本上桌面版的數(shù)據(jù)庫提供的功能跟服務(wù)器版的功能沒多大區(qū)別
缺少的全文搜索服務(wù)功能
·Oracle
Oracle Lite 8,我就看過人家用Oracle lite 8做過海關(guān)報(bào)關(guān)系統(tǒng)
補(bǔ)充:Sybase 提供了桌面版的Sybase SQL anywhere
14、動(dòng)態(tài)執(zhí)行SQL語句
·MS SQL SERVER 7.0好象沒有這個(gè)功能,MS SQL SERVER 2000已經(jīng)這個(gè)功能。
你是不是想在存儲(chǔ)過程的參數(shù)中傳遞一個(gè)表名或者在過程體里動(dòng)態(tài)
生成一個(gè)SQL語句,你會(huì)發(fā)現(xiàn)很難辦到。看了下面的例子:你以前的問題全解決了
declare @count int
declare @SQL nvarchar(200)
set @SQL = N'select count(*) from sysobjects'
exec sp_executesql @SQL,N'@i int output',@count output
·Oracle提供了兩種方法實(shí)現(xiàn)這個(gè)功能
①程序包DBMS_SQL,執(zhí)行一個(gè)語句的過程:
打開游標(biāo)(open_cursor,對(duì)于非查詢語句,無此過程)
分析語句(Parse)
綁定變量(bind_variable)
執(zhí)行語句(execute)
關(guān)閉游標(biāo)(close_cursor,對(duì)于非查詢語句,無此過程)
②execute immediate ls_SQL
15、數(shù)據(jù)庫備份和恢復(fù)
兩者都提供了很強(qiáng)的數(shù)據(jù)庫的備份和恢復(fù)能力,Oracle提供了更多的手段,
Orace宣稱她的數(shù)據(jù)庫是不可摧毀的也不是瞎吹牛
·MS SQL SERVER
①數(shù)據(jù)庫的倒入倒出DTS工具,如果數(shù)據(jù)源和目的都是MS SQL SERVER則可以完全復(fù)制數(shù)庫的結(jié)構(gòu)
(包括表、視圖、索引、觸發(fā)子、規(guī)則、默認(rèn)、存儲(chǔ)過程、用戶定義函數(shù)、表數(shù)據(jù))
②數(shù)據(jù)庫備份和恢復(fù)命令
backup database
restore database
倒出的數(shù)據(jù)文件還可以壓縮的,這一點(diǎn)不同于Sybase
而且這種數(shù)據(jù)庫備份和恢復(fù)的方式可以是增量的和完全的
③數(shù)據(jù)庫的附加Attach
只要數(shù)據(jù)庫的原始數(shù)據(jù)和日志文件沒有損壞,就可以
命令:SP_ATTACH_DB
這種情況,有時(shí)候會(huì)出問題:比方說你鍵了登陸帳號(hào),不是使用缺省的登陸帳號(hào)sa,
由于登陸帳號(hào)的信息存放在master數(shù)據(jù)庫中,所以你使用原來建立的帳號(hào)就登陸不上,
所以要做一些后補(bǔ)工作
·Oracle
①倒出倒入工具exp和imp工具
倒入倒出的參數(shù)何其多
②冷備份或者稱脫機(jī)備份,備份的時(shí)候數(shù)據(jù)庫是停止的
備份所有的數(shù)據(jù)文件、日志文件、控制文件
③熱備份或者聯(lián)機(jī)備份
數(shù)據(jù)庫處在ARCHIVELOG模式,注意缺省情況下都是ARCHIVELOG
恢復(fù)時(shí)可以選擇完全恢復(fù)、時(shí)間點(diǎn)恢復(fù)、SCN點(diǎn)恢復(fù)、用戶自由干預(yù)的CANCEL恢復(fù)
可以說他的熱備份的恢復(fù)功能是非常之強(qiáng)大的
關(guān)鍵字:Oracle、數(shù)據(jù)庫
我怎么找到或者創(chuàng)建自己的數(shù)據(jù)庫
Oracle的數(shù)據(jù)庫的概念已經(jīng)完全不同于MS SQL
Oracle的服務(wù)和數(shù)據(jù)庫,相當(dāng)于MS SQL的數(shù)據(jù)庫服務(wù)
Oracle的服務(wù)=后臺(tái)進(jìn)程+相關(guān)內(nèi)存
數(shù)據(jù)庫=數(shù)據(jù)文件的集合
而且Oracle的服務(wù)是完全可以與數(shù)據(jù)文件脫離開來的
那么MS SQL的數(shù)據(jù)庫,在Oracle哪兒能找到呢,
Oracle的Schema,Schema的中文意思:方案,意思是一個(gè)用戶所擁有所有對(duì)象的集合
這里的對(duì)象包括表、視圖、實(shí)例化視圖、序列、過程、函數(shù)、程序包、同義詞
(下面我會(huì)詳細(xì)解釋這其中的一些陌生的概念)
所以我們要建立一個(gè)在Oracle中的類似于MS SQL的數(shù)據(jù)庫:大致過程
·建立數(shù)據(jù)表空間(相當(dāng)于MS SQL的數(shù)據(jù)庫的數(shù)據(jù)文件)
·建立臨時(shí)表空間(相當(dāng)于MS SQL的數(shù)據(jù)庫的事務(wù)日志文件)
·建立用戶,他的卻省表空間和臨時(shí)表空間是剛建立的兩個(gè)表空間
·給用戶授權(quán),最起碼的角色權(quán)限是Connect 的角色
·以該用戶登陸,創(chuàng)建自己的表、視圖、實(shí)例化視圖、序列、過程、函數(shù)、程序包、同義詞等
2、關(guān)于Oracle Manager Server與MS SQL的Enetrprise manager
應(yīng)該說這兩者有很大的差別,DBA Studio工具提供了與MS SQL的Enetrprise manager同樣的功用,
DBA Studio工具對(duì)一般使用來說已經(jīng)足夠了。
但這里有必要對(duì)Oracle Manager Server解釋一下
·它是Oracle 管理分布式數(shù)據(jù)庫的服務(wù),注意他是服務(wù)
·它卻省并不安裝
·它需要有自己管理所需要的資料庫,在某個(gè)數(shù)據(jù)庫中需要建立相應(yīng)的用戶
·它的等錄需要身份驗(yàn)證,注意這里的身份驗(yàn)證,與管理所需要的資料庫的用戶是不是一個(gè)概念,
也不是數(shù)據(jù)庫中的Sys和、system用戶,它的卻省用戶是oemtemp
·它的功能有
·使用它,在管理端要啟動(dòng)Manager Server服務(wù)和智能代理服務(wù)(OracleAgent),被管理的數(shù)據(jù)庫服務(wù)器
要啟動(dòng)智能代理服務(wù)(OracleAgent)
3、關(guān)于Oracle 的Sys、System的用戶與MS SQL的master的比較
MS SQL的master數(shù)據(jù)庫存儲(chǔ)了當(dāng)前數(shù)據(jù)庫服務(wù)的一些配置信息如
數(shù)據(jù)庫設(shè)備(在MS SQL已經(jīng)弱化)、字符集、數(shù)據(jù)文件、登陸帳號(hào)、擁有的數(shù)據(jù)庫、整個(gè)服務(wù)參數(shù)配制等信息
Oracle的Sys存儲(chǔ)Oracle服務(wù)或者實(shí)例的信息及所有用戶的數(shù)據(jù)字典信息
這一點(diǎn)不同于MS SQL,MS SQL每一個(gè)數(shù)據(jù)庫擁有自己的對(duì)象的數(shù)據(jù)字典信息
System用戶擁有數(shù)據(jù)字典是視圖信息,有了這些視圖,我們的查詢數(shù)據(jù)庫的信息就特別方便
卻省情況下,system用戶擁有DBA系統(tǒng)角色權(quán)限,而sys不僅擁有DBA 的權(quán)限還擁有SysDBA的權(quán)限
DBA、SysDBA這兩個(gè)系統(tǒng)角色有什么區(qū)別呢
在說明這一點(diǎn)之前我需要說一下Oracle服務(wù)的創(chuàng)建過程
·創(chuàng)建實(shí)例
·啟動(dòng)實(shí)例
·創(chuàng)建數(shù)據(jù)庫(system表空間是必須的)
啟動(dòng)過程
·實(shí)例啟動(dòng)
·裝載數(shù)據(jù)庫
·打開數(shù)據(jù)庫
SysDBA,是管理Oracle實(shí)例的,它的存在不依賴于整個(gè)數(shù)據(jù)庫完全啟動(dòng),
只要實(shí)例啟動(dòng)了,他就已經(jīng)存在,以SysDBA身份登陸,裝載數(shù)據(jù)庫、打開數(shù)據(jù)庫
只有數(shù)據(jù)庫打開了,或者說整個(gè)數(shù)據(jù)庫完全啟動(dòng)后,DBA角色才有了存在的基礎(chǔ)!
4、Oracle中新的數(shù)據(jù)庫對(duì)象:實(shí)例化視圖、快照、序列、程序包、同義詞、抽象的數(shù)據(jù)類型
·實(shí)例化視圖又稱顯形圖:實(shí)例化說明他有自己的存儲(chǔ)空間,視圖:說明他的數(shù)據(jù)來源于其他表數(shù)據(jù)。
實(shí)例化視圖中的數(shù)據(jù),設(shè)置為隔一段時(shí)間更新數(shù)據(jù),更新的模式可以定義為完全更新和增量更新
·快照基本上同實(shí)例化視圖,只不過數(shù)據(jù)來源不同,快照數(shù)據(jù)來愿于遠(yuǎn)程數(shù)據(jù)庫,而實(shí)例化視圖則來源于本地?cái)?shù)據(jù)表
·序列,相當(dāng)于MS SQL中的identity列,他是一個(gè)數(shù)字順序列表
·程序包:他是過程、函數(shù)、全局變量的集合,他封裝了私有變量、私有過程和私有函數(shù)
如:dbms_out包
·同義詞:是對(duì)數(shù)據(jù)庫中的對(duì)象的別名,同義詞可以是全局的也可以是私有的(屬于某個(gè)用戶的)
如:Tab,col等
·抽象的數(shù)據(jù)類型,類似于C中的結(jié)構(gòu)體或Pascal記錄類型
關(guān)于類型,這里還有一個(gè)題外話:A Tab%RowType,這是一個(gè)特別的抽象的數(shù)據(jù)類型,該類型的分量就是TAB的字段
B Tab.TName%Type,這定義了一個(gè)和tab的字段TNAME相同的數(shù)據(jù)類型的變量,想想他有什么好處
5、Oracle數(shù)據(jù)庫連接和MS SQL遠(yuǎn)程連接
兩者都是為了實(shí)現(xiàn)分布式數(shù)據(jù)庫的操作。
兩者都能實(shí)現(xiàn)分布式事務(wù),參見MS SQL的聯(lián)機(jī)幫助
6、Oracle回滾段和MS SQL的數(shù)據(jù)庫事務(wù)日志文件
回滾段提供了事物回滾需要使用的數(shù)據(jù)變化以前的映象.這些映象是按條目存儲(chǔ)的,
如果這些條目過少,一個(gè)事務(wù)等待另一個(gè)事務(wù)的幾率增大,就會(huì)影響數(shù)據(jù)庫的性能
卻省安裝時(shí),提供一個(gè)系統(tǒng)回滾段他在System表空間.為了提高性能system 表空間
不應(yīng)存儲(chǔ)有任何數(shù)據(jù)字典信息以外的信息.
MS SQL數(shù)據(jù)庫事務(wù)日志文件功能雷同于回滾段,只不過他是同特定的數(shù)據(jù)庫密切相關(guān)的
7、關(guān)于數(shù)據(jù)表的管理
·超大型數(shù)據(jù)表的管理
一個(gè)數(shù)據(jù)表,尤其是那種流水帳表,長年累月后急劇膨脹,最后影響查詢性能
怎么辦,Oracle和MS SQL都提供了一種方法,把數(shù)據(jù)文件及其索引存放在一個(gè)特定的
數(shù)據(jù)文件或表空間里,但這個(gè)還是不能解決問題,怎么辦,開發(fā)人員只能給表添加
時(shí)間的標(biāo)志:如CWSJ2000(財(cái)務(wù)數(shù)據(jù)2000),CWSJ2001,CWSJ2002, 這種命名方式,
確實(shí)能提高查詢性能,但是給開發(fā)帶來了不少的麻煩(浪潮財(cái)務(wù)就是這樣做的),
而且當(dāng)你不知道數(shù)據(jù)在哪個(gè)表中的時(shí)候,你要聯(lián)合這么表進(jìn)行查詢,豈不長哉!
Oracle提供了很好的手段解決了這個(gè)問題:表及索引分區(qū)存儲(chǔ)。按字段值的范圍
進(jìn)行分區(qū)存儲(chǔ).具體做法不在說明。
·Oracle索引組織表和MS SQL簇索引表
兩者的數(shù)據(jù)存放順序都是按照索引值的順序存放的。
·無事務(wù)回滾概念的表,對(duì)這種表的操作不村在事務(wù)的概念
記得以前MySQL是不提供事務(wù)的回滾(不知現(xiàn)在有否變化)
而Oracle提供了建表參數(shù)nologging,使對(duì)該表的操作不參與事物的回滾
·索引
Oracle提供了多種MS SQL沒有的索引類型
··位圖索引,
比方說性別:僅有男女
第1條記錄:男
第2條記錄:男
第3條記錄:女
第4條記錄:男
第5條記錄:女
第6條記錄:男
.........
那它的索引:110101............
看這種索引多節(jié)省空間,它適用于字段值是的已知幾個(gè)中的一個(gè)
··基于函數(shù)或者說表達(dá)式的索引,這個(gè)功能可謂強(qiáng)大
8、外連接
·MS SQL SERVER 支持兩種形式表間連接
①從Sybase繼承來的形式:
字段1 *= 字段2 (左連接)
字段1 =* 字段2 (右連接)
沒有這種形式的全外連接語法
②標(biāo)準(zhǔn)的外連接語法
left [outer] join on 邏輯表達(dá)式
right [outer] join on 邏輯表達(dá)式
full [outer] join (全外連接) on 邏輯表達(dá)式
這里的邏輯表達(dá)式 可以是很復(fù)雜的表達(dá)式例如 :A.ID=B.ID AND (A.Parebt_ID=1 OR A.Parent_ID=2)
需要提醒大家的是:你寫的查詢語句報(bào)告過這樣的錯(cuò)誤
Joined tables cannot be specified in a query containing outer join operators. Joined tables cannot be specified in a query containing outer join operators. View or function 'dbo.VU_CAF_BILLS' contains joined tables
這句話告訴你,你查詢語句引用的視圖或者子查詢也用到了外連接,但是引用視圖或者子查詢外連接語法與你的外連接語法不一直導(dǎo)致的
例如:select A.[ZONE],A.FLAG,A.FlagDesc,A.CAF_NO
from dbo.VU_CAF_BILLS A,TU_Flag
where A.CAF_NO*=TU_Flag.ObjNo
視圖dbo.VU_CAF_BILLS的外連接語法是標(biāo)準(zhǔn)的SQL語法,而本語句中的外連接語法卻是Sybase式的外連接語法。
·Oracle不支持標(biāo)準(zhǔn)的外連接語法,也沒有全外連接,這是它的缺陷
字段1 = 字段2(+) (左連接)
字段1(+) = 字段2 (右連接)
·使用外連接語句的用處
①不想因?yàn)楸磉B接而使主表數(shù)據(jù)行丟失,這一點(diǎn)毋庸多說
①找某條記錄在A表存在,而在B表不存在,按常規(guī)做法使用not in (select 查詢子句)語法,
使用not in 最大的缺點(diǎn)速度慢,原因是每個(gè)數(shù)據(jù)行都去做:select 查詢子句
而使用下面的語法:
select TU_COMPANY.*
from TU_COMPANY left join TU_Comp_Agent on TU_COMPANY.ID=TU_Comp_Agent.CompCode
where TU_Comp_Agent.Id is null
9、觸發(fā)器
·從我了解到的,MS SQL SERVER,僅有表的觸發(fā)器,而且觸發(fā)時(shí)機(jī)不夠豐富
如插入觸發(fā)在子,不區(qū)分單條插入還是多條插入,也不區(qū)分插入前觸發(fā)還是插入后觸發(fā)
碰到多條數(shù)據(jù)的插入,需要使用游標(biāo)處理每條插入的數(shù)據(jù)
·Oracle提供的觸發(fā)器不僅有基于表的觸發(fā)器,而且其他類型的,例如數(shù)據(jù)庫級(jí)的觸發(fā)器:數(shù)據(jù)庫啟動(dòng)、數(shù)據(jù)庫關(guān)閉
對(duì)于表級(jí)的觸發(fā)器,區(qū)分單條插入還是多條插入,也區(qū)分插入前觸發(fā)還是插入后觸發(fā)
10、表數(shù)據(jù)復(fù)制
·庫內(nèi)數(shù)據(jù)復(fù)制
·MS SQL Server
Insert into 復(fù)制表名稱 select 語句 (復(fù)制表已經(jīng)存在)
select 字段列表 into 復(fù)制表名稱 from 表 (復(fù)制表不存在)
·Oracle
Insert into 復(fù)制表名稱 select 語句 (復(fù)制表已經(jīng)存在)
create table 復(fù)制表名稱 as select 語句 (復(fù)制表不存在)
·文本文件轉(zhuǎn)入、轉(zhuǎn)出的批量處理
·MS SQL Server
BCP命令行程序
·Oracle
SQLLDR命令行程序
11、多表更新、刪除
一條更新語句是不能更新多張表的,除非使用觸發(fā)器隱含更新,我這里說的意思是:根據(jù)其他表數(shù)據(jù)更新你要更新的表
一般形式:
·MS SQL Server
update A
SET 字段1=B表字段表達(dá)式,
字段2=B表字段表達(dá)式
from B
WHERE 邏輯表達(dá)式
·Oracle
update A
SET 字段1=(select 字段表達(dá)式 from B WHERE ...),
字段2=(select 字段表達(dá)式 from B WHERE ...)
WHERE 邏輯表達(dá)式
從以上來看,感覺oracle沒有ms sql好,主要原因:假如A需要多個(gè)字段更新,MS_SQL語句更簡(jiǎn)練
你知道剛學(xué)數(shù)據(jù)庫的人怎么做上面這件事情嗎,他們使用游標(biāo)一條一條的處理
12、關(guān)于存儲(chǔ)過程或函數(shù)中使用的臨時(shí)表,兩者都提供了這個(gè)功能
臨時(shí)表,最主要的好處是,操作不留任何痕跡、不產(chǎn)生日志,
所以速度快
·MS SQL SERVER
CREATE TABLE #表名稱(........) 或者 SELECT 字段表達(dá)式列表 INTO #表名稱 FROM
表名稱前加#即可,這些臨時(shí)表都是只在一個(gè)數(shù)據(jù)庫連接會(huì)話期間有效
·Oracle
create [Global] Temporary Table ,加上[Global]就是全局的臨時(shí)表(所有數(shù)據(jù)庫連接會(huì)話都是可見的),
不則為私有的(在一個(gè)數(shù)據(jù)庫連接會(huì)話期間有效)
13、兩者都提供了自己的桌面版的數(shù)據(jù)庫
·MS SQL SERVER 毋庸我多說了
基本上桌面版的數(shù)據(jù)庫提供的功能跟服務(wù)器版的功能沒多大區(qū)別
缺少的全文搜索服務(wù)功能
·Oracle
Oracle Lite 8,我就看過人家用Oracle lite 8做過海關(guān)報(bào)關(guān)系統(tǒng)
補(bǔ)充:Sybase 提供了桌面版的Sybase SQL anywhere
14、動(dòng)態(tài)執(zhí)行SQL語句
·MS SQL SERVER 7.0好象沒有這個(gè)功能,MS SQL SERVER 2000已經(jīng)這個(gè)功能。
你是不是想在存儲(chǔ)過程的參數(shù)中傳遞一個(gè)表名或者在過程體里動(dòng)態(tài)
生成一個(gè)SQL語句,你會(huì)發(fā)現(xiàn)很難辦到。看了下面的例子:你以前的問題全解決了
declare @count int
declare @SQL nvarchar(200)
set @SQL = N'select count(*) from sysobjects'
exec sp_executesql @SQL,N'@i int output',@count output
·Oracle提供了兩種方法實(shí)現(xiàn)這個(gè)功能
①程序包DBMS_SQL,執(zhí)行一個(gè)語句的過程:
打開游標(biāo)(open_cursor,對(duì)于非查詢語句,無此過程)
分析語句(Parse)
綁定變量(bind_variable)
執(zhí)行語句(execute)
關(guān)閉游標(biāo)(close_cursor,對(duì)于非查詢語句,無此過程)
②execute immediate ls_SQL
15、數(shù)據(jù)庫備份和恢復(fù)
兩者都提供了很強(qiáng)的數(shù)據(jù)庫的備份和恢復(fù)能力,Oracle提供了更多的手段,
Orace宣稱她的數(shù)據(jù)庫是不可摧毀的也不是瞎吹牛
·MS SQL SERVER
①數(shù)據(jù)庫的倒入倒出DTS工具,如果數(shù)據(jù)源和目的都是MS SQL SERVER則可以完全復(fù)制數(shù)庫的結(jié)構(gòu)
(包括表、視圖、索引、觸發(fā)子、規(guī)則、默認(rèn)、存儲(chǔ)過程、用戶定義函數(shù)、表數(shù)據(jù))
②數(shù)據(jù)庫備份和恢復(fù)命令
backup database
restore database
倒出的數(shù)據(jù)文件還可以壓縮的,這一點(diǎn)不同于Sybase
而且這種數(shù)據(jù)庫備份和恢復(fù)的方式可以是增量的和完全的
③數(shù)據(jù)庫的附加Attach
只要數(shù)據(jù)庫的原始數(shù)據(jù)和日志文件沒有損壞,就可以
命令:SP_ATTACH_DB
這種情況,有時(shí)候會(huì)出問題:比方說你鍵了登陸帳號(hào),不是使用缺省的登陸帳號(hào)sa,
由于登陸帳號(hào)的信息存放在master數(shù)據(jù)庫中,所以你使用原來建立的帳號(hào)就登陸不上,
所以要做一些后補(bǔ)工作
·Oracle
①倒出倒入工具exp和imp工具
倒入倒出的參數(shù)何其多
②冷備份或者稱脫機(jī)備份,備份的時(shí)候數(shù)據(jù)庫是停止的
備份所有的數(shù)據(jù)文件、日志文件、控制文件
③熱備份或者聯(lián)機(jī)備份
數(shù)據(jù)庫處在ARCHIVELOG模式,注意缺省情況下都是ARCHIVELOG
恢復(fù)時(shí)可以選擇完全恢復(fù)、時(shí)間點(diǎn)恢復(fù)、SCN點(diǎn)恢復(fù)、用戶自由干預(yù)的CANCEL恢復(fù)
可以說他的熱備份的恢復(fù)功能是非常之強(qiáng)大的
關(guān)鍵字:Oracle、數(shù)據(jù)庫
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗(yàn)證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機(jī)IP講解
- CentOS7使用hostapd實(shí)現(xiàn)無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯(cuò)
- 解決Centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認(rèn)iptable規(guī)則詳解