日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

深度對比Oracle與SQL Server

 Legend_Fish(^_^) 2010-08-24
一般的公司通常會在他們的信息系統(tǒng)架構(gòu)中引入多種數(shù)據(jù)庫平臺,同時引入三到四種不同的RDBMS解決方案的中大型公司也并不少見,當然這些公司里面的DBA們通常也需要同時擁有管理多種不同平臺的技能了。
只在一種平臺上展開工作的數(shù)據(jù)庫專家們也通常會期待著在他們的下一份工作中能學到點不一樣的東西,那些有勇氣的人們則愿意花時間、金錢和精力去學習新的東西,也有其他因為換了新公司或者是為了找新的工作而去學習新的系統(tǒng)的人們,毋庸置疑的一點就是公司老板和人力專家們會更加青睞于那些擁有多個領(lǐng)域經(jīng)驗的求職者。
依我個人的經(jīng)驗來看,在學習一個新的數(shù)據(jù)平臺的時候,最好的方法就是在新的環(huán)境中去發(fā)現(xiàn)那些你已知的東西,這樣學習起來會簡單很多。當然,當中也會遇到一些全新的概念需要去學習,或者是忘掉一些你現(xiàn)在已知的概念,但不管怎么說你不是從零開始的。比如說一個做SQL Server開發(fā)人員在要寫Oracle存儲過程的時候可能會先去找那些內(nèi)置的函數(shù)然后比較它們之間不同點,她也可能會去比較變量聲明以及錯誤處理的異同。
本系列文章中我將嘗試對Microsoft SQL Server和Oracle RDBMS(以10g及以后的版本為主)進行一個深入的比較。我會主要集中于這兩種數(shù)據(jù)庫之間架構(gòu)上的比較,當然不要期望我會給你一個詳盡的比較清單,但是我會盡我所能的讓你看清這兩種當今世上應(yīng)用最廣的數(shù)據(jù)庫之間的相同和相異之處。本文是以一個SQL Server DBA的角度去構(gòu)思和寫作的,不過相信這對Oracle專家門了解SQL Server這一面也是很有參考價值的。
廢話少說,開工吧。

top操作系統(tǒng)的支持
Microsoft SQL Server向來都從屬于Windows大家族中的一員,要讓Microsoft發(fā)布一個支持其它操作系統(tǒng)版本的可能性當然是小之又小的了。當前來說SQL Server可以在XP、Vista、Windows Server 2000、2003、2008上運行,同時也有針對于32位和64位版本W(wǎng)indows的數(shù)據(jù)庫版本。
對Oracle來說,它支持多種不同的操作系統(tǒng)平臺,包括Windows(32位和64位),另外還有支持Linux和不同分支的Unix(Solaris、HP-UX、AIX等等)

top版本和發(fā)行版
在本寫作時,Microsoft數(shù)據(jù)庫產(chǎn)品的最新版本是SQL Server 2008,即將推出的下一版本是SQL Server 2008 R2,現(xiàn)在已經(jīng)在CTP階段了,它的上一個版本,SQL Server 2005,相對于再之前的SQL Server 2000的一個大升級。不過對很多公司來說SQL Server 2005還是有點新,因為他們現(xiàn)在還是在大量的使用著SQL Server 2000.
另一方面Oracle一路走來最新版本已經(jīng)到了11gR2了,現(xiàn)在主流應(yīng)用的版本10gR2已經(jīng)發(fā)行有一段時間,已經(jīng)是公認的領(lǐng)頭羊了。Oracle在10g中第一次提出“網(wǎng)格計算”的概念。當然現(xiàn)在還有公司依然在依賴于Oracle 9i處理業(yè)務(wù)。
說到發(fā)行版,SQL Server 2008 R2現(xiàn)在提供下面這么些版本:
企業(yè)版
企業(yè)版包含所有的高級特性,適用于大規(guī)模、高容量的數(shù)據(jù)庫需求。
標準版
標準版為那些不需要包含企業(yè)版高級特性的公司提供了一個相對便宜的數(shù)據(jù)庫平臺,大部分公司使用的都是標準版的數(shù)據(jù)庫。
工作組版
工作組版適用于小的部門級別的應(yīng)用。
Web版
這個適用于作為Web應(yīng)用的低成本的后臺解決方案。
Express版
這是一個很小的內(nèi)嵌式的SQL Server引擎,通常用于本地數(shù)據(jù)存儲或是小規(guī)模的系統(tǒng)開發(fā)。Express版可以免費下載并且自由分發(fā)。
Compact版
Compact版可以讓用戶開發(fā)Windows桌面或者是手持設(shè)備的應(yīng)用。
開發(fā)版
所有企業(yè)版所擁有的功能開發(fā)版都有,不過它僅僅授權(quán)單個用戶訪問,主要用于開發(fā)或是測試目的。
除了企業(yè)版,SQL Server 2008 R2還為數(shù)據(jù)中心和數(shù)據(jù)倉庫提供兩個“白金版”,這兩個版本分別稱為數(shù)據(jù)中心版(Datacenter Edition)和并行數(shù)據(jù)倉庫版(Parallel Data Warehouse Edition)。
對于Oracle 11g R2,發(fā)行版是這么樣的:
企業(yè)版
這個版本提供了頂級的性能,同時價錢也是頂級的。像SQL Server的企業(yè)版一樣,所有這個產(chǎn)品能提供的特性在這個版本里面都有。
標準版
這個和SQL Server標準版很像,Oracle標準版包含了大部分業(yè)務(wù)應(yīng)用所需要的大部分特性。
標準版1
這個版本為小型工作組應(yīng)用而設(shè)計,授權(quán)最小的用戶為5。
Express版
這個目標客戶是小規(guī)模應(yīng)用或者是數(shù)據(jù)庫開發(fā)入門,可以免費分發(fā)?,F(xiàn)在Express版還處于10g R2版本。
下表提供了SQL Server和Oracle數(shù)據(jù)庫發(fā)行版的直觀的對比:
SQL Server Oracle
Enterprise Edition Enterprise Edition
Standard Edition Standard Edition
Workgroup Edition Standard Edition One
Express edition Express Edition
Web Edition X
Compact Edition X
Developer Edition Enterprise Edition

