數據庫切換日誌的時候,爲何必定要發生檢查點?這個檢查點有什麼意義?
表空間管理方式有哪幾種,各有什麼優劣。
本地索引與全局索引的差異與適用狀況。
一個表a varchar2(1),b number(1),c char(2),有100000條記錄,建立B-Tree索引在字段a上,那麼表與索引誰大?爲何?
9i的data guard有幾種模式,各有什麼差異。
執行計劃是什麼,查看執行計劃通常有哪幾種方式。
簡單描述一下nest loop與hash join的差異。
db file sequential read與db file scattered read等待的差異,若是以上等待比較多,證實了什麼問題?
library cache pin與library cache lock是什麼地方的等待事件,通常說明什麼問題?
在一個24*7的應用上,須要把一個訪問量很大的1000萬以上數據級別的表的普通索引(a,b)修改爲惟一約束(a,b,c),你通常會選擇怎麼作,請說出具體的操做步驟與語句。
若是一個linux上的oracle數據庫系統忽然變慢,你通常從哪裏去查找緣由。
說明一下對raid5與raid01/10的認識。
列舉5個10g的新特性
原文:http://www.itpub.net/showthread.php?s=&postid=6204369#post6204369【已失效】php
當時部分人的回答,參考以下。linux
最初由 WESTLIFE_XU 發佈
我瞎快速回答一下,請你們指教
(1)數據庫切換日誌的時候,爲何必定要發生檢查點?這個檢查點有什麼意義?
觸發dbwr的執行,dbwr會把和這個日誌相關的全部髒隊列寫到數據文件去,減小數據庫崩潰的時的恢復時間。
==>你所的只是普通checkpoint 該作的,而沒有特指Switch log時候的checkpoint的做用。
Switch log checkpoint最主要是使當前redo log 狀態由 current ==> Active ==> Inactive ,以備重用ios
(2)表空間管理方式有哪幾種,各有什麼優劣。
字典管理方式和自動管理方式,自動管理方式採用位圖管理extent,減小字典之間的競爭,同時避免了碎片
==>ok.
(3)本地索引與全局索引的差異與適用狀況。
本地索引適用於sql語句種限定一個範圍的查詢好比時間之類的, 全局索引適用於在所有記錄中查詢,好比要查詢一個手機號之類的。
全局索引總可能出現unused的狀況,須要重建
==>
本地索引適合條件中包含partition key的,固然不是絕對
全局索引總可能出現unused的狀況,一般我會問那該怎麼辦?
9i裏面有update global index 的子句
(4)一個表a varchar2(1),b number(1),c char(2),有100000條記錄,建立B-Tree索引在字段a上,那麼表與索引誰大?爲何?
這個要考慮到rwoid所佔的字節數,假設char老是佔用2字節的狀況,比較rowid和3
==>另外,table 和 index在segment free block的管理也有差異
(5)9i的data guard有幾種模式,各有什麼差異。
三種模式
maxmize performance 採用異步傳送
maxmize availablity 容許採用異步傳送,在二者之間搖擺
==> 不叫搖擺,正常狀況maxmize availablity 傳輸方式等同於maxmize protection ,只是在從庫Crash時容許primary繼續工做
maxmize protection 採用同步傳送
==>保證Standby 與 primary 絕對數據一致
我的覺得采用maxmize performance好一點,對主數據庫影響比較小
(6)執行計劃是什麼,查看執行計劃通常有哪幾種方式。
執行計劃是數據庫內部的執行步驟
set autotrace on
select * from table
alter session set event '10046 trace name context forever,level 12 '
通常採用pl/sql developer,其它的比較少用,記不住
==>差很少,再加個Explain plan , v$sql_plan
(7)簡單描述一下nest loop與hash join的差異。
nest loop適用於返回結果比較小的狀況。
for in 1...n loop
對小表進行遍歷
根據小表的結果遍歷大表(大表須要索引)
end loop
這個在數據庫高效設計裏面有很好的解釋,一時還寫不出來
==>小表稱爲驅動的結果集更爲貼切
hash join適用在返回大結果集的狀況
==>也未必必定大結果集
(8)db file sequential read與db file scattered read等待的差異,若是以上等待比較多,證實了什麼問題?
db file sequential read指的是須要一個但當前不在sga中的塊,等待從磁盤中讀取。db file scattered read須要多個連續的數據庫引發等待。
db file sequential read出現大量的等待,或許不是個問題。若是這兩個事件等待比較多,根據p1,p2,p3以及sid檢查sql語句,是否有調優的可能
==>db file scattered read基本能夠定性爲FTS/IFS
l(9)ibrary cache pin與library cache lock是什麼地方的等待事件,通常說明什麼問題?
通常出如今對package,procedure進行編譯,add contraint的時候。
==>差很少,說明DDL過多
(10)在一個24*7的應用上,須要把一個訪問量很大的1000萬以上數據級別的表的普通索引(a,b)修改爲惟一約束(a,b,c),你通常會選擇怎麼作,請說出具體的操做步驟與語句。
不能肯定,是否能夠採用先建索引後創建約束
create index idx_w1 on w_1 (a,b,c) online ;
alter table w_1 add constraint uni_w1 unique (a,b,c) novalidate;
==>
差很少,另外,必定要考慮非繁忙時間
(11)若是一個linux上的oracle數據庫系統忽然變慢,你通常從哪裏去查找緣由。
先top看看是哪些進程,看看這些進程在作什麼
看看v$session_wait
==>
差很少,能加上vmstat , iostat就更好了
(12)說明一下對raid5與raid01/10的認識。
raid5採用校驗信息,硬盤的利用率n-1/n, raid10先採用先鏡像在進行條帶化,是最高效的硬盤利用方式,硬盤的利用率50%
==> 一般會提一下redo log 不能 in raid5. 還有 01/10的區別及優劣。
(13)列舉5個10g的新特性
1.rename tablespace
2.新的em
3.asm
4.bigfile tablespace
5.真正的增量rman
6.flashback table
7.expdp、impdp
(1)數據庫切換日誌的時候,爲何必定要發生檢查點?這個檢查點有什麼意義?
數據庫切換日誌的時候,由於他要通知 dbwr,寫髒數據,ckpt,db_file ,redo 的 scn 號協調
這個問題前面討論了,主要就是理解日誌切換後爲何日誌組還多是active的
(2)表空間管理方式有哪幾種,各有什麼優劣。
表空間的管理包括數據字典和本地表空間管理兩種方式。
本地表空間管理:從oracle9r 開始,基本上默認都是本地表空間的管理,
這種方式直接使用的是bit (1和0)方式來管理。因此空間收縮快。
好比,咱們truncate或者drop 掉一個很是大的表,很是快
數據字典表空間管理 : 顧名思義,oracle 是用表來管理的。這樣就會形成對該表管理上的開銷。
因此,在oracle 8i ,咱們drop 一個很是大的表,可能須要3個小時或者更長。
本地索引與全局索引的差異與適用狀況。
我建立索引通常都是本地索引。
全局索引沒有使用過
(3)一個表a varchar2(1),b number(1),c char(2),有100000條記錄,建立B-Tree索引在字段a上,那麼表與索引誰大?爲何?
在100000 的數據上,這個表單獨對字段a 我不會建立索引。由於a varchar2(1) 建立索引後可能性能比較低。
咱們都知道,索引最終是使用rowid ,若是使用索引查詢大量的數據,還不如全表掃描,性能很是低。
不知道a的數據分佈的狀況下,你如何認定a上建索引性能很差?假如a的值是惟一的,大量查詢使用select * from t where a= ,你還認爲在a上建索引性能會比全表掃描低麼?算法
(4)9i的data guard有幾種模式,各有什麼差異。
具體說不上來,須要查詢文檔,不過,我作9i的 data guard 我都是主庫經過歸檔日誌來恢復datagard 的數據庫,
數據只有一個日誌文件的差異,若是向從庫上的網絡出現問題,或者是備庫出現問題,主庫就會報錯。同時不停的向
備庫寫歸檔。直到寫出爲止。
若是實際配置過,幾種模式沒有理由不知道
(5)執行計劃是什麼,查看執行計劃通常有哪幾種方式。
執行計劃是oracle 在執行一個語句時,使用了多少parse,execute,fetch ,使用了多少disk read/write, local read/write 等等
執行計劃是數據庫優化的重要工具。
你到底在說統計信息,仍是在說執行計劃?
有如下幾種方式:
1. explain for
2.set autotrace on
set autotrace traceonly
3.sql_trace 結合pkprof
v$sql_plan
(6)簡單描述一下nest loop與hash join的差異。
nest loop : select * from a where id
loop
select id from b
end loop
hash join:
這是是oracle 散列鏈接 ,從a 表,b 表 利用 oracle 散列算法進行鏈接
關鍵的一點,hash join只適合於等於鏈接條件。並且,散列算法進行鏈接,具體是怎麼作的?兩個表都作hash麼?呵呵
(7)db file sequential read與db file scattered read等待的差異,若是以上等待比較多,證實了什麼問題?
db file sequential read (數據文件順序讀取 ).多表鏈接中,表的鏈接順序存在問題,
沒有正確的驅動表 ,從一個數據塊中讀取數據
多是使用了不該當使用的索引掃描
db file scattered read 數據文件離散讀取,從從多個數據塊中讀取數據
若是以上等待比較多,多是出現大規模的全表掃描,快速索引掃描,全索引掃描。須要增長合適的索引消除該等待事件。
(8)library cache pin與library cache lock是什麼地方的等待事件,通常說明什麼問題?
library cache pin與library cache lock 是 share pool 中的等待事件 ,通常說明oracle latch 出現等待,
由於多個進程都在搶數據字段 latch, 搶不到就 pin,因此根據具體的應用須要優化
這個基本上沒說到點上這兩個latch主要是library cache中的object的組織方式是這樣的,首先一個至關於頭信息的handle,而後指向object具體的heap,library cache lock加在handle上,library cache pin則加在heap上,得到pin以前必須先得到對handle的鎖定。這兩種等待較多,通常是因爲DDL引發的,好比重編譯對象,授予/撤銷權限等,這個pin可不是得到latch失敗以後pin在cpu裏的pin,這個pin就是latch一種,是名詞
(9)在一個24*7的應用上,須要把一個訪問量很大的1000萬以上數據級別的表的普通索引(a,b)修改爲惟一約束(a,b,c),你通常會選擇怎麼作,請說出具體的操做步驟與語句。
首先 create unqiue idx_1 on table (a,b,c )
drop 表的普通索引(a,b)
這樣作,你的應用估計夠戧,index也不知道要多久才能建好
(10)若是一個linux上的oracle數據庫系統忽然變慢,你通常從哪裏去查找緣由。
(1) top 一下 , 找到相應session ,跟蹤該session ,結合 autotrace ,sql_trace, dbms_system.set_sql_trace_in_session(sid,serial#,true) 等應用優化工具
(2) v$session_wait , 找出等待事件
(3)v$sql,v$sqlarea 找出性能很差的sql等
(4),做statspack , 分析
沒有提到alert
(11)說明一下對raid5與raid01/10的認識。
raid5 好比5塊盤,4塊盤做數據盤,一塊盤做冗餘盤。
你說的是Raid3,raid5的校驗位是均勻分佈在各個盤的,沒有單獨的校驗盤sql
(12)列舉5個10g的新特性
asm
ash
awr
rman 增強
回閃功能
ash/awr基本上能夠算一個,閃回功能9i也有,準確的說應該是flashback database。其實10g的新特性不少,好比RecycleBin,物理備庫的read/write,data guard的Fast-start Failover,EM dbcontrol/grid control。。。數據庫