新聞中心
講解ORACLE的執(zhí)行計(jì)劃的幾種方法
Oracle
10年積累的成都網(wǎng)站建設(shè)、成都網(wǎng)站制作經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有瑞安免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
RDBMS執(zhí)行每一條SQL語句,都必須經(jīng)過Oracle優(yōu)化器的評(píng)估。所以,了解優(yōu)化器是如何選擇(搜索)路徑以及索引是如何被使用的,對(duì)優(yōu)化SQL語句有很大的幫助。Explain可以用來迅速方便地查出對(duì)于給定SQL語句中的查詢數(shù)據(jù)是如何得到的即搜索路徑(我們通常稱為Access
Path)。從而使我們選擇最優(yōu)的查詢方式達(dá)到最大的優(yōu)化效果。
1.1
、安
裝
要使用EXPLAIN首先要執(zhí)行相應(yīng)的腳本,創(chuàng)建出Explain_plan表。
具體腳本執(zhí)行如下:
$ORACLE_HOME/rdbms/admin/utlxplan.sql
(UNIX)
該腳本后會(huì)生成一個(gè)表這個(gè)程序會(huì)創(chuàng)建一個(gè)名為plan_table的表。
1.2
、使用
常規(guī)使用語法:
explainPLAN[SETSTATEMENT_ID[=]
評(píng)論
加載更多
誰能把Oracle的體系結(jié)構(gòu)用通俗的語言講解一下 我要自己理解的.用通俗的話說出來.
1、 ORACLE 實(shí)例――包括內(nèi)存結(jié)構(gòu)與后臺(tái)進(jìn)程 2、 ORACLE 數(shù)據(jù)庫(kù)――物理操作系統(tǒng)文件的集合 3、 了解內(nèi)存結(jié)構(gòu)的組成 4、 了解后臺(tái)進(jìn)程的作用
1、 Oracle 實(shí)例――包括內(nèi)存結(jié)構(gòu)與后臺(tái)進(jìn)程
2、 Oracle 數(shù)據(jù)庫(kù)――物理操作系統(tǒng)文件的集合
3、 了解內(nèi)存結(jié)構(gòu)的組成
4、 了解后臺(tái)進(jìn)程的作用
5、 了解數(shù)據(jù)庫(kù)的物理文件
6、 解釋各種邏輯結(jié)構(gòu)
一、Oracle實(shí)例
1、Oracle 實(shí)例
System Global Area(SGA) 和 Background Process 稱為數(shù)據(jù)庫(kù)的實(shí)例。
2、Oracle 數(shù)據(jù)庫(kù)
一系列物理文件的集合(數(shù)據(jù)文件,控制文件,聯(lián)機(jī)日志,參數(shù)文件等)
3、系統(tǒng)全局共享區(qū)System Global Area(SGA)
System Global Area 是一塊巨大的共享內(nèi)存區(qū)域,他被看做是Oracle 數(shù)據(jù)庫(kù)的一個(gè)大緩沖池,這里的數(shù)據(jù)可以被Oracle的各個(gè)進(jìn)程共用。其大小可以通過如下語句查看:
SQL select * from v$sga;
NAME VALUE
-------------------- ---------
Fixed Size 39816
Variable Size 259812784
Database Buffers 1.049E+09
Redo Buffers 327680
更詳細(xì)的信息可以參考V$sgastat、V$buffer_pool
主要包括以下幾個(gè)部分:
a、 共享池(Shared pool)
共享池是SGA中最關(guān)鍵的內(nèi)存片段,特別是在性能和可伸縮性上。一個(gè)太小的共享池會(huì)扼殺性能,使系統(tǒng)停止,太大的共享池也會(huì)有同樣的效果,將會(huì)消耗大量的CPU來管理這個(gè)共享池。不正確的使用共享池只會(huì)帶來災(zāi)難。共享池主要又可以分為以下兩個(gè)部分:
SQL語句緩沖(Library Cache)
當(dāng)一個(gè)用戶提交一個(gè)SQL語句,Oracle會(huì)將這句SQL進(jìn)行分析(parse),這個(gè)過程類似于編譯,會(huì)耗費(fèi)相對(duì)較多的時(shí)間。在分析完這個(gè)SQL,Oracle會(huì)把他的分析結(jié)果給保存在Shared pool的Library Cache中,當(dāng)數(shù)據(jù)庫(kù)第二次執(zhí)行該SQL時(shí),Oracle自動(dòng)跳過這個(gè)分析過程,從而減少了系統(tǒng)運(yùn)行的時(shí)間。這也是為什么第一次運(yùn)行的SQL 比第二次運(yùn)行的SQL要慢一點(diǎn)的原因。
下面舉例說明parse的時(shí)間
SQL select count(*) fromscpass ;
COUNT(*)
----------
243
Elapsed: 00:00:00.08
這是在Share_pool 和Data buffer 都沒有數(shù)據(jù)緩沖區(qū)的情況下所用的時(shí)間
SQL alter system flush SHARED_POOL;
System altered.
清空Share_pool,保留Data buffer
SQL select count(*) from scpass ;
COUNT(*)
----------
243
Elapsed: 00:00:00.02
SQL select count(*) from scpass ;
COUNT(*)
----------
243
Elapsed: 00:00:00.00
從兩句SQL 的時(shí)間差上可以看出該SQL 的Parse 時(shí)間約為00:00:00.02
對(duì)于保存在共享池中的SQL語句,可以從V$Sqltext、v$Sqlarea中查詢到,對(duì)于編程者來說,要盡量提高語句的重用率,減少語句的分析時(shí)間。一個(gè)設(shè)計(jì)的差的應(yīng)用程序可以毀掉整個(gè)數(shù)據(jù)庫(kù)的Share pool,提高SQL語句的重用率必須先養(yǎng)成良好的變成習(xí)慣,盡量使用Bind變量。
數(shù)據(jù)字典緩沖區(qū)(Data Dictionary Cache)
顯而易見,數(shù)據(jù)字典緩沖區(qū)是Oracle特地為數(shù)據(jù)字典準(zhǔn)備的一塊緩沖池,供Oracle內(nèi)部使用,沒有什么可以說的。
b、塊緩沖區(qū)高速緩存(Database Buffer Cache)
這些緩沖是對(duì)應(yīng)所有數(shù)據(jù)文件中的一些被使用到的數(shù)據(jù)塊。讓他們能夠在內(nèi)存中進(jìn)行操作。在這個(gè)級(jí)別里沒有系統(tǒng)文件,,戶數(shù)據(jù)文件,臨時(shí)數(shù)據(jù)文件,回滾段文件之分。也就是任何文件的數(shù)據(jù)塊都有可能被緩沖。數(shù)據(jù)庫(kù)的任何修改都在該緩沖里完成,并由DBWR進(jìn)程將修改后的數(shù)據(jù)寫入磁盤。
這個(gè)緩沖區(qū)的塊基本上在兩個(gè)不同的列表中管理。一個(gè)是塊的“臟”表(Dirty List),需要用數(shù)據(jù)庫(kù)塊的
書寫器(DBWR)來寫入,另外一個(gè)是不臟的塊的列表(Free List),一般的情況下,是使用最近最少使用 (Least Recently Used,LRU)算法來管理。塊緩沖區(qū)高速緩存又可以細(xì)分為以下三個(gè)部分(Default pool,Keep pool,Recycle pool)。如果不是人為設(shè)置初始化參數(shù)(Init.ora),Oracle將默認(rèn)為Default pool。由于操作系統(tǒng)尋址能力的限制,不通過特殊設(shè)置,在32位的系統(tǒng)上,塊緩沖區(qū)高速緩存最大可以達(dá)到1.7G,在64位系統(tǒng)上,塊緩沖區(qū)高速緩存最大可以達(dá)到10G。
c、重做日志緩沖區(qū)(Redo log buffer)
重做日志文件的緩沖區(qū),對(duì)數(shù)據(jù)庫(kù)的任何修改都按順序被記錄在該緩沖,然后由LGWR進(jìn)程將它寫入磁盤。這些修改信息可能是DML語句,如(Insert,Update,Delete),或DDL語句,如(Create,Alter,Drop等)。 重做日志緩沖區(qū)的存在是因?yàn)閮?nèi)存到內(nèi)存的操作比較內(nèi)存到硬盤的速度快很多,所以重作日志緩沖區(qū)可以加快數(shù)據(jù)庫(kù)的操作速度,但是考慮的數(shù)據(jù)庫(kù)的一致性與可恢復(fù)性,數(shù)據(jù)在重做日志緩沖區(qū)中的滯留時(shí)間不會(huì)很長(zhǎng)。所以重作日志緩沖區(qū)一般都很小,大于3M之后的重作日志緩沖區(qū)已經(jīng)沒有太大的實(shí)際意義。
d、Java程序緩沖區(qū)(Java Pool)
Java 的程序區(qū),Oracle 8I 以后,Oracle 在內(nèi)核中加入了對(duì)Java的支持。該程序緩沖區(qū)就是為Java 程序保留的。如果不用Java程序沒有必要改變?cè)摼彌_區(qū)的默認(rèn)大小。
e、大池(Large Pool)
大池的得名不是因?yàn)榇螅且驗(yàn)樗脕矸峙浯髩K的內(nèi)存,處理比共享池更大的內(nèi)存,在8.0開始引入。
下面對(duì)象使用大池:
MTS――在SGA的Large Pool中分配UGA
語句的并行查詢(Parallel Executeion of Statements)――允許進(jìn)程間消息緩沖區(qū)的分配,用來協(xié)調(diào) 并行查詢服務(wù)器
備份(Backup)――用于RMAN磁盤I/O緩存
4、后臺(tái)進(jìn)程(Background process)
后臺(tái)進(jìn)程是Oracle的程序,用來管理數(shù)據(jù)庫(kù)的讀寫,恢復(fù)和監(jiān)視等工作。Server Process主要是通過他和user process進(jìn)行聯(lián)系和溝通,并由他和user process進(jìn)行數(shù)據(jù)的交換。在Unix機(jī)器上,Oracle后臺(tái)進(jìn)程相對(duì)于操作系統(tǒng)進(jìn)程,也就是說,一個(gè)Oracle后臺(tái)進(jìn)程將啟動(dòng)一個(gè)操作系統(tǒng)進(jìn)程;在Windows機(jī)器上, Oracle后臺(tái)進(jìn)程相對(duì)于操作系統(tǒng)線程,打開任務(wù)管理器,我們只能看到一個(gè)Oracle.EXE的進(jìn)程,但是通過另外的工具,就可以看到包含在這里進(jìn)程中的線程。
在Unix上可以通過如下方法查看后臺(tái)進(jìn)程:
ps ?ef | grep ora_
# ps -ef | grep ora_ | grep XCLUAT
Oracle 29431 1 0 Sep 02 2:02 ora_dbwr_SID
Oracle 29444 1 0 Sep 02 0:03 ora_ckpt_SID
Oracle 29448 1 0 Sep 02 2:42 ora_smon_SID
Oracle 29442 1 0 Sep 02 3:25 ora_lgwr_SID
Oracle 29427 1 0 Sep 02 0:01 ora_pmon_SID
a、Oracle系統(tǒng)有5 個(gè)基本進(jìn)程他們是
DBWR(數(shù)據(jù)文件寫入進(jìn)程)
LGWR(日志文件寫入進(jìn)程)
SMON(系統(tǒng)監(jiān)護(hù)進(jìn)程)
PMON(用戶進(jìn)程監(jiān)護(hù)進(jìn)程)
CKPT(檢查點(diǎn)進(jìn)程,同步數(shù)據(jù)文件, 日志文件,控制文件)
b、DBWR
將修改過的數(shù)據(jù)緩沖區(qū)的數(shù)據(jù)寫入對(duì)應(yīng)數(shù)據(jù)文件
維護(hù)系統(tǒng)內(nèi)的空緩沖區(qū)
這里指出幾個(gè)容易錯(cuò)誤的概念:
當(dāng)一個(gè)更新提交后,DBWR把數(shù)據(jù)寫到磁盤并返回給用戶提交完成.
DBWR會(huì)觸發(fā)CKPT 后臺(tái)進(jìn)程
DBWR不會(huì)觸發(fā)LGWR 進(jìn)程
上面的概念都是錯(cuò)誤的.
DBWR是一個(gè)很底層的工作進(jìn)程,他批量的把緩沖區(qū)的數(shù)據(jù)寫入磁盤。和任何前臺(tái)用戶的進(jìn)程幾乎沒有什么關(guān)系,也不受他們的控制。至于DBWR會(huì)不會(huì)觸發(fā)LGWR和CKPT進(jìn)程,我們將在下面幾節(jié)里討論。
DBWR工作的主要條件如下
DBWR 超時(shí)
系統(tǒng)中沒有多的空緩沖區(qū)用來存放數(shù)據(jù)
CKPT 進(jìn)程觸發(fā)DBWR 等
c、LGWR
將重做日志緩沖區(qū)的數(shù)據(jù)寫入重做日志文件,LGWR是一個(gè)必須和前臺(tái)用戶進(jìn)程通信的進(jìn)程。當(dāng)數(shù)據(jù)被修改的時(shí)候,系統(tǒng)會(huì)產(chǎn)生一個(gè)重做日志并記錄在重做日志緩沖區(qū)內(nèi)。這個(gè)重做日志可以類似的認(rèn)為是以下的一個(gè)結(jié)構(gòu):
SCN=000000001000
數(shù)據(jù)塊ID
對(duì)象ID=0801
數(shù)據(jù)行=02
修改后的數(shù)據(jù)=0011
提交的時(shí)候,LGWR必須將被修改的數(shù)據(jù)的重做日志緩沖區(qū)內(nèi)數(shù)據(jù)寫入日志數(shù)據(jù)文件,然后再通知前臺(tái)進(jìn)程提交成功,并由前臺(tái)進(jìn)程通知用戶。從這點(diǎn)可以看出LGWR承擔(dān)了維護(hù)系統(tǒng)數(shù)據(jù)完整性的任務(wù)。
LGWR 工作的主要條件如下
用戶提交
有1/3 重做日志緩沖區(qū)未被寫入磁盤
有大于1M 重做日志緩沖區(qū)未被寫入磁盤
超時(shí)
DBWR需要寫入的數(shù)據(jù)的SCN號(hào)大于LGWR 記錄的SCN號(hào),DBWR 觸發(fā)LGWR寫入
d、SMON
工作主要包含
清除臨時(shí)空間
在系統(tǒng)啟動(dòng)時(shí),完成系統(tǒng)實(shí)例恢復(fù)
聚結(jié)空閑空間
從不可用的文件中恢復(fù)事務(wù)的活動(dòng)
OPS中失敗節(jié)點(diǎn)的實(shí)例恢復(fù)
清除OBJ$表
縮減回滾段
使回滾段脫機(jī)
e、PMON
主要用于清除失效的用戶進(jìn)程,釋放用戶進(jìn)程所用的資源。如PMON將回滾未提交的工作,釋放鎖,釋放分配給失敗進(jìn)程的SGA資源。
f、CKPT
同步數(shù)據(jù)文件,日志文件和控制文件,由于DBWR/LGWR的工作原理,造成了數(shù)據(jù)文件,日志文件,控制文件的不一至,這就需要CKPT進(jìn)程來同步。CKPT會(huì)更新數(shù)據(jù)文件/控制文件的頭信息。
CKPT工作的主要條件如下
在日志切換的時(shí)候
數(shù)據(jù)庫(kù)用immediate ,transaction , normal 選項(xiàng)shutdown 數(shù)據(jù)庫(kù)的時(shí)候
根據(jù)初始話文件LOG_CHECKPOINT_INTERVAL、LOG_CHECKPOINT_TIMEOUT、FAST_START_IO_TARGET 的設(shè)置的數(shù)值來確定
用戶觸發(fā)
以下進(jìn)程的啟動(dòng)需要手工配置
g、ARCH
當(dāng)數(shù)據(jù)庫(kù)以歸檔方式運(yùn)行的時(shí)候,Oracle會(huì)啟動(dòng)ARCH進(jìn)程,當(dāng)重做日志文件被寫滿時(shí),日志文件進(jìn)行切換,舊的重做日志文件就被ARCH進(jìn)程復(fù)制到一個(gè)/多個(gè)特定的目錄/遠(yuǎn)程機(jī)器。這些被復(fù)制的重做日志文件被叫做歸檔日志文件。
h、RECO
負(fù)責(zé)解決分布事物中的故障。Oracle可以連接遠(yuǎn)程的多個(gè)數(shù)據(jù)庫(kù),當(dāng)由于網(wǎng)絡(luò)問題,有些事物處于懸而未決的狀態(tài)。RECO進(jìn)程試圖建立與遠(yuǎn)程服務(wù)器的通信,當(dāng)故障消除后,RECO進(jìn)程自動(dòng)解決所有懸而未決的會(huì)話。
i、服務(wù)進(jìn)程Server Process
服務(wù)進(jìn)程的分類
專用服務(wù)進(jìn)程(Dedicated Server Process)
一個(gè)服務(wù)進(jìn)程對(duì)應(yīng)一個(gè)用戶進(jìn)程
共享服務(wù)進(jìn)程(MultiTreaded Server Process)
一個(gè)服務(wù)進(jìn)程對(duì)應(yīng)多個(gè)用戶進(jìn)程,輪流為用戶進(jìn)程服務(wù)。
PGA UGA
PGA = Process Global Area
UGA = User Global Area
他保存了用戶的變量、權(quán)限、堆棧、排序空間等用戶信息,對(duì)于專用服務(wù)器進(jìn)程,UGA在PGA中分配。對(duì)于多線程進(jìn)程,UGA在Large pool中分配。
j、用戶進(jìn)程User Process
在客戶端,將用戶的SQL 語句傳遞給服務(wù)進(jìn)程
5、一個(gè)貫穿數(shù)據(jù)庫(kù)全局的概念----系統(tǒng)改變號(hào)SCN(System Change Number)
系統(tǒng)改變號(hào),一個(gè)由系統(tǒng)內(nèi)部維護(hù)的序列號(hào)。當(dāng)系統(tǒng)需要更新的時(shí)候自動(dòng)增加,他是系統(tǒng)中維持?jǐn)?shù)據(jù)的一致性和順序恢復(fù)的重要標(biāo)志。
a. 查詢語句不會(huì)使SCN增加,就算是同時(shí)發(fā)生的更新,數(shù)據(jù)庫(kù)內(nèi)部對(duì)應(yīng)的SCN也是不同的。這樣一來就保證了數(shù)據(jù)恢復(fù)時(shí)候的順序。
b. 維持?jǐn)?shù)據(jù)的一致性,當(dāng)一
二、Oracle 數(shù)據(jù)庫(kù)
Oracle數(shù)據(jù)庫(kù)的組成――物理操作系統(tǒng)文件的集合。主要包括以下幾種。
1、控制文件(參數(shù)文件init.ora記錄了控制文件的位置)
控制文件包括如下主要信息
數(shù)據(jù)庫(kù)的名字,檢查點(diǎn)信息,數(shù)據(jù)庫(kù)創(chuàng)建的時(shí)間戳
所有的數(shù)據(jù)文件,聯(lián)機(jī)日志文件,歸檔日志文件信息
備份信息等
有了這些信息,Oracle就知道那些文件是數(shù)據(jù)文件,現(xiàn)在的重做日志文件是哪些,這些都是系統(tǒng)啟動(dòng)和運(yùn)行的基本條件,所以他是Oracle運(yùn)行的根本。如果沒有控制文件系統(tǒng)是不可能啟動(dòng)的。控制文件是非常重要的,一般采用多個(gè)鏡相復(fù)制來保護(hù)控制文件,或采用RAID來保護(hù)控制文件??刂莆募膩G失,將使數(shù)據(jù)庫(kù)的恢復(fù)變的很復(fù)雜。
控制文件信息可以從V$Controlfile中查詢獲得
2、數(shù)據(jù)文件(數(shù)據(jù)文件的詳細(xì)信息記載在控制文件中)
可以通過如下方式查看數(shù)據(jù)文件
SQL select name from v$datafile;
NAME
---------------------------------------------
/u05/dbf/PROD/system_01.dbf
/u06/dbf/PROD/temp_01.dbf
/u04/dbf/PROD/users_01.dbf
/u09/dbf/PROD/rbs_01.dbf
/u06/dbf/PROD/applsys_indx_01.dbf
/u05/dbf/PROD/applsys_data_01.dbf
從以上可以看出,數(shù)據(jù)文件大致可以分為以下幾類:
i. 系統(tǒng)數(shù)據(jù)文件(system_01.dbf)
存放系統(tǒng)表和數(shù)據(jù)字典,一般不放用戶的數(shù)據(jù),但是用戶腳本,如過程,函數(shù),包等卻是保存在數(shù)據(jù)字典中的。
名詞解釋:數(shù)據(jù)字典 數(shù)據(jù)字典是一些系統(tǒng)表或視圖,他存放系統(tǒng)的信息,他包括數(shù)據(jù)庫(kù)版本,數(shù)據(jù)文件信息,表與索引等段信息,系統(tǒng)的運(yùn)行狀態(tài)等各種和系統(tǒng)有關(guān)的信息和用戶腳本信息。數(shù)據(jù)庫(kù)管理員可以通過對(duì)數(shù)據(jù)字典的查詢,就可以了解到Oracle的運(yùn)行狀態(tài)。
ii. 回滾段文件(rbs_01.dbf)
如果數(shù)據(jù)庫(kù)進(jìn)行對(duì)數(shù)據(jù)的修改,那么就必須使用回滾段,回滾段是用來臨時(shí)存放修改前的數(shù)據(jù)(Before Image)?;貪L段通常都放在一個(gè)單獨(dú)的表空間上(回滾表空間),避免表空間碎片化,這個(gè)表空間包含的數(shù)據(jù)文件就是回滾數(shù)據(jù)文件。
iii. 臨時(shí)數(shù)據(jù)文件(temp_01.dbf)
主要存放用戶的排序等臨時(shí)數(shù)據(jù),與回滾段相似,臨時(shí)段也容易引起表空間碎片化,而且沒有辦法在一個(gè)永久表空間上開辟臨時(shí)段,所以就必須有一個(gè)臨時(shí)表空間,它所包含的數(shù)據(jù)文件就是臨時(shí)數(shù)據(jù)文件,主要用于不能在內(nèi)存上進(jìn)行的排序操作。我們必須為用戶指定一個(gè)臨時(shí)表空間。
iv. 用戶數(shù)據(jù)文件(/applsys_data_01.dbf ,applsys_indx_01.dbf)
存放用戶數(shù)據(jù),這里列舉了兩類常見的用戶型數(shù)據(jù),一般數(shù)據(jù)和索引數(shù)據(jù),一般來說,如果條件許可的話,可以考慮放在不同的磁盤上。
3、重做日志文件(聯(lián)機(jī)重做日志)
用戶對(duì)數(shù)據(jù)庫(kù)進(jìn)行的任何操作都會(huì)記錄在重做日志文件。在了解重做日志之前必須了解重做日志的兩個(gè)概念,重做日志組和重做日志組成員(Member),一個(gè)數(shù)據(jù)庫(kù)中至少要有兩個(gè)日志組文件,一組寫完后再寫另一組,即輪流寫。每個(gè)日志組中至少有一個(gè)日志成員,一個(gè)日志組中的多個(gè)日志成員是鏡相關(guān)系,有利于日志文件的保護(hù),因?yàn)槿罩疚募膿p壞,特別是當(dāng)前聯(lián)機(jī)日志的損壞,對(duì)數(shù)據(jù)庫(kù)的影響是巨大的。
聯(lián)機(jī)日志組的交換過程叫做切換,需要特別注意的是,日志切換在一個(gè)優(yōu)化效果不好的數(shù)據(jù)庫(kù)中會(huì)引起臨時(shí)的“掛起”。掛起大致有兩種情況:
在歸檔情況下,需要?dú)w檔的日志來不及歸檔,而聯(lián)機(jī)日志又需要被重新利用
檢查點(diǎn)事件還沒有完成(日志切換引起檢查點(diǎn)),而聯(lián)機(jī)日志需要被重新利用
解決這種問題的常用手段是:
i.增加日志組
ii.增大日志文件成員大小
通過v$log可以查看日志組,v$logfile可以查看具體的成員文件。
4、歸檔日志文件
Oracle可以運(yùn)行在兩種模式之中,歸檔模式和不歸檔模式。如果不用歸檔模式,當(dāng)然,你就不會(huì)有歸檔日志,但是,你的系統(tǒng)將不會(huì)是一個(gè)實(shí)用系統(tǒng),特別是不能用于生產(chǎn)系統(tǒng),因?yàn)槟憧赡軙?huì)丟失數(shù)據(jù)。但是在歸檔模式中,為了保存用戶的所有修改,在重做日志文件切換后和被覆蓋之間系統(tǒng)將他們另外保存成一組連續(xù)的文件系列,該文件系列就是歸檔日志文件。
有人或許會(huì)說,歸檔日志文件占領(lǐng)我大量的硬盤空間,其實(shí),具體想一想,你是愿意浪費(fèi)一點(diǎn)磁盤空間來保護(hù)你的數(shù)據(jù),還是愿意丟失你的數(shù)據(jù)呢?顯而義見,我們需要保證我們的數(shù)據(jù)的安全性。其實(shí),歸檔并不是一直占領(lǐng)你的磁盤空間,你可以把她備份到磁帶上,或則刪除上一次完整備份前的所有日志文件。
5、初始化參數(shù)文件
initSID.ora或init.ora文件,因?yàn)榘姹镜牟灰粯?,其位置也可能?huì)不一樣。在8i中,通常位于$Oracle_HOME/admin//Pfile下,初始化文件記載了許多數(shù)據(jù)庫(kù)的啟動(dòng)參數(shù),如內(nèi)存,控制文件,進(jìn)程數(shù)等,在數(shù)據(jù)庫(kù)啟動(dòng)的時(shí)候加載(Nomount時(shí)加載),初始化文件記錄了很多重要參數(shù),對(duì)數(shù)據(jù)庫(kù)的性能影響很大,如果不是很了解,不要輕易亂改寫,否則會(huì)引起數(shù)據(jù)庫(kù)性能下降。
6、其他文件
i . 密碼文件
用于Oracle 的具有sysdba權(quán)限用戶的認(rèn)證.
ii. 日志文件
報(bào)警日志文件(alert.log或alrt.ora)
記錄數(shù)據(jù)庫(kù)啟動(dòng),關(guān)閉和一些重要的出錯(cuò)信息。數(shù)據(jù)庫(kù)管理員應(yīng)該經(jīng)常檢查這個(gè)文件,并對(duì)出現(xiàn)的問題作出即使的反應(yīng)。你可以通過以下SQL 找到他的路徑select value from v$PARAMETER where name ="background_dump_dest";
后臺(tái)或用戶跟蹤文件
系統(tǒng)進(jìn)程或用戶進(jìn)程出錯(cuò)前寫入的信息,一般不可能讀懂,可以通過Oracle的TKPROF工具轉(zhuǎn)化為可以讀懂的格式。對(duì)于系統(tǒng)進(jìn)程產(chǎn)生的跟蹤文件與報(bào)警日志文件的路徑一樣,用戶跟蹤文件的路徑,你可以通過以下SQL找到他的路徑select value from v$PARAMETER where name ="user_dump_dest";
三、Oracle邏輯結(jié)構(gòu)
1、 表空間(tablespace)
表空間是數(shù)據(jù)庫(kù)中的基本邏輯結(jié)構(gòu),一系列數(shù)據(jù)文件的集合。一個(gè)表空間可以包含多個(gè)數(shù)據(jù)文件,但是一個(gè)數(shù)據(jù)文件只能屬于一個(gè)表空間。
2、 段(Segment)
段是對(duì)象在數(shù)據(jù)庫(kù)中占用的空間,雖然段和數(shù)據(jù)庫(kù)對(duì)象是一一對(duì)應(yīng)的,但段是從數(shù)據(jù)庫(kù)存儲(chǔ)的角度來看的。一個(gè)段只能屬于一個(gè)表空間,當(dāng)然一個(gè)表空間可以有多個(gè)段。
表空間和數(shù)據(jù)文件是物理存儲(chǔ)上的一對(duì)多的關(guān)系,表空間和段是邏輯存儲(chǔ)上的一對(duì)多的關(guān)系,段不直接和數(shù)據(jù)文件發(fā)生關(guān)系。一個(gè)段可以屬于多個(gè)數(shù)據(jù)文件,關(guān)于段可以指定擴(kuò)展到哪個(gè)數(shù)據(jù)文件上面。
段基本可以分為以下四種
數(shù)據(jù)段(Data Segment)
索引段(Index Segment)
回滾段(Rollback Segment)
臨時(shí)段(Temporary Segment)
3、區(qū)間(Extent)
關(guān)于Extent的翻譯有多種解釋,有的譯作擴(kuò)展,有的譯作盤區(qū),我這里通常譯為區(qū)間。在一個(gè)段中可以存在多個(gè)區(qū)間,區(qū)間是為數(shù)據(jù)一次性預(yù)留的一個(gè)較大的存儲(chǔ)空間,直到那個(gè)區(qū)間被用滿,數(shù)據(jù)庫(kù)會(huì)繼續(xù)申請(qǐng)一個(gè)新的預(yù)留存儲(chǔ)空間,即新的區(qū)間,一直到段的最大區(qū)間數(shù)(Max Extent)或沒有可用的磁盤空間可以申請(qǐng)。 在Oracle8i以上版本,理論上一個(gè)段可以無窮個(gè)區(qū)間,但是多個(gè)區(qū)間對(duì)Oracle卻是有性能影響的,Oracle建議把數(shù)據(jù)分布在盡量少的區(qū)間上,以減少Oracle的管理與磁頭的移動(dòng)。
4、Oracle數(shù)據(jù)塊(Block)
Oracle最基本的存儲(chǔ)單位,他是OS數(shù)據(jù)塊的整數(shù)倍。Oracle的操作都是以塊為基本單位,一個(gè)區(qū)間可以包含多個(gè)塊(如果區(qū)間大小不是塊大小的整數(shù)倍,Oracle實(shí)際也擴(kuò)展到塊的整數(shù)倍)。
5、基本表空間介紹
a. 系統(tǒng)表空間
主要存放數(shù)據(jù)字典和內(nèi)部系統(tǒng)表基表
查看數(shù)據(jù)數(shù)據(jù)字典的SQL
select * from dict
查看內(nèi)部系統(tǒng)表的SQL
select * from v$fixed_view_definition
DBA對(duì)系統(tǒng)的系統(tǒng)表中的數(shù)據(jù)字典必須有一個(gè)很深刻的了解,他們必須準(zhǔn)備一些基礎(chǔ)的SQL語句,通過這些SQL可以立即了解系統(tǒng)的狀況和數(shù)據(jù)庫(kù)的狀態(tài),這些基本的SQL包括
系統(tǒng)的剩余空間
系統(tǒng)的SGA
狀態(tài)系統(tǒng)的等待
用戶的權(quán)限
當(dāng)前的用戶鎖
緩沖區(qū)的使用狀況等
在成為DBA 的道路上我們不建議你過分的依賴于OEM/Quest 等優(yōu)秀的數(shù)據(jù)庫(kù)管理工具,因?yàn)樗麄儾焕谀銓?duì)數(shù)據(jù)數(shù)據(jù)字典的理解,SQL語句可以完成幾乎全部的數(shù)據(jù)庫(kù)管理工作。
大量的讀少量的寫是該表空間的一個(gè)顯著的特點(diǎn)。
b. 臨時(shí)表空間.
臨時(shí)表空間顧名思義是用來存放臨時(shí)數(shù)據(jù)的,例如排序操作的臨時(shí)空間,他的空間會(huì)在下次系統(tǒng)啟動(dòng)的時(shí)候全部被釋放。
c. 回滾段表空間
i. 回滾段在系統(tǒng)中的作用
當(dāng)數(shù)據(jù)庫(kù)進(jìn)行更新插入刪除等操作的時(shí)候,新的數(shù)據(jù)被更新到原來的數(shù)據(jù)文件,而舊的數(shù)據(jù)(Before Image)就被放到回滾段中,如果數(shù)據(jù)需要回滾,那么可以從回滾段將數(shù)據(jù)再?gòu)?fù)制到數(shù)據(jù)文件中。來完成數(shù)據(jù)的回滾。在系統(tǒng)恢復(fù)的時(shí)候, 回滾段可以用來回滾沒有被commit 的數(shù)據(jù),解決系統(tǒng)的一至性。
回滾段在什么情況下都是大量的寫,一般是少量讀,因此建議把回滾段單獨(dú)出來放在一個(gè)單獨(dú)的設(shè)備(如單獨(dú)的磁盤或RAID),以減少磁盤的IO爭(zhēng)用。
ii. 回滾段的工作方式
一個(gè)回滾表空間可以被劃分成多個(gè)回滾段.
一個(gè)回滾段可以保存多個(gè)會(huì)話的數(shù)據(jù).
回滾段是一個(gè)圓形的數(shù)據(jù)模型
假設(shè)回滾段由4 個(gè)區(qū)間組成,他們的使用順序就是區(qū)間1à區(qū)間2à區(qū)間3à區(qū)間4à區(qū)間1。也就是說,區(qū)間是可以循環(huán)使用的,當(dāng)區(qū)間4到區(qū)間1的時(shí)候,區(qū)間1里面的會(huì)話還沒有結(jié)束, 區(qū)間4用完后就不能再用區(qū)間1,這時(shí)系統(tǒng)必須分配區(qū)間5,來繼續(xù)為其他會(huì)話服務(wù)服務(wù)。
我們分析一個(gè)Update 語句的完成
①. 用戶提交一個(gè)Update 語句
②. Server Process 檢查內(nèi)存緩沖.
如果沒有該數(shù)據(jù)塊的緩沖,則從磁盤讀入
i. 如果沒有內(nèi)存的有效空間,DBWR被啟動(dòng)將未寫入磁盤的臟緩沖寫入磁盤
ii. 如果有有效空間,則讀入
③. 在緩沖內(nèi)更新數(shù)據(jù)
i. 申請(qǐng)一個(gè)回滾段入口,將舊數(shù)據(jù)寫如回滾段
ii. 加鎖并更新數(shù)據(jù)
iii. 并在同時(shí)將修改記錄在Redo log buffer中
Oracle之查詢?cè)斀?/h2>
查詢是數(shù)據(jù)的一個(gè)重要操作。用戶發(fā)送查詢請(qǐng)求,經(jīng)編譯軟件變異成二進(jìn)制文件供服務(wù)器查詢,后返回查詢結(jié)果集給用戶,查詢會(huì)產(chǎn)生一個(gè)虛擬表,看到的是表形式顯示的結(jié)果,但結(jié)果并不真正的存儲(chǔ),每次執(zhí)行查詢只是從數(shù)據(jù)表中提取數(shù)據(jù),并按照表的形式顯示出來。
SELECT 列名
FGROM 表名
[WHERE 查詢條件表達(dá)式]
[GROUP BY 分組表達(dá)式]
[HAVING 分組查詢表達(dá)式]
[ORDER BY 排序的列名 [ASC或DESC]]
group by 用于對(duì)查詢的結(jié)果分組統(tǒng)計(jì),通過對(duì)group by后面的名字進(jìn)行分組后輸出結(jié)果。
group by后面還可以跟多列表示 多列分組 ,在多列分組時(shí)放前面的優(yōu)先分組。
group by 列名,列名
having 子句用于限制分組顯示結(jié)果,其只能和group by一起連用。在where中沒有辦法直接使用聚合函數(shù),即sum avg等無法使用,所以引用了having,在having中可以使用這些函數(shù)。
order by 表示排序,后跟列名和排序方式。如果什么都不加默認(rèn)為升序。ASC表示升序,DESC表示降序。
在Oracle中還可以設(shè)置多列排序
order by 列名1 升降,列名2 升降;
前面的為主要排序,后面的為次一級(jí)排序。
注:碰到自己與自己比較的情況下,不能用having,可以創(chuàng)建一個(gè)新列。
注:如果select語句同時(shí)包含group by,having,order by,按group by,having,order by排序
分組和聚合一起使用,目的是為了統(tǒng)計(jì)信息。
where是為了from服務(wù)的,只能跟 真實(shí)的字段 ,用來篩選from子句中指定的操作所產(chǎn)生的行
group by 用來分組where子句的輸出
having 用來從分組的結(jié)果中篩選行
order by用來對(duì)篩選的結(jié)果進(jìn)行排序
(1)分組函數(shù):max min?avg sum count
max表示該列的最大值,min表示該列的最小值,avg表示該列的平均值,sum表示該列的和,count表示該列的行數(shù)。
注:分組函數(shù)(max、min、avg、count、sum)只能出現(xiàn)在選擇列表中having子句、order by子句、不能出現(xiàn)在where子句和group by子句中。
(2)多表查詢
多表查詢是指兩個(gè)和兩個(gè)以上的表或者是視圖的查詢,在實(shí)際應(yīng)用中,當(dāng)查詢單個(gè)表不能滿足需求時(shí),一般使用多表查詢。如:顯示sales部門位置和其員工的姓名,這種情況下需要使用到(dept表和emp表)。
多表查詢的連接一般可以分為:內(nèi)連接、左外連接、右外連接、全連接。
注:在使用多表查詢的時(shí)候每個(gè)表可以設(shè)置別名,如果表指定了別名,那么語句中所有語句必須使用別名,而不能再使用實(shí)際表名。且在寫屬性的時(shí)候如果屬性為其中一個(gè)表特有的屬性則不需要寫別名,如果是兩個(gè)表都有則必須指定是哪一個(gè)表的哪個(gè)屬性格式為:表名.屬性名。
select 列名 from 表1 別名,表2 別名...
注:e是emp的別名,d是dept的別名。
但如果對(duì)表進(jìn)行了操作則需要設(shè)置別名,如:查詢每個(gè)部門中工資高于該部門平均工資的員工人數(shù)。在其中有一個(gè)avg表,這個(gè)表必須設(shè)置別名(提醒:如果僅有一個(gè)被修改的表,則可以不設(shè)置別名,但如果有多個(gè)表則必須設(shè)置別名)。
內(nèi)連接
內(nèi)連接通過使用比較運(yùn)算符來使每個(gè)表的通用列中的值匹配來組成一個(gè)新表,即:把兩個(gè)表中間共有的那些行拿出來進(jìn)行連接,如果某些行不是兩個(gè)表共有的,則不進(jìn)行連接。
select
from 表1
inner join 表2
on 匹配條件
或
select
from 表1 表2
where匹配條件
左外連接
左外連接與內(nèi)連接的區(qū)別是:設(shè)置左外連接的時(shí)候設(shè)置了主表和附表,主表在前,附表在后。內(nèi)連接是將兩個(gè)表匹配的地方輸出出來,而左外連接則是主表全寫,附表一一對(duì)應(yīng),附表有則加上,沒有不寫。
select
from 表1
left join 表2
on 匹配條件
右外連接
右外連接和左外連接基本相同只是右外連接的主表寫在后邊。
select
from 表1
right join 表2
on 匹配條件
全連接
全連接是在等值連接的基礎(chǔ)上將左表和右表的未匹配數(shù)據(jù)都加上,使用的關(guān)鍵字為full outer join或者full join。
select
from 表1
full join 表2
on 匹配條件
自連接
還有一種特殊情況即自連接,在Oracle中一個(gè)表無法與自己進(jìn)行比較,所以當(dāng)需要自己表的兩個(gè)信息做比較的時(shí)候也需要使用連接來連接,即同一張表的連結(jié)查詢。
(3)子查詢
子查詢是指嵌套在其他sql語句中的select語句,也叫嵌套查詢。sql語句執(zhí)行順序?yàn)閺挠业阶髨?zhí)行,所以在執(zhí)行查詢時(shí)會(huì)先執(zhí)行左側(cè)的子查詢后進(jìn)行主查詢。
子查詢分為單行子查詢和多行子查詢,單行子查詢是指返回一行數(shù)據(jù)的子查詢語句,多行子查詢是指返回多行數(shù)據(jù)的查詢語句。子查詢還可以分為多列子查詢、多行子查詢、多列多行子查詢。
在進(jìn)行子查詢時(shí)如果內(nèi)部查詢不返回任何記錄,則外部條件中字段DEPTNO與NULL比較永遠(yuǎn)為假,也就是說外部查詢不返回任何結(jié)果。
總結(jié)為:
單行子查詢是指子查詢只返回單列、單行數(shù)據(jù)
多行子查詢是指返回單列多行數(shù)據(jù),都是針對(duì)單列而言的
多列子查詢則是指查詢返回多個(gè)列數(shù)據(jù)的子查詢語句
單行子查詢
where deptno = (單行數(shù)值)
多行子查詢
where deptno in ( 多行數(shù)值 )
多列子查詢:
where (job,deptno)=(select job,deptno from emp where ename='KING')
多列多行子查詢
where (job,deptno) in (select job,deptno from emp where ename='KING')
單行子查詢
在單行子查詢的外部查詢中可以使用=、、、=、=、等比較運(yùn)算符。
內(nèi)部查詢返回的結(jié)果必須與外部查詢條件中字段(DEPTNO)相匹配。
多行子查詢
在WHERE子句中使用多行子查詢時(shí),可以使用多行比較運(yùn)算符(IN,ALL,ANY)。
IN:等于任何一個(gè)。
ALL:和子查詢返回的所有值比較。例如:salALL(1,2,3)等價(jià)于sal3,即大于所有。
ANY:和子查詢返回的任意一個(gè)值比較。例如:salANY(1,2,3)等價(jià)于sal1,即大于任意一個(gè)就可以。
注:ANY運(yùn)算符必須與單行比較運(yùn)算符結(jié)合使用,并且返回行只要匹配子查詢的任何一個(gè)結(jié)果即可。
多列子查詢
多列子查詢和多行子查詢相同,只是使用多列子查詢的時(shí)候會(huì)有多列進(jìn)行匹配。
(4)集合運(yùn)算
為了合并多個(gè)select語句的結(jié)果,可以使用集合操作符號(hào)union,union all,intersect,minus。
union:該操作符用于取得兩個(gè)結(jié)果集的并集。當(dāng)使用該操作符時(shí),會(huì)自動(dòng)去掉結(jié)果集中重復(fù)行
union all:該操作與union相似,但是它不會(huì)取消重復(fù)行,而且不會(huì)排序
intersect:使用該操作符用于取得兩個(gè)結(jié)果集的交集
minus:使用該操作符用于取得兩個(gè)結(jié)果集的差集,它只會(huì)顯示存在第一個(gè)集合中,而不存在第二個(gè)集合中的數(shù)據(jù)
總結(jié)為集合運(yùn)算就是將兩個(gè)或者多個(gè)結(jié)果集組合成一個(gè)結(jié)果集。
intersect ?交集 返回兩個(gè)查詢共有的記錄
union all ?并集 返回各個(gè)查詢的所有記錄,包括重復(fù)的記錄
union ? ? ?交集 返回各個(gè)查詢的所有記錄,不包括重復(fù)的記錄
MINUS ? 補(bǔ)集 返回第一個(gè)查詢檢查出的記錄減去第二個(gè)查詢檢索出來的記錄之后剩余的記錄
注意:當(dāng)使用集合操作的時(shí)候,查詢所返回的列數(shù)以及列的類型必須匹配,列名可以不同。
(1)Distinct關(guān)鍵字
在Oracle中,可能出現(xiàn)若干相同的情況,那么可以用Distinct消除重復(fù)行
(2)多表查詢與單行子查詢可以實(shí)現(xiàn)相同的功能
查詢出銷售部(sales)下面的員工姓名,工作,工資
(3)顯示高于自己部門平均工資的員工信息
分析:
1.找到所有部門的平均工資
select deptno,avg(sal) from emp group by deptno;
2.找到所有人的工資信息
select ename,sal,deptno from emp;
3.把兩個(gè)結(jié)果集使用多表連接組合組合起來
select * from emp,(select deptno,avg(sal) avgsal from emp group by deptno) damao where emp.deptno=damao.deptno;
4.去掉低于平均工資的那些數(shù)據(jù)即可:
select * from emp,(select deptno,avg(sal) avgsal from emp group by deptno) damao where emp.deptno=damao.deptno and salavgsal;
(4)emp表介紹
字段? ? ? ? ? ? ? 類型? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 描述
empno ? ? ? ? ?NUMBER(4) ? ? ? ? ? ? ? ? 表示雇員編號(hào),是唯一編號(hào)
ename ? ? ? ? ?VAECHAR2(10) ? ? ? ? ? 表示雇員姓名
job ? ? ? ? ? ? ? ?VARCHAR2(9) ? ? ? ? ? ? 表示工作職位
mgr ? ? ? ? ? ? ?NUMBER(4) ? ? ? ? ? ? ? ? 表示一個(gè)雇員的領(lǐng)導(dǎo)編號(hào)
hiredate ? ? ? DATE ? ? ? ? ? ? ? ? ? ? ? ? ? ?表示雇傭日期
sal ? ? ? ? ? ? ? NUMBER(7,2) ? ? ? ? ? ? ? 表示月薪,工資
comm ? ? ? ? ?NUMBER(7,2) ? ? ? ? ? ? ? 表示獎(jiǎng)金,或者稱為傭金
deptno ? ? ? ? NUMBER(2) ? ? ? ? ? ? ? ? 部門編號(hào)
文章題目:如何講解oracle 如何講解公司價(jià)值遠(yuǎn)景
本文網(wǎng)址:http://fisionsoft.com.cn/article/hiocpc.html