top實例、數(shù)據(jù)庫和表空間
SQL Server和Oracle之間第一個架構(gòu)級別的差異就在于對實例(instance)和數(shù)據(jù)庫(database)概念的定義了。
SQL Server中,實例一詞用來代表一個包含了操作系統(tǒng)文件、內(nèi)存結(jié)構(gòu)、后臺進程以及注冊表信息的獨立的應(yīng)用服務(wù)。在Windows系統(tǒng)中用一個存在著停止和運行狀態(tài)的服務(wù)來代表一個實例,當處于運行狀態(tài)時,實例要占用一定的服務(wù)器內(nèi)存以及生成一定數(shù)量的后臺進程。
SQL Server實例的中心是數(shù)據(jù)庫。一個SQL Server數(shù)據(jù)庫指的是一個資料庫以及操作數(shù)據(jù)所需要的程序代碼,當實例沒有運行時,實例中的數(shù)據(jù)庫就不能夠訪問。
SQL Server有兩種數(shù)據(jù)庫:系統(tǒng)數(shù)據(jù)庫(system databases)和用戶數(shù)據(jù)庫(user databases)。在一個SQL Server實例安裝完成之后,將會自動創(chuàng)建5個系統(tǒng)數(shù)據(jù)庫:master, model, msdb, tempdb和resource。如果一個機器上面安裝了多個SQL Server實例時,沒有實例都會有自己單獨的一套系統(tǒng)數(shù)據(jù)庫。除了msdb數(shù)據(jù)庫之外,其它數(shù)據(jù)庫不能訪問或是被損壞都會導致實例無法啟動。相比之下用戶數(shù)據(jù)庫由DBA或者是開發(fā)人員在數(shù)據(jù)庫實例安裝完畢、系統(tǒng)數(shù)據(jù)庫都啟動之后所創(chuàng)建的,這些數(shù)據(jù)庫中保存著公司的業(yè)務(wù)資料。
簡而言之,一個SQL Server實例總是要包含一些數(shù)據(jù)庫(盡管有時只是那些系統(tǒng)數(shù)據(jù)庫),一個數(shù)據(jù)庫也總是要有一個(且僅有一個)與之關(guān)聯(lián)的實例。
從物理角度說,一個SQL Server數(shù)據(jù)庫表現(xiàn)為存儲于磁盤上面的一組操作系統(tǒng)文件的集合。數(shù)據(jù)庫文件分為兩種:數(shù)據(jù)文件(data file)和事務(wù)日志文件(transaction log file)。一個數(shù)據(jù)庫至少要包含一個數(shù)據(jù)文件和一個事務(wù)日志文件,SQL Server數(shù)據(jù)庫的資料主要是存在于數(shù)據(jù)文件中,事務(wù)日志文件用來記錄發(fā)生在這些數(shù)據(jù)上面的變更記錄,SQL Server在執(zhí)行系統(tǒng)恢復的時候要用到它。一個數(shù)據(jù)文件或事務(wù)日志文件只能隸屬于一個特定的數(shù)據(jù)庫,不存在兩個數(shù)據(jù)庫共用一個數(shù)據(jù)文件或者是日志文件的情況。一個數(shù)據(jù)量很大的數(shù)據(jù)庫可以使用多個數(shù)據(jù)文件,這些數(shù)據(jù)文件能夠被邏輯的組合成一個稱為文件組(file group)的邏輯組。
在Oracle中,這一切看起來都有點反著來了。當Oracle啟動時,它和SQL Server一樣要先占用一些服務(wù)器內(nèi)存用于執(zhí)行操作,這個內(nèi)存區(qū)域——著名的SGA(System Global Area)——被分為數(shù)個不同的結(jié)構(gòu),在創(chuàng)建SGA的同時也會啟動一系列的后臺進程用于和SGA進行交互,在這里這些分配的內(nèi)存空間和后臺進程組合起來就是Oracle實例了。請注意現(xiàn)在我們沒有見到數(shù)據(jù)庫的影子還,實際上Oracle實例在沒有數(shù)據(jù)庫或是數(shù)據(jù)庫不能訪問時也是跑的很好的,在安裝Oracle時,我們可以選擇只安裝軟件,完了之后再安裝數(shù)據(jù)庫。
Oracle中的數(shù)據(jù)包含了一組操作系統(tǒng)文件。不像SQL Server數(shù)據(jù)庫,Oracle數(shù)據(jù)庫并不能代表數(shù)據(jù)庫對象的邏輯分組,它更像是表示包含多個存在于磁盤上的用來保存數(shù)據(jù)的文件的一個單個的集合名詞。
組成Oracle數(shù)據(jù)庫的文件可以分成三個類型:數(shù)據(jù)文件(data file)、重做日志文件(redo log file)和控制文件(control file)。數(shù)據(jù)文件保存數(shù)據(jù),Oracle中可以存在任意數(shù)量的數(shù)據(jù)文件;重做日志文件跟SQL Server的事務(wù)日志文件一樣用來保存對數(shù)據(jù)更改的記錄,在系統(tǒng)恢復階段需要用到;控制文件是一些特別的小文件,用來保存一些至關(guān)重要的關(guān)于數(shù)據(jù)庫的信息,沒有這個文件的話,實例就無法打開數(shù)據(jù)庫。
除了數(shù)據(jù)文件、重做日志文件、控制文件之外,數(shù)據(jù)庫還包含參數(shù)文件(parameter file)、密碼文件(password file)和可選的歸檔日志文件(archive log files),后面很快會對這些文件類型展開討論。
Oracle系統(tǒng)啟動時,首先在內(nèi)存中創(chuàng)建數(shù)據(jù)庫實例,然后由實例找到保存在磁盤中的數(shù)據(jù)庫,最后打開數(shù)據(jù)庫讓用戶操作。當系統(tǒng)關(guān)閉時,實例會從內(nèi)存中清除掉:整個內(nèi)存結(jié)構(gòu)和后臺進程都會消失,但是數(shù)據(jù)庫依然存在于磁盤上,只是處于關(guān)閉的狀態(tài)。之前也說過,Oracle實例可以在不打開數(shù)據(jù)庫的情況下運行——這是與SQL Server數(shù)據(jù)庫最大的不同,SQL Server實例是不能夠離開系統(tǒng)數(shù)據(jù)庫而運行的。不過和SQL Server一樣Oracle數(shù)據(jù)庫在實例沒有啟動的情況下也是不能訪問的。
一般來說Oracle實例和數(shù)據(jù)庫之間是一對一的關(guān)系。一個實例對應(yīng)著一個數(shù)據(jù)庫,但是一個數(shù)據(jù)庫卻可以同時由多個實例去訪問它。一個獨立的Oracle安裝包含一個實例和一個供實例操作的數(shù)據(jù)庫,而配置成RAC(Real Application Cluster)的安裝則可以允許多個存在于不同機器上的實例訪問存在于一個共享磁盤上面的數(shù)據(jù)庫。
那Oracle中數(shù)據(jù)庫對象的邏輯分組在那兒呢?在SQL Server中邏輯分組由數(shù)據(jù)庫自己來完成,而在Oracle中,這項工作由表空間(tablespace)完成,Oracle表空間是用來對表、視圖、索引和其他數(shù)據(jù)庫對象進行分組的邏輯結(jié)構(gòu)。例如,你的Oracle產(chǎn)品庫可以給HR應(yīng)用一個單獨的表空間,支付應(yīng)用則使用另外一個。一個數(shù)據(jù)庫可以邏輯的分成若干個表空間,這些表空間在物理上則由一個或者多個數(shù)據(jù)文件組成。因此在Oracle中與SQL Server數(shù)據(jù)庫等價的是表空間。
由于這兩種結(jié)構(gòu)在功能上相當類似,在SQL Server中建立數(shù)據(jù)庫的過程和在Oracle中建立表空間的過程也非常相似。不管是建立數(shù)據(jù)庫還是表空間,DBA都要首先指定一個名字,然后給新建的數(shù)據(jù)庫或者表空間分配一個或多個數(shù)據(jù)文件,并為每個數(shù)據(jù)文件指定初始大小和數(shù)據(jù)增長情況。
在SQL Server中可以做到讓一個用戶數(shù)據(jù)庫離線或是只讀,Oracle的用戶表空間也一樣可以。在SQL Server中可以讓一個用戶數(shù)據(jù)庫中的一個或者多個數(shù)據(jù)文件只讀,而Oracle用戶表空間中的一個或者多個數(shù)據(jù)文件也同樣能標記為離線。
不過數(shù)據(jù)庫和表空間在某些方面還是有差別的:
SQL Server中,數(shù)據(jù)文件可以用文件組邏輯的進行分組,而Oracle表空間就沒有類似的概念。
SQL Server的每個數(shù)據(jù)庫都有自己的事務(wù)日志文件,而且在創(chuàng)建數(shù)據(jù)庫的時候就要指定這些日志文件的屬性。而在Oracle中整個數(shù)據(jù)庫(意為所有的表空間)的事務(wù)日志都是記錄在同樣的一樣重做日志中,因此也不存在說給每個表空間建立一個單獨的日志文件的說法。
SQL Server中,數(shù)據(jù)庫可以設(shè)置成簡單恢復模式(simple recovery mode),簡單恢復模式指的是活動的數(shù)據(jù)庫日志在checkpoint操作完成之后就會截斷。Oracle也有類似的概念,這個稍后會說到,不過不能在表空間級別上進行這樣的設(shè)置。
top實例名和SID
SQL Server和Oracle都允許在同一個機器上面同時運行多個實例,多個實例的執(zhí)行環(huán)境是完全獨立的:就單個的數(shù)據(jù)庫引擎而言,它并不知道也不關(guān)心有沒有其他的實例在這個機器上運行著。
在SQL Server中這種機制通過實例這個概念來實現(xiàn),SQL Server可以作為一個命名的(named) 或是 默認(default) 的實例來運行,默認實例的名字和運行它的Windows服務(wù)器的名字一樣,顯然一個系統(tǒng)的默認實例只可能存在一個,不過在一個機器上可以存在多個命名的實例,命令實例的名字格式為 HOSTNAME\INSTANCE_NAME ,同一個主機上每個運行實例的 INSTANCE_NAME 必須是唯一的,每個實例都有著自己的一套程序文件以及一些與其它實例共享的通用組件。
而Oracle也差不多,在安裝Oracle的時候,DBA就需要指定一個 全局數(shù)據(jù)庫名(Global Database Name)和系統(tǒng)標識符(SID, System Identifier)。Oracle中實例和數(shù)據(jù)庫是完全不同的東西,一個全局數(shù)據(jù)庫名用來在網(wǎng)絡(luò)上唯一的識別一個數(shù)據(jù)庫的存放位置,一個完整的名字通常是下面的格式database_name.network_domain_name。SID則是用來識別一個與數(shù)據(jù)庫關(guān)聯(lián)的實例,大都數(shù)情況下一個實例關(guān)聯(lián)一個單個的數(shù)據(jù)庫,數(shù)據(jù)庫名和SID名字會是一樣。RAC環(huán)境中就不一樣了,RAC允許多個實例訪問放在共享存儲中的同一個數(shù)據(jù)庫,此時的實例名和數(shù)據(jù)庫名字將不一樣。當然和SQL Server一樣,一個Oracle數(shù)據(jù)庫服務(wù)器上面是不允許兩個實例使用同一個SID的,另外一點類似的就是在安裝時一旦指定,不管是SQL Server實例名還是Oracle SID都是不能再修改了(譯注:實際上Oracle從9i開始就提供一個叫nid的工具用來修改數(shù)據(jù)庫名了)。
SQL Server DBA可以通過下面的語句查詢當前登錄系統(tǒng)的實例名:
1 SELECT @@SERVERNAME
Oracle DBA用來查詢實例名和數(shù)據(jù)名的語句如下:
 
1 SELECT INSTANCE_NAME, HOST_NAME, VERSION, DATABASE_STATUS FROM V$INSTANCE; 
2 SELECT NAME, DATABASE_ROLE, CREATED FROM V$DATABASE;

top系統(tǒng)數(shù)據(jù)庫和系統(tǒng)表空間
一個SQL Server實例需要有5個系統(tǒng)數(shù)據(jù)庫(2005之前的是4個):master, model, msdb, tempdb和resource,一個Oracle數(shù)據(jù)庫則最少需要3個系統(tǒng)表空間才能正常操作,它們是:SYSTEM, SYSAUX和TEMP。
master和resource數(shù)據(jù)庫集中保存了SQL Server自身管理所需要的所有信息,里面保存了諸如系統(tǒng)配置,數(shù)據(jù)庫列表和文件路徑、終結(jié)點、連接服務(wù)器和用戶帳戶(或“登錄”信息),系統(tǒng)級別的對象存儲在只讀的數(shù)據(jù)庫”資源(resource)”中。
在Oracle中,SYSTEM表空間等價于master數(shù)據(jù)庫,SYSTEM表空間包含了數(shù)據(jù)字典(data dictionary),也就是關(guān)于Oracle自身的元數(shù)據(jù)(metadata),這里的數(shù)據(jù)字典可以和SQL Server中的resource數(shù)據(jù)庫進行類比。到這里你也許猜到了:如果SYSTEM不存在或是損壞了的話Oracle數(shù)據(jù)庫是打不開的。
對于一個SQL Server實例,model數(shù)據(jù)庫用作這個實例中所有新建的數(shù)據(jù)庫的“模板”,對model數(shù)據(jù)庫的任何修改都會反應(yīng)到之后新建的其它數(shù)據(jù)庫里面。在Oracle中就沒有這樣的模板,不過在你新建一個表空間的時候,你可以指定這是一個永久的表空間或者是其他類似TEMP和UNDO一樣的表空間,永久表空間才是用來保存用戶數(shù)據(jù)的。
SQL Server的tempdb用作整個實例的“試驗田”,每次實例重新啟動的時候tempdb都會重新創(chuàng)建。Oracle的TEMP表空間的作用類似:用來包括大的排序操作的中間結(jié)果。當然SQL Server的tempdb還能用來保存行版本(row versioning)所需要的信息,當行版本啟用后,行版本特性可以保證數(shù)據(jù)庫引擎能將數(shù)據(jù)行的每次的修改記錄保留下來,修改之前的行會保存在tempdb里面的版本庫中,一般查詢會返回一個數(shù)據(jù)行上最后提交的版本,當一個使用了特定隔離級別的依賴行版本的讀操作不再會阻塞其它修改同樣數(shù)據(jù)的事務(wù),這是因為讀操作不會在數(shù)據(jù)行上使用共享鎖。不過這個特性需要在單個數(shù)據(jù)庫上單獨啟用。
Oracle中使用一個單獨的表空間——著名的UNDO表空間——來達成同樣目的。UNDO表空間保存著被DML語句修改的數(shù)據(jù)塊的讀一致性的副本。當用戶開始對數(shù)據(jù)進行修改的時候,修改之前的數(shù)據(jù)塊會被保存到UNDO表空間中,當另外一個用戶需要查詢這些數(shù)據(jù)的時候,他取到的實際上是UNDO表空間中查出來的讀一致性的版本。不像SQL Server的行版本,Oracle的UNDO不需要啟用——因為它是屬于Oracle并行訪問機制的一部分。
最后一個要介紹的SQL Server中的msdb數(shù)據(jù)庫,SQL Server代理服務(wù)需要操作這個庫。SQL Server代理負責計劃任務(wù)、警告、復制、日志傳送以及其它的很多東西,代理服務(wù)的正常運行離不開msdb數(shù)據(jù)庫。
在Oracle沒有明確與mdsb數(shù)據(jù)對應(yīng)的東西。SYSAUX表空間也是一個系統(tǒng)表空間,在安裝過程中(譯注:準確說應(yīng)該為“數(shù)據(jù)庫創(chuàng)建過程中”)創(chuàng)建,它里面保存了諸如Oracle AWR(Automatic Workload Repository)信息、多維數(shù)據(jù)和多媒體數(shù)據(jù),XML數(shù)據(jù)庫等等。
v數(shù)據(jù)庫實例結(jié)構(gòu)
當Oracle實例啟動之后,所看到的就是在服務(wù)器內(nèi)存上的一個個不同內(nèi)存塊加上產(chǎn)生的與這些內(nèi)存交互的后臺進程。Oracle文檔將這些內(nèi)存結(jié)構(gòu)和進程收的很詳細。
由Oracle實例所占用的內(nèi)存塊成為SGA(System Global Area),它的大小可以通過調(diào)整Oracle初始化參數(shù)(initialisation parameter)進行修改,在SGA里邊至少會創(chuàng)建3個不同的區(qū)域,它們分別是:
數(shù)據(jù)塊緩存區(qū)(Database Buffer Cache)
這里緩存的是數(shù)據(jù)塊。和SQL Server一樣,用戶不會直接的訪問數(shù)據(jù)文件上的數(shù)據(jù):當讀取數(shù)據(jù)時,相關(guān)的數(shù)據(jù)塊會從數(shù)據(jù)文件中拷貝到內(nèi)存中;修改數(shù)據(jù)時也是修改內(nèi)存中的數(shù)據(jù),然后再由單獨的進程將數(shù)據(jù)緩存區(qū)中被修改的數(shù)據(jù)寫入到數(shù)據(jù)庫中。
重做日志緩存(Redo Log Buffer)
SGA中的這個區(qū)域連續(xù)的記錄著數(shù)據(jù)緩存區(qū)數(shù)據(jù)修改的記錄,重做日志緩存中的內(nèi)容會被寫入到在線日志文件中去。
共享池(Shared Pool)
SGA中有一大塊的內(nèi)存用作共享池,共享池等價于SQL Server中的執(zhí)行緩存(Procedure Cache)。它的主要作用就是緩存數(shù)據(jù)庫中最近執(zhí)行過的SQL語句。共享池由下面的模塊組成:
數(shù)據(jù)字典緩存(Dictionary Cache)
數(shù)據(jù)字典緩存緩存了Oracle最近使用的數(shù)據(jù)字典信息。
庫緩存(Library Cache)
這個區(qū)域包含了最近執(zhí)行的SQL和PL/SQL語句和對應(yīng)的執(zhí)行計劃。SQL區(qū)還能進一步分成共享區(qū)和私有區(qū):共享SQL區(qū)保存的語句可以由多個用戶使用而私有區(qū)保存的則是跟各個連接對應(yīng)的綁定變量的信息。PL/SQL是Oracle對于行業(yè)標準SQL的程序擴展,當PL/SQL程序執(zhí)行時,它的代碼會拷貝到庫緩存中的共享PL/SQL區(qū)中。除了緩存執(zhí)行代碼和執(zhí)行計劃外,庫緩存還包含鎖、閥以及字符集等信息。
根據(jù)你所使用的組件的不一樣,Oracle的SGA中也可能存在其它一些可選的內(nèi)存區(qū)域。在Oracle中使用Java應(yīng)用時要使用到Java池(Java Pool),Oracle內(nèi)置的備份恢復工具RMAN(Recovery Manager)要用到大池(Large Pool),當使用Oracle高級隊列機制時要用到流池(Steams Pool)。
上面介紹的各個內(nèi)存區(qū)域都是屬于SGA的一部分,它們是通過一序列的進程(process)來和數(shù)據(jù)庫進行交互。下面就開始介紹包括用戶進程和服務(wù)器進程在內(nèi)的Oracle進程了。
當用戶或者是應(yīng)用連接到Oracle數(shù)據(jù)庫時就會產(chǎn)生一個用戶進程(user process)。在一個兩層的系統(tǒng)架構(gòu)中,用戶進程存在于客戶端機器上;而在一個三層的系統(tǒng)架構(gòu)中,用戶進程由中間層產(chǎn)生。一旦用戶進程連接到Oracle監(jiān)聽服務(wù)(Listener Service)時,監(jiān)聽器就會為這個用戶會話產(chǎn)生一個服務(wù)器進程(server process)。再說詳細點就是,Oracle監(jiān)聽器是一個負責為Oracle處理近來連接的網(wǎng)絡(luò)組件,監(jiān)聽器本身是一個單獨的進程,負責監(jiān)視著從客戶端過來的連接請求,如果監(jiān)聽器沒有運行的話,數(shù)據(jù)庫也就無法連接了。一旦連接建立,由監(jiān)聽器產(chǎn)生的服務(wù)器進程就開始接手處理用戶操作數(shù)據(jù)庫的請求了。大多情況下每個用戶連接會產(chǎn)生一個獨立的服務(wù)器進程,不過Oracle也能配置成一個運行著多個預先創(chuàng)建好的服務(wù)器進程池的模式,此時用戶進程連接到數(shù)據(jù)庫實例之后將會直接從進程池中分配一個進程。
任何時候Oracle實例中都會有多個后臺進程在運行著,不過,有5個必須要有的。
寫數(shù)據(jù)庫(Database Writer)進程或稱DBWn負責將數(shù)據(jù)緩存區(qū)中被修改的數(shù)據(jù)庫寫入到數(shù)據(jù)文件中。為提高系統(tǒng)系能Oracle可以最多創(chuàng)建20個這樣的進程,DBWn中的n代表著一個單獨的進程:n取值范圍是0到9和a到j(luò)。
在DBWn進程將臟塊寫入到數(shù)據(jù)文件的同時,一個叫日志寫入(Log Writer, LGWR)的進程也在降日志緩存中的日志寫入到在線日志中去。LGWR執(zhí)行的要比DBWn進程頻繁得多,主要原因有兩點:首先是要盡快的將事務(wù)信息寫入到磁盤當中,以保證當意外宕機等事件發(fā)生時數(shù)據(jù)庫能正?;謴?,在一個就是日志緩存中的日志信息記錄的不是實際的變化的數(shù)據(jù),但是卻是能夠反應(yīng)數(shù)據(jù)的變化——因此相比之下也就要小得多了。
檢查點(Checkpoint, CKPT)進程負責定期的將SGA中的內(nèi)容同步到數(shù)據(jù)庫中。當執(zhí)行檢查點時,它會調(diào)用DBWn進程將所有的臟塊寫入到數(shù)據(jù)文件中,同時將重做日志緩存中的內(nèi)容寫入到在線日志文件中,然后更新數(shù)據(jù)文件頭和控制文件的相關(guān)信息。
如果某個訪問數(shù)據(jù)庫的進程意外的死掉的話,那進程監(jiān)視器(Process Monitor, PMON)就會在后臺悄悄的清理掉這個死掉的進程,所進行的操作包括釋放相應(yīng)的鎖、回收分配的資源已經(jīng)將這個進程從活動進程中清理出去。PMON進程有點像一個UNIX的daemon進程:它會定期的喚醒以檢查看是否有清理工作要做。在必要的時候也能啟動一個別的進程或被其他的后臺進程使喚。
在一個實例崩潰之后重啟時,Oracle會自動的調(diào)用系統(tǒng)監(jiān)視器(System Monitor, SMON)進程,SMON會利用在線日志文件來完成崩潰恢復操作。
歸檔進程(Archiver, ARCn)是Oracle實例中可選的幾種進程之一,這里的n和之前說的一樣都是代表著單個的進程。只有在數(shù)據(jù)庫開啟了歸檔模式(archive log mode)之后才會啟動ARCn進程,在在線日志中的內(nèi)容滿了之后,在Oracle覆蓋這些記錄之前ARCn進程會將這些內(nèi)存保存到磁盤上,這些文件稱為歸檔日志(archive log),這樣的話在線日志內(nèi)容就不會丟掉了。
下圖顯示的是Oracle實例結(jié)構(gòu)的一個簡化版。
 
最后,你可以通過下面語句來查看SGA各個組件的情況:
1 SELECT * FROM V$SGAINFO
 
下面的命令用來查看分配給Oracle實例的總內(nèi)存數(shù):
1 SHOW PARAMETER SGA_MAX_SIZE;
要查看一個實例上運行的Oracle進程情況可以使用下面的語句:
1 SELECT NAME, DESCRIPTION FROM V$BGPROCESS ORDER BY NAME
 
在一個運行著的Microsoft SQL Server實例上,同樣維護者一些內(nèi)部的內(nèi)存結(jié)構(gòu)和后臺進程,不過不像Oracle那樣,SQL Server并沒有公開的詳細解釋內(nèi)部工作和架構(gòu)的文檔。
自2005版以后,SQL Server引入了一個叫SQLOS(SQL Operating System)的東西,不過跟名字所顯示的不一樣的是,這個東西既不是一個操作系統(tǒng),也不是對于OS API的一個封裝。它并不是一個通向非Windows平臺的橋梁或是一個用于框架開發(fā)的類庫。
SQLOS是一套用于通過優(yōu)化與Windows系統(tǒng)接口而為SQL Server存儲和數(shù)據(jù)庫引擎提供關(guān)鍵服務(wù)的軟件,Windows是一個通用的OS:它并沒有為SQL Server而做特別的優(yōu)化。SQLOS則擔當替代Windows而為SQL Server和管理核心系統(tǒng)服務(wù)的,SQLOS提供的服務(wù)包括:
內(nèi)存管理
資源管理
檢測和管理死鎖
異常處理
CLR組件托管
包括專用管理連接(Dedicated Administrator Connection, DAC)和動態(tài)管理視圖(Dynamic Management Views, DMV)在內(nèi)的診斷功能
調(diào)度管理(馬上開講)
Windows下的應(yīng)用程序都是運行在獨立的、受保護的內(nèi)存空間上,這些內(nèi)存空間被稱為虛擬地址空間(Virtual Address Spaces, VAS)。因為每個應(yīng)用的VAS都是不一樣的,因此一個應(yīng)用是不能往另外一個應(yīng)用的地址空間做寫入操作的,這樣保證了程序不會因為嚴重的違規(guī)訪問而崩潰。分配給應(yīng)用的VAS可能來自于物理內(nèi)存或者是頁面文件,又或者是兩者都有。頁面文件(paging file)又稱交換文件(swap file)是一個被Windows內(nèi)存管理器用來存放那些無法放進物理內(nèi)存的數(shù)據(jù)的,這些數(shù)據(jù)被寫入到交換文件中,在應(yīng)用需要的時候被讀取出來。當中所涉及到的虛擬內(nèi)存地址與物理內(nèi)存地址之間的轉(zhuǎn)換(在RAM和頁面文件中)時由Windows內(nèi)存管理器完成。從應(yīng)用的角度來說,它并不關(guān)心它的內(nèi)存究竟是存在什么地方的。對32位的Windows系統(tǒng),OS所能尋址的最大的VAS地址空間是4GB,默認情況下這當中的2G供操作系統(tǒng)內(nèi)核使用,剩下的2G提供給像SQL Server之類的應(yīng)用使用。不過通過修改boot.ini中的開關(guān)(3G開關(guān))設(shè)置可以讓Windows只給自己分配1G而剩下3G給應(yīng)用使用。要想在32位的機器上使用超過4GB內(nèi)存的話,SQL Server可以通過地址窗口化擴展插件(Adress Windowing Extension, AWE)機制利用超出限制的內(nèi)存。在64位的系統(tǒng)上面Windows的內(nèi)存尋址通常就不是個問題了,因為此時的Windows可尋址的VAS空間達16TB。
作為同樣是Windows應(yīng)用的SQL Server,自然也是無法獨立于VAS規(guī)則之外的了。當SQL Server啟動之后,數(shù)據(jù)庫引擎就只能看到自己的VAS空間,緩存池(buffer pool)也就放在這個空間里面。緩存池緩存的是SQL Server數(shù)據(jù):它由8KB大小緩存組成,緩存了來自數(shù)據(jù)文件的數(shù)據(jù)頁,這個類似于Oracle的數(shù)據(jù)塊緩存區(qū)。在VAS中的數(shù)據(jù)庫引擎由SQLSERVER.EXE程序,各個DLL庫以及線程結(jié)構(gòu)組成。
緩存池的大小受限于兩個組件:機器可用的物理內(nèi)存和SQL能訪問的VAS。為避免緩存池無限擴展最終會吃掉所有的VAS而導致SQL Server意外死掉,SQL Server會讓緩存池留下一部分VAS內(nèi)存作為“保留區(qū)”。另外SQLOS內(nèi)存管理器還保證緩存池可以滿足其他SQL Server內(nèi)部組件需要:緩存池中的內(nèi)存頁可以用來緩存連接數(shù)據(jù)、SQL優(yōu)化器數(shù)據(jù)、還要做最重要的執(zhí)行緩存之用。因為分配給這些組件的內(nèi)存是不能再用作存儲數(shù)據(jù)了,因此這些頁又叫做被盜用頁(stolen pages)。
下圖簡要的展示了SQL Server VAS的各個組件。
 
前面提到的資源監(jiān)視器(resource monitor)屬于SQLOS的一個組件。資源監(jiān)視器的工作之一就是檢查和監(jiān)聽操作系統(tǒng)發(fā)出的低內(nèi)存通知,當資源監(jiān)視器檢測到低內(nèi)存情況時,它會將這一情況記錄到一個稱為環(huán)緩沖區(qū)(Ring Buffer)的結(jié)構(gòu)中,然后再將這個信息廣播給SQL Server引擎,這樣所有SQL相關(guān)的組件接到廣播之后能減少它們的內(nèi)存使用。SQLOS的內(nèi)存管理器(Memory Manager)組件也同樣會監(jiān)視可用的虛擬內(nèi)存和物理內(nèi)存以及通過一個叫內(nèi)存專員(memory clerk)的通知機制對內(nèi)存壓力做出響應(yīng)。
在涉及到任務(wù)執(zhí)行(查詢編譯、執(zhí)行等等)的時候,SQLOS使用到一個叫做調(diào)度器的機制。調(diào)度器(scheduler)可以看成是SQL Server對于每個單個CPU的抽象表示,舉個例子來說,一個運行SQL Server的機器有2顆4核的CPU的話那就能看到8個調(diào)度器。每個調(diào)度器都會和一定數(shù)量的工作線程(worker thread)相關(guān)聯(lián)。例如在數(shù)據(jù)庫上面執(zhí)行的一個查詢?nèi)蝿?wù),這個任務(wù)會被分割成解析、編譯、生成執(zhí)行計劃等一序列的子任務(wù),每個這樣的子任務(wù)都會由不同的線程來執(zhí)行。
當SQL Server啟動的時候,只會啟動有限數(shù)量的線程。線程的總數(shù)取決于運行SQL Server的機器的CPU數(shù)量以及架構(gòu)(x86還是x64)。一個少于4個CPU的x86系統(tǒng),所創(chuàng)建的線程數(shù)量為256;超過4個CPU之后每個增加的CPU會多創(chuàng)建8個線程。對于少于4個CPU的x64系統(tǒng),初始線程數(shù)量為512;超過4個CPU之后每個增加的CPU會多創(chuàng)建16個線程。也就是說機器的CPU越強大,SQL Server創(chuàng)建的線程就會越多。
當用戶連接到SQL Server系統(tǒng)執(zhí)行任務(wù)時,每個任務(wù)都會被分配給一個調(diào)度器。在SQL Server 2005之前,任務(wù)是按照輪流的方式分配的。自SQL Server 2005開始,任務(wù)分配則由SQLOS執(zhí)行:任務(wù)會分配給最閑的調(diào)度器。
和Oracle一樣,在SQL Server也是可以查看那些運行中的后臺進程的。只要在數(shù)據(jù)庫實例上執(zhí)行sp_who2命令就可以看到那些后臺運行的進程了。
 
當中的CHECKPOINT進程看名字就知道什么意思了。LOG WRITER進程等價于Oracle的LGWR進程:它負責將數(shù)據(jù)庫的變化寫到事務(wù)日志中。LAZY WRITER進程等價于Oracle的DBWn進程:它的任務(wù)是將數(shù)據(jù)頁的更改從緩存池中寫入到數(shù)據(jù)文件中。有一點和Oracle不同的時候,在這里只有一個lazy writer進程負責寫數(shù)據(jù)文件。其它還有一些后臺進程是和SQLOS關(guān)聯(lián)的:scheduler monitor,deadlock monitor和resource monitor等等。

top事務(wù)一致性(Transactional Consistency)和基于時間點的恢復(Point-in-time Recovery)
Microsoft SQL Server和Oracle一樣內(nèi)置都有針對于事務(wù)的保護機制。事務(wù)一致性的基本思想就是對于數(shù)據(jù)的更改不會馬上反映到磁盤的文件當中,實際上這兩者更新的都是被稱為數(shù)據(jù)緩沖區(qū)(buffer cache)的內(nèi)存區(qū),同時還在一個稱為日志緩存(log buffer)的內(nèi)存中連續(xù)的記錄對于數(shù)據(jù)所做的更改,這些內(nèi)存區(qū)域的內(nèi)容被不斷的寫入到磁盤文件當中。用于將數(shù)據(jù)緩存區(qū)和日志緩存區(qū)中的內(nèi)容寫入到磁盤文件當中的進程是兩個不同的進程,不過將日志緩存的寫入磁盤要比將數(shù)據(jù)緩沖寫入磁盤要頻繁的多了。
現(xiàn)在當用戶成功的提交一個事務(wù)時,他所做的更改并不會馬上寫入到數(shù)據(jù)文件中。不過這些變更會被記錄到日志緩沖中,同時在發(fā)送提交成功的信息給用戶之前這些相應(yīng)的日志緩存數(shù)據(jù)會被寫入到磁盤文件當中。
正如之前所述,SQL Server將日志文件稱為事務(wù)日志(Transaction Log),Oracle則稱為重做日志(Redo Log)。在SQL Server術(shù)語中,保存數(shù)據(jù)更改記錄的內(nèi)存塊稱為日志緩存(Log Buffer),Oracle則稱為重做緩存(Redo Buffer)。拋開命名的差異,實際日志文件的作用卻是一樣的:在服務(wù)器意外宕機之后,數(shù)據(jù)庫服務(wù)器會在服務(wù)重新啟動之后檢查文件的內(nèi)容,如果在日志文件中發(fā)現(xiàn)已提交的事務(wù)而在數(shù)據(jù)文件中不存在時,這些已提交的事務(wù)就會被重新應(yīng)用到數(shù)據(jù)文件中;如果日志文件中的記錄顯示事務(wù)沒有完成或者是回滾了,那反映到數(shù)據(jù)文件中的變化也同樣會回滾。在這個過程中的第一個部分稱為重做(REDO),第二個部分稱為撤銷(譯注:這里英文為undo,也許說回滾合適些)。
SQL Server為每個數(shù)據(jù)庫單獨的維護了一份事務(wù)日志,一份數(shù)據(jù)庫事務(wù)日志可以存在有多個事務(wù)日志文件。事務(wù)日志文件在數(shù)據(jù)庫創(chuàng)建的同時創(chuàng)建,之后也可以繼續(xù)追加。對Oracle來說,數(shù)據(jù)庫指的是素有的物理文件和邏輯的表空間。Oracle的重做日志會記錄對于所有表空間的更改。一個Oracle數(shù)據(jù)庫至少需要2個日志文件才能正常操作,當然日志文件可以多余2個,但是決不能少于2個。
SQL Server事務(wù)日志和Oracle重做日志之間的一個重大的區(qū)別就在于事務(wù)日志沒有邏輯分組一說,而重做日志則可以被分組在2個或更多個日志分組當中。每個Oracle數(shù)據(jù)庫至少需要有2個日志分組,每個分組里面必須要有一個或多個日志文件,日志組中的日志文件被稱為日志組成員(member)。
Oracle每次都是將日志緩存中的重做日志一次寫入到一個重做日志組中的所有文件中。在一個日志組中使用多個日志文件的容錯技術(shù)稱為多路技術(shù)(multiplexing)。在一個日志組寫滿之后,Oracle就會轉(zhuǎn)到下一個日志組,這樣的操作稱為日志切換(log switching),在這個日志組滿了之后又再轉(zhuǎn)到下一個日志組,以此類推。當所有的日志都寫滿之后(不管是存在2個還是多個日志組),Oracle就會將第一個組中的日志清理掉,然后開啟一輪新的寫入循環(huán)。
SQL Server數(shù)據(jù)庫的事務(wù)日志一樣是順序?qū)懭氲?,只是如果?shù)據(jù)庫不是運行在簡單恢復模式或者是事務(wù)日志做了備份的話,日志是不會被自動清除掉的。如果一個數(shù)據(jù)庫的邏輯事務(wù)日志空間滿了之后,它對應(yīng)的數(shù)據(jù)文件還無法增長的話,數(shù)據(jù)將無法繼續(xù)處理用戶操作。不過如果事務(wù)日志做過備份的話,那么SQL Server就會讓新事務(wù)重用那些已備份日志所占用的空間,從這點上來說,SQL Server的邏輯事務(wù)日志是以一種“回環(huán)(wrap-around)”的方式使用的。另外要強調(diào)的一點是SQL Server的事務(wù)日志文件的大小可以配置成自動擴展,而Oracle的重做日志文件則是有一個預定義大小的,如果不是手工更改這個大小的話,日志文件是不會自動增長的。
就數(shù)據(jù)可用性而言,兩種平臺都提供了基于時間點恢復(point-in-time recovery)的選項,當然必要的話也可以禁止掉(這個在測試或開發(fā)系統(tǒng)中是可行的)。要是SQL Server數(shù)據(jù)庫的基于時間點恢復的功能的話就必須是在完全恢復模式(full recovery mode)下。不管出于何種恢復模式,每次數(shù)據(jù)的修改都會被數(shù)據(jù)庫記錄在它對應(yīng)的事務(wù)日志里面,這些日志會一直保留到事務(wù)日志備份備份的時候。數(shù)據(jù)庫的恢復模式還能調(diào)整成簡單恢復模式(simple recovery mode),這種情況下的產(chǎn)生的事務(wù)日志會在每次檢查點(checkpoint)發(fā)生時截斷。檢查點操作會將所有數(shù)據(jù)緩沖中已修改的數(shù)據(jù)寫入到數(shù)據(jù)文件中,日志緩存中的日志信息寫入到日志文件中。如果數(shù)據(jù)庫運行在簡單恢復模式下,檢查點完成之后所有的檢查點之前完成的事務(wù)所產(chǎn)生的事務(wù)日志都會被刪除掉,因此SQL Server已經(jīng)確定這些舊的已提交的事務(wù)已經(jīng)確定被寫入到數(shù)據(jù)文件中去了。
現(xiàn)在假設(shè)數(shù)據(jù)庫檢測到一個錯誤(物理的或邏輯的),這時都可以使用最后一個全備先還原數(shù)據(jù)庫然后使用備份的事務(wù)日志恢復到還原的數(shù)據(jù)庫上面,這種特性可以讓數(shù)據(jù)庫回到之前的任意一個時間點(譯注:當然是指完全備份之后的任意一個時間點),只是這個特性只有在數(shù)據(jù)庫使用完全恢復模式的時候才可用。
Oracle中也有類似的概念。Oracle可以運行在歸檔模式(ARCHIVELOG)或是非歸檔模式(NOARCHIVELOG)下。在非歸檔模式下,當日志組鏈上的最后一個組寫滿之后就會覆蓋第一個日志組,這時因為Oracle的重做日志組是按照循環(huán)使用的方式運作的。當然這也就意味著數(shù)據(jù)庫是不能回到那些被刪除了的事務(wù)記錄所對應(yīng)的時間點的。所以從功能上說,這就相當于SQL Server的簡單恢復模式。
當Oracle數(shù)據(jù)庫運行在歸檔模式下時,它同時也會在后臺啟動一個或者多個歸檔進程(archiver),歸檔進程的作用就是在一個日志組滿了之后將日志組的內(nèi)容備份到放在磁盤上的文件中,這些保存的日志文件被稱為歸檔日志(archived log),日志組在歸檔之后就可以放心的被覆蓋了。自己想想就會發(fā)現(xiàn)Oracle重做日志組歸檔的功能其實和SQL Server事務(wù)日志備份是一樣的,也是說Oracle的歸檔模式和SQL Server的完全恢復模式是一樣的。
Oracle和SQL Server一樣,在還原全備之后可以使用歸檔日志進行還原。不同的時候SQL Server的事務(wù)日志備份需要手工的配置而Oracle只要配置了歸檔模式之后歸檔進行就會自動的進行日志歸檔備份操作。
最后,從恢復時間(recovery time)上面也能看到兩個平臺的相似之處。在之前也提到過,在數(shù)據(jù)引擎啟動時會經(jīng)過一個重做和撤銷的階段,這個階段所花費的時候稱為恢復間隔(recovery interval)。很明顯的數(shù)據(jù)庫管理員是希望這個時間越短越好的,在SQL Server中DBA可以通過下面的命令來配置這個時間間隔:
1 sp_configure 'show advanced option', 1 
2 reconfigure 
3   
4 sp_configure 'recovery interval', <time-in-minutes> 
5 reconfigure
這個命令修改的是系統(tǒng)配置參數(shù)。設(shè)置好恢復間隔之后,SQL Server會自動調(diào)整檢查點進程執(zhí)行檢查點的時間來滿足這個設(shè)置的時間要求。設(shè)置這個恢復間隔的單位是分鐘。
Oracle中類似的設(shè)置就是平均恢復時間(Mean Time To Recovery, MTTR),可以通過修改初始化參數(shù)FAST_START_MTTR_TARGET來修改它,設(shè)置這個參數(shù)可以用來調(diào)整檢查點執(zhí)行的頻率。這個值決定了Oracle再執(zhí)行數(shù)據(jù)庫崩潰恢復時所花費的時間,設(shè)置命令如下:
1 ALTER SYSTEM SET FAST_START_MTTR_TARGET=<number_of_seconds> SCOPE=spfile;

top系統(tǒng)元數(shù)據(jù)
不過是Oracle還是SQL Server,在數(shù)據(jù)庫軟件安裝和數(shù)據(jù)庫創(chuàng)建的時候,都會自動創(chuàng)建一大堆表以及其他諸如視圖、函數(shù)、存儲過程之類的對象。這些系統(tǒng)級的表包含的是實例和實例所用到的物理和邏輯屬性的元數(shù)據(jù),Oracle把這些表統(tǒng)稱為數(shù)據(jù)字典(data dictionary),在SQL Server中則是稱為系統(tǒng)表(system tables)。
在SQL Server 2005及之后的版本,大部分的系統(tǒng)對象都保存在resource數(shù)據(jù)庫中,少部分保存在master數(shù)據(jù)庫中。Oracle中,數(shù)據(jù)字典表是保存在SYSTEM和SYSAUX表空間中。從SQL Server 2005開始是無法再直接訪問系統(tǒng)表了,目錄視圖(catalogue views)取代系統(tǒng)表作為新的訪問系統(tǒng)元數(shù)據(jù)的統(tǒng)一的接口。在Oracle中數(shù)據(jù)字典表名都是加密過的,藉此來減少表被直接訪問或修改,同樣的,Oracle也創(chuàng)建了一系列的視圖用于給DBA和開發(fā)人員訪問元數(shù)據(jù),Oracle稱這些視圖為數(shù)據(jù)字典視圖(data dictionary views)。
目錄視圖的定義存儲在SQL Server的resource數(shù)據(jù)庫中,這些系統(tǒng)視圖歸屬于一個特別的名為sys的用戶架構(gòu)之下(user schema)并能從任意數(shù)據(jù)庫中訪問到。例如,要查看一個SQL Server實例中存在的所有的數(shù)據(jù)庫,DBA就可以在任意數(shù)據(jù)庫下使用下面語句查詢:
1 SELECT * FROM  sys.databases
要查出任意一個數(shù)據(jù)庫中的所有對象,則可以使用sys.objects目錄視圖:
1 SELECT * FROM  sys.objects
Oracle中,數(shù)據(jù)字典從屬于Oracle用戶SYS。不過不同于SQL Server的時候每個數(shù)據(jù)字典視圖都存在有三種不同的形式,分別提供三個不同級別的信息。數(shù)據(jù)字典視圖也就存在三個不同的類型,從視圖名的前綴就能看出視圖能帶來什么樣的信息:
以USER_開頭的視圖允許用戶查看他自己創(chuàng)建的對象的信息。
以ALL_開頭的視圖允許用戶查看他自己創(chuàng)建的對象以及那些非他自己創(chuàng)建的卻有權(quán)限訪問的對象的信息。
以DBA_開頭的視圖是給DBA用的,這類的視圖可以查詢到數(shù)據(jù)庫中存在的所有對象的信息,普通的用戶是沒有權(quán)限訪問這些視圖的。
下面的例子展示的兩個查詢返回的結(jié)果就是不一樣的:
1 SELECT TABLE_NAME, TABLESPACE_NAME FROM USER_TABLES; 
2 SELECT TABLE_NAME, TABLESPACE_NAME FROM DBA_TABLES;
第一個只顯示執(zhí)行查詢的用戶自己創(chuàng)建的表而第二個則會顯示數(shù)據(jù)庫中存在的所有的表。
 
本文來自CSDN博客,轉(zhuǎn)載請標明出處:http://blog.csdn.net/shiweijian1986/archive/2010/04/27/5533579.aspx

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多