Oracle+面試及答案

一、基礎概念

1.       列舉幾種表連接方式

Answer :等連接(內連接)、非等連接、自連接、外連接(左、右、全)

Or hash join/merge join/nest loop(cluster join)/index join ??

ORACLE 8i ,9i 表連接方法。

 

一般的相等連接: select * from a, b where a.id = b.id; 這個就屬於內連接。

 

對於外連接:

Oracle 中可以使用“(+) ”來表示,9i 可以使用LEFT/RIGHT/FULL OUTER JOIN

 

LEFT OUTER JOIN :左外關聯

SELECT e.last_name, e.department_id, d.department_name

FROM employees e

LEFT OUTER JOIN departments d

ON (e.department_id = d.department_id);

等價於

SELECT e.last_name, e.department_id, d.department_name

FROM employees e, departments d

WHERE e.department_id=d.department_id(+)

結果爲:所有員工及對應部門的記錄,包括沒有對應部門編號department_id 的員工記錄。

 

RIGHT OUTER JOIN :右外關聯

SELECT e.last_name, e.department_id, d.department_name

FROM employees e

RIGHT OUTER JOIN departments d

ON (e.department_id = d.department_id);

等價於

SELECT e.last_name, e.department_id, d.department_name

FROM employees e, departments d

WHERE e.department_id(+)=d.department_id

結果爲:所有員工及對應部門的記錄,包括沒有任何員工的部門記錄。

 

FULL OUTER JOIN :全外關聯

SELECT e.last_name, e.department_id, d.department_name

FROM employees e

FULL OUTER JOIN departments d

ON (e.department_id = d.department_id);

結果爲:所有員工及對應部門的記錄,包括沒有對應部門編號department_id 的員工記錄和沒有任何員工的部門記錄。

 

ORACLE8i 是不直接支持完全外連接的語法,也就是說不能在左右兩個表上同時加上(+) ,下面是在ORACLE8i 可以參考的完全外連接語法

select t1.id,t2.id from table1 t1,table t2 where t1.id=t2.id(+)

union

select t1.id,t2.id from table1 t1,table t2 where t1.id(+)=t2.id


連接類型

定義

圖示

例子

內連接

只連接匹配的行

 

select A.c1,B.c2 from A join B on A.c3 = B.c3;

左外連接

包含左邊表的全部行(不管右邊的表中是否存在與它們匹配的行)以及右邊表中全部匹配的行

 

select A.c1,B.c2 from A left join B on A.c3 = B.c3;

右外連接

包含右邊表的全部行(不管左邊的表中是否存在與它們匹配的行)以及左邊表中全部匹配的行

 

select A.c1,B.c2 from A right join B on A.c3 = B.c3;

全外連接

包含左、右兩個表的全部行,不管在另一邊的表中是否存在與它們匹配的行

 

select A.c1,B.c2 from A full join B on A.c3 = B.c3;

(theta )連接

使用等值以外的條件來匹配左、右兩個表中的行

 

select A.c1,B.c2 from A join B on A.c3 != B.c3;

交叉連接

生成笛卡爾積——它不使用任何匹配或者選取條件,而是直接將一個數據源中的每個行與另一個數據源的每個行一一匹配

 

select A.c1,B.c2 from A,B;

 

2.       不借助第三方工具,怎樣查看sql 的執行計劃

I) 使用Explain Plan, 查詢PLAN_TABLE;

    EXPLAIN  PLAN

     SET STATEMENT_ID='QUERY1'

     FOR

     SELECT *

     FROM a

     WHERE aa=1;

  SELECT   operation, options, object_name, object_type, ID, parent_id

      FROM plan_table

     WHERE STATEMENT_ID = 'QUERY1'

  ORDER BY ID;

II)SQLPLUS 中的SET TRACE 即可看到Execution Plan Statistics

  SET AUTOTRACE ON;

3.       如何使用CBO,CBO 與RULE 的區別

  IF 初始化參數 OPTIMIZER_MODE = CHOOSE THEN  --(8I DEFAULT)

     IF 做過表分析

        THEN 優化器 Optimizer=CBO(COST);          /* 高效*/

     ELSE

        優化器 Optimizer=RBO(RULE);                /* 高效*/

     END IF;

  END IF;

 

  區別:

  RBO 根據規則選擇最佳執行路徑來運行查詢。

  CBO 根據表統計找到最低成本的訪問數據的方法確定執行計劃。

  使用CBO 需要注意:

  I)  需要經常對錶進行ANALYZE 命令進行分析統計;

  II) 需要穩定執行計劃;

  III) 需要使用提示 (Hint);

  使用 RULE 需要注意 :

I)  選擇最有效率的表名順序

II) 優化 SQL 的寫法 ;

 

 

在 optimizer_mode=choose 時 , 如果表有統計信息 ( 分區表外 ), 優化器將選擇 CBO, 否則選 RBO 。  

RBO 遵循簡單的分級方法學, 使用15 種級別要點,當接收到查詢,優化器將評估使用到的要點數目, 然後選擇最佳級別(最少的數量)的執行路徑來運行查詢。 

CBO 嘗試找到最低成本的訪問數據的方法, 爲了最大的吞吐量或最快的初始響應時間, 計算使用不同的執行計劃的成本,並選擇成本最低的一個, 關於表的數據內容的統計被用於確定執行計劃。

4.       如何定位重要( 消耗資源多) 的SQL

使用CPU 多的用戶session

SELECT a.SID, spid, status, SUBSTR (a.program, 1, 40) prog, a.terminal,a.SQL_TEXT, osuser, VALUE / 60 / 100 VALUE

FROM v$session a, v$process b, v$sesstat c

WHERE c.statistic# = 12 AND c.SID = a.SID AND a.paddr = b.addr

ORDER BY VALUE DESC;

 

select sql_text from v$sql 

where disk_reads > 1000 or (executions > 0 and buffer_gets/executions > 30000);

5.       如何跟蹤某個session 的SQL

利用TRACE 跟蹤

  ALTER SESSION SET SQLTRACE ON;

  COLUMN SQL format a200;

  SELECT   machine, sql_text SQL

      FROM v$sqltext a, v$session b

     WHERE address = sql_address

       AND machine = '&A'

  ORDER BY hash_value, piece;

 

exec dbms_system.set_sql_trace_in_session(sid,serial#,&sql_trace); 

select sid,serial# from v$session where sid = (select sid from v$mystat where rownum = 1); 

exec dbms_system.set_ev(&sid,&serial#,&event_10046,&level_12,'');

6.       SQL 調整最關注的是什麼

檢查系統的I/O 問題

sar -d 能檢查整個系統的iostat (IO statistics )

 

查看該SQL 的response time(db block gets/consistent gets/physical reads/sorts (disk))

7.       說說你對索引的認識(索引的結構、對dml 影響、對查詢影響、爲什麼提高查詢性能)

索引有B-TREE 、BIT 、CLUSTER 等類型。ORACLE 使用了一個複雜的自平衡B-tree 結構; 通常來說,在表上建立恰當的索引,查詢時會改進查詢性能。但在進行插入、刪除、修改時,同時會進行索引的修改,在性能上有一定的影響。有索引且查詢條件能使用索引時,數據庫會先度取索引,根據索引內容和查詢條件,查詢出ROWID ,再根據ROWID 取出需要的數據。由於索引內容通常比全表內容要少很多,因此通過先讀索引,能減少I/O ,提高查詢性能。

 

b-tree index/bitmap index/function index/patitional index(local/global) 索引通常能提高select/update/delete 的性能, 會降低insert 的速度,

8.       使用索引查詢一定能提高查詢的性能嗎?爲什麼

通常, 通過索引查詢數據比全表掃描要快. 但是我們也必須注意到它的代價.

索引需要空間來存儲, 也需要定期維護, 每當有記錄在表中增減或索引列被修改時, 索引本身也會被修改. 這意味着每條記錄的INSERT,DELETE,UPDATE 將爲此多付出4,5 次的磁盤I/O. 因爲索引需要額外的存儲空間和處理, 那些不必要的索引反而會使查詢反應時間變慢. 使用索引查詢不一定能提高查詢性能, 索引範圍查詢(INDEX RANGE SCAN) 適用於兩種情況:

基於一個範圍的檢索, 一般查詢返回結果集小於表中記錄數的30% 宜採用;

基於非唯一性索引的檢索

 

索引就是爲了提高查詢性能而存在的, 如果在查詢中索引沒有提高性能, 只能說是用錯了索引, 或者講是場合不同

9.       綁定變量是什麼?綁定變量有什麼優缺點?

綁定變量是指在SQL 語句中使用變量,改變變量的值來改變SQL 語句的執行結果。

優點:使用綁定變量,可以減少SQL 語句的解析,能減少數據庫引擎消耗在SQL 語句解析上的資源。提高了編程效率和可靠性。減少訪問數據庫的次數, 就能實際上減少ORACLE 的工作量。

缺點:經常需要使用動態SQL 的寫法,由於參數的不同,可能SQL 的執行效率不同;

 

綁定變量是相對文本變量來講的, 所謂文本變量是指在SQL 直接書寫查詢條件,

這樣的SQL 在不同條件下需要反覆解析, 綁定變量是指使用變量來代替直接書寫條件,查詢bind value 在運行時傳遞,然後綁定執行。 

優點是減少硬解析, 降低CPU 的爭用, 節省shared_pool 

缺點是不能使用histogram,sql 優化比較困難

10.   如何穩定( 固定) 執行計劃

可以在SQL 語句中指定執行計劃。使用HINTS;

query_rewrite_enabled = true

star_transformation_enabled = true

optimizer_features_enable = 9.2.0

創建並使用stored outline

11.   和排序相關的內存在8i 和9i 分別怎樣調整,臨時表空間的作用是什麼

SORT_AREA_SIZE 在進行排序操作時,如果排序的內容太多,內存裏不能全部放下,則需要進行外部排序,

此時需要利用臨時表空間來存放排序的中間結果。

 

8i 中sort_area_size/sort_area_retained_size 決定了排序所需要的內存,如果排序操作不能在sort_area_size 中完成, 就會用到temp 表空間

9i 中如果workarea_size_policy=auto 時, 

排序在pga 內進行, 通常pga_aggregate_target 的1/20 可以用來進行disk sort; 

如果workarea_size_policy=manual 時, 排序需要的內存由sort_area_size 決定, 在執行order by/group by/distinct/union/create index/index rebuild/minus 等操作時, 如果在pga 或sort_area_size 中不能完成, 排序將在臨時表空間進行(disk sort ), 臨時表空間主要作用就是完成系統中的disk sort.

12.   存在表T(a,b,c,d), 要根據字段c 排序後取第21 —30 條記錄顯示,請給出sql

    SELECT   *

        FROM (SELECT ROWNUM AS row_num, tmp_tab.*

                FROM (SELECT   a, b, c, d

                          FROM T

                      ORDER BY c) tmp_tab

               WHERE ROWNUM <= 30)

       WHERE row_num >= 20

ORDER BY row_num;

 

create table t(a number(,b number(,c number(,d number();

begin 

for i in 1 .. 300 loop 

insert into t values(mod(i,2),i/2,dbms_random.value(1,300),i/4); 

end loop;

end; 

/

select * from (select c.*,rownum as rn from (select * from t order by c desc) c) where rn between 21 and 30;

/

select * from (select * from test order by c desc) x where rownum &lt; 30

minus

select * from (select * from test order by c desc) y where rownum &lt; 20 order by 3 desc 

相比之 minus 性能較差

二:數據庫基本概念類

1 Pctused and pctfree 表示什麼含義有什麼作用

pctused 與pctfree 控制數據塊是否出現在freelist 中,  pctfree 控制數據塊中保留用於update 的空間, 當數據塊中的free space 小於pctfree 設置的空間時, 該數據塊從freelist 中去掉, 當塊由於dml 操作free space 大於pct_used 設置的空間時, 該數據庫塊將被添加在freelist 鏈表中。

2 簡單描述tablespace / segment / extent / block 之間的關係

tablespace: 一個數據庫劃分爲一個或多個邏輯單位,該邏輯單位成爲表空間; 每一個表空間可能包含一個或多個 Segment;

Segments: Segment 指在tablespace 中爲特定邏輯存儲結構分配的空間。每一個段是由一個或多個extent 組成。包括數據段、索引段、回滾段和臨時段。

Extents: 一個 extent 由一系列連續的 Oracle blocks 組成.ORACLE 爲通過extent 來給segment 分配空間。

Data Blocks :Oracle 數據庫最小的I/O 存儲單位,一個data block 對應一個或多個分配給data file 的操作系統塊。

table 創建時, 默認創建了一個data segment, 每個data segment 含有min extents 指定的extents 數, 每個extent 據據表空間的存儲參數分配一定數量的blocks

3 描述tablespace 和datafile 之間的關係

一個表空間可包含一個或多個數據文件。表空間利用增加或擴展數據文件擴大表空間,表空間的大小爲組成該表空間的數據文件大小的和。一個datafile 只能屬於一個表空間;

一個tablespace 可以有一個或多個datafile, 每個datafile 只能在一個tablespace 內, table 中的數據, 通過hash 算法分佈在tablespace 中的各個datafile 中,tablespace 是邏輯上的概念,datafile 則在物理上儲存了數據庫的種種對象。

4 本地管理表空間和字典管理表空間的特點,ASSM 有什麼特點

本地管理表空間:(9i 默認)空閒塊列表存儲在表空間的數據文件頭。

特點:減少數據字典表的競爭,當分配和收縮空間時會產生回滾,不需要合併。

字典管理表空間:(8i 默認)空閒塊列表存儲在數據庫中的字典表裏.

特點:片由數據字典管理,可能造成字典表的爭用。存儲在表空間的每一個段都會有不同的存儲字句,需要合併相鄰的塊;

 

本地管理表空間(Locally Managed Tablespace 簡稱LMT )

8i 以後出現的一種新的表空間的管理模式,通過位圖來管理表空間的空間使用。字典管理表空間(Dictionary-Managed Tablespace 簡稱DMT ) 

8i 以前包括以後都還可以使用的一種表空間管理模式,通過數據字典管理表空間的空間使用。動段空間管理(ASSM ),它首次出現在Oracle920 裏有了ASSM ,鏈接列表freelist 被位圖所取代,它是一個二進制的數組, 

能夠迅速有效地管理存儲擴展和剩餘區塊(free block ),因此能夠改善分段存儲本質,ASSM 表空間上創建的段還有另外一個稱呼叫Bitmap Managed Segments (BMB 段)。

5 回滾段的作用是什麼

回滾段用於保存數據修改前的映象,這些信息用於生成讀一致性數據庫信息、在數據庫恢復和Rollback 時使用。一個事務只能使用一個回滾段。

 

事務回滾:當事務修改表中數據的時候,該數據修改前的值(即前影像)會存放在回滾段中,當用戶回滾事務(ROLLBACK )時,ORACLE 將會利用回滾段中的數據前影像來將修改的數據恢復到原來的值。 

事務恢復:當事務正在處理的時候,例程失敗,回滾段的信息保存在undo 表空間中,ORACLE 將在下次打開數據庫時利用回滾來恢復未提交的數據。

讀一致性:當一個會話正在修改數據時,其他的會話將看不到該會話未提交的修改。  當一個語句正在執行時,該語句將看不到從該語句開始執行後的未提交的修改(語句級讀一致性) 

當ORACLE 執行SELECT 語句時,ORACLE 依照當前的系統改變號(SYSTEM CHANGE NUMBER-SCN )  來保證任何前於當前SCN 的未提交的改變不被該語句處理。可以想象:當一個長時間的查詢正在執行時,  若其他會話改變了該查詢要查詢的某個數據塊,ORACLE 將利用回滾段的數據前影像來構造一個讀一致性視圖

6 日誌的作用是什麼

日誌文件(Log File )記錄所有對數據庫數據的修改,主要是保護數據庫以防止故障, 以及恢復數據時使用。其特點如下:

  a) 每一個數據庫至少包含兩個日誌文件組。每個日誌文件組至少包含兩個日誌文件成員。

  b) 日誌文件組以循環方式進行寫操作。

  c) 每一個日誌文件成員對應一個物理文件。

 

記錄數據庫事務, 最大限度地保證數據的一致性與安全性  

重做日誌文件:含對數據庫所做的更改記錄,這樣萬一出現故障可以啓用數據恢復, 一個數據庫至少需要兩個重做日誌文件 

歸檔日誌文件:是重做日誌文件的脫機副本,這些副本可能對於從介質失敗中進行恢復很必要。

7 SGA 主要有那些部分,主要作用是什麼

系統全局區(SGA ): 是ORACLE 爲實例分配的一組共享緩衝存儲區,用於存放數據庫數據和控制信息,以實現對數據庫數據的管理和操作。

SGA 主要包括:

a) 共享池(shared pool) :用來存儲最近執行的SQL 語句和最近使用的數據字典的數據。

b) 數據緩衝區 (database buffer cache) :用來存儲最近從數據文件中讀寫過的數據。

c) 重作日誌緩衝區(redo log buffer ):用來記錄服務或後臺進程對數據庫的操作。

另外在SGA 中還有兩個可選的內存結構:

d)Java pool:  用來存儲Java 代碼。

e)Large pool: 用來存儲不與SQL 直接相關的大型內存結構。備份、恢復使用。

 

GA :db_cache/shared_pool/large_pool/java_pool 

db_cache: 數據庫緩存(Block Buffer )對於Oracle 數據庫的運轉和性能起着非常關鍵的作用,它佔據Oracle 數據庫SGA (系統共享內存區)的主要部分。Oracle 數據庫通過使用LRU 算法,將最近訪問的數據塊存放到緩存中,從而優化對磁盤數據的訪問.

shared_pool: 共享池的大小對於Oracle 性能來說都是很重要的。共享池中保存數據字典高速緩衝和完全解析或編譯的的PL/SQL 塊和SQL 語句及控制結構 

large_pool: 使用MTS 配置時,因爲要在SGA 中分配UGA 來保持用戶的會話,就是用Large_pool 來保持這個會話內存使用RMAN 做備份的時候,要使用Large_pool 這個內存結構來做磁盤I/O 緩存器 

java_pool: 爲java procedure 預備的內存區域, 如果沒有使用java proc,java_pool 不是必須的

8 Oracle 系統進程主要有哪些,作用是什麼

數據寫進程(DBWR) :負責將更改的數據從數據庫緩衝區高速緩存寫入數據文件

日誌寫進程(LGWR) :將重做日誌緩衝區中的更改寫入在線重做日誌文件

系統監控  (SMON): 檢查數據庫的一致性如有必要還會在數據庫打開時啓動數據庫的恢復

進程監控  (PMON): 負責在一個Oracle 進程失敗時清理資源

檢查點進程(CKPT) :負責在每當緩衝區高速緩存中的更改永久地記錄在數據庫中時, 更新控制文件和數據文件中的數據庫狀態信息。

歸檔進程  (ARCH) :在每次日誌切換時把已滿的日誌組進行備份或歸檔

恢復進程  (RECO): 保證分佈式事務的一致性, 在分佈式事務中, 要麼同時commit, 要麼同時rollback;

作業調度器(CJQ ):  負責將調度與執行系統中已定義好的job, 完成一些預定義的工作.

三:備份恢復類

1 備份如何分類

邏輯備份:exp/imp  指定表的邏輯備份

物理備份: 

熱備份:alter tablespace begin/end backup; 

冷備份: 脫機備份(database shutdown)

RMAN 備份 

full backup/incremental backup( 累積/ 差異) 

 

物理備份

物理備份是最主要的備份方式。用於保證數據庫在最小的數據庫丟失或沒有數據丟失的情況下得到恢復。

冷物理

冷物理備份提供了最簡單和最直接的方法保護數據庫因物理損壞丟失。建議在以下幾種情況中使用。

對一個已經存在大最數據量的數據庫,在晚間數據庫可以關閉,此時應用冷物理備份。

對需對數據庫服務器進行升級,(如更換硬盤),此時需要備份數據庫信息,並在新的硬盤中恢復這些數據信息,建議採用冷物理備份。

熱物理

主要是指備份過程在數據庫打開並且用戶可以使用的情況下進行。需要執行熱物理備份的情況有:

由於數據庫性質要求不間斷工作,因而此時只能採用熱物理備份。

由於備份的要求的時間過長,而數據庫只能短時間關閉時。

邏輯備份 (EXP/IMP)

邏輯備份用於實現數據庫對象的恢復。但不是基於時間點可完全恢復的備份策略。只能作爲聯機備份和脫機備份的一種補充。

完全邏輯備份

完全邏輯備份是將整個數據庫導出到一個數據庫的格式文件中,該文件可以在不同的數據庫版本、操作系統和硬件平臺之間進行移植。

指定表的邏輯備份

通過備份工具,可以將指定的數據庫表備份出來,這可以避免完全邏輯備份所帶來的時間和財力上的浪費。

2 歸檔是什麼含義 

關於歸檔日誌:Oracle 要將填滿的在線日誌文件組歸檔時, 則要建立歸檔日誌(archived redo log )。其對數據庫備份和恢復有下列用處: 

數據庫後備以及在線和歸檔日誌文件,在操作系統和磁盤故障中可保證全部提交的事物可被恢復。 

在數據庫打開和正常系統使用下,如果歸檔日誌是永久保存,在線後備可以進行和使用。 

數據庫可運行在兩種不同方式下:NOARCHIVELOG 方式或ARCHIVELOG 方式 

數據庫在NOARCHIVELOG 方式下使用時,不能進行在線日誌的歸檔, 

數據庫在ARCHIVELOG 方式下運行,可實施在線日誌的歸檔

 

歸檔是歸檔當前的聯機redo 日誌文件。

SVRMGR> alter system archive log current;

數據庫只有運行在ARCHIVELOG 模式下,並且能夠進行自動歸檔,纔可以進行聯機備份。有了聯機備份纔有可能進行完全恢復。

3 如果一個表在2004-08-04 10:30:00 被drop ,在有完善的歸檔和備份的情況下,如何恢復

9i 新增的FLASH BACK 應該可以;

Logminer 應該可以找出DML 。

有完善的歸檔和備份,先歸檔當前數據,然後可以先恢復到刪除的時間點之前,把DROP 的表導出來,然後再恢復到最後歸檔時間;

手工拷貝回所有備份的數據文件 

Sql 〉startup mount; 

sql 〉alter database recover automatic until time '2004-08-04:10:30:00'; 

sql 〉alter database open resetlogs;

4 rman 是什麼,有何特點

RMAN(Recovery Manager) 是DBA 的一個重要工具,用於備份、還原和恢復oracle 數據庫, RMAN 可以用來備份和恢復數據庫文件、歸檔日誌、控制文件、系統參數文件, 也可以用來執行完全或不完全的數據庫恢復。 

RMAN 有三種不同的用戶接口:COMMAND LINE 方式、GUI 方式(集成在OEM 中的備份管理器)、API 方式(用於集成到第三方的備份軟件中)。 

具有如下特點: 

1 )功能類似物理備份,但比物理備份強大N 倍; 

2 )可以壓縮空塊; 

3 )可以在塊水平上實現增量; 

4 )可以把備份的輸出打包成備份集,也可以按固定大小分割備份集; 

5 )備份與恢復的過程可以自動管理; 

6 )可以使用腳本(存在Recovery catalog 中) 

7 )可以做壞塊監測

5 standby 的特點

備用數據庫(standby database ):ORACLE 推出的一種高可用性(HIGH AVAILABLE) 數據庫方案,在主節點與備用節點間通過日誌同步來保證數據的同步,備用節點作爲主節點的備份,可以實現快速切換與災難性恢復, 從920 開始,還開始支持物理與邏輯備用服務器。

9i 中的三種數據保護模式分別是:

1) 、MAXIMIZE PROTECTION :最大數據保護與無數據分歧,LGWR 將同時傳送到備用節點,在主節點事務確認之前,備用節點也必須完全收到日誌數據。如果網絡不好,引起LGWR 不能傳送數據,將引起嚴重的性能問題,導致主節點DOWN 機。 

2) 、MAXIMIZE AVAILABILITY :無數據丟失模式,允許數據分歧,允許異步傳送。 

正常情況下運行在最大保護模式,在主節點與備用節點的網絡斷開或連接不正常時,自動切換到最大性能模式,主節點的操作還是可以繼續的。在網絡不好的情況下有較大的性能影響。 

3) 、MAXIMIZE PERFORMANCE :這種模式應當可以說是從8i 繼承過來的備用服務器模式,異步傳送,無數據同步檢查,可能丟失數據,但是能獲得主節點的最大性能。9i 在配置DATA GUARD 的時候默認就是MAXIMIZE PERFORMANCE

6 對於一個要求恢復時間比較短的系統( 數據庫50G , 每天歸檔5G ) ,你如何設計備份策略

數據庫比較大邏輯備份沒什麼必要,每天歸檔5G ,每週三/ 週六自動歸檔10G ,每月RMAN 歸檔全庫。應該有standby 。

rman/ 每月一號 level 0 每週末/ 週三 level 1 其它每天level 2

四:系統管理類

1.       對於一個存在系統性能的系統,說出你的診斷處理思路

ü          做statspack 收集系統相關信息  瞭解系統大致情況/ 確定是否存在參數設置不合適的地方/ 查看top 5 event/ 查看top sql 等

ü          查v$system_event/v$session_event/v$session_wait 從v$system_event 開始, 確定需要什麼資源(db file sequential read) 等,深入研究v$session_event, 確定等待事件涉及的會話,從v$session_wait 確定詳細的資源爭用情況(p1-p3 的值:file_id/block_id/blocks 等)

ü          通過v$sql/v$sqltext/v$sqlarea 表確定disk_reads 、(buffer_gets/executions) 值較大的SQL

2.       列舉幾種診斷IO 、CPU 、性能狀況的方法

top  uptime  vmstat  iostat  statspack  sql_trace/tkprof

查v$system_event/v$session_event/v$session_wait

查v$sqlarea(disk_reads 或buffer_gets/executions 較大的SQL)

或者第三方的監視工具,TOAD 就不錯。

3.       對statspack 有何認識

認識不深。僅限瞭解。StapSpack 是Oracle 公司提供的一個收集數據庫運行性能指標的軟件包。可以做數據庫健康檢查報告。

StapSpack 是Oracle 公司提供的一個收集數據庫運行性能指標的軟件包,該軟件包從8i 起,在9i 、10g 都有顯著的增強 

該軟件包的輔助表(存儲相關參數與收集的性能指標的表)由最初的25 個增長到43 個 

收集級別參數由原來的3 個(0 、5 、10 )增加到5 個(0 、5 、6 、7 、10 ) 

通過分析收集的性能指標,數據庫管理員可以詳細地瞭解數據庫目前的運行情況,對數據庫實例、等待事件、SQL 等進行優化調整 

利用statspack 收集的snapshot, 可以統計製作數據庫的各種性能指標的統計趨勢圖表。

4.       如果系統現在需要在一個很大的表上創建一個索引,你會考慮那些因素,如何做以儘量減小對應用的影響

可以先表分析一下,然後測試創建索引前後對應用的性能影響;

需要考慮的是該索引列不經常更新,不是有很多重複值的情況時, 在大表中使用索引特別有效. 創建的索引可以跟數據表分不同表空間存儲。

 

在系統比較空閒時nologging 選項(如果有dataguard 則不可以使用nologging ) 

大的sort_ared_size 或pga_aggregate_target 較大

5.       對raid10 和raid5 有何認識

RAID 10( 或稱RAID 1 +0) 與RAID 0 +1 不同,它是用硬盤驅動器先組成RAID 1 陣列,然後在RAID 1 陣列之間再組成RAID 0 陣列。 

RAID 10 模式同RAID 0+1 模式一樣具有良好的數據傳輸性能,但卻比RAID 0+1 具有更高的可靠性。RAID 10 陣列的實際容量爲M×n/2 ,磁盤利用率爲50 %。RAID 10 也需要至少4 個硬盤驅動器構成,因而價格昂貴。 

RAID 10 的可靠性同RAID 1 一樣,但由於RAID 10 硬盤驅動器之間有數據分割,因而數據傳輸性能優良。  

RAID 5 與RAID 3 很相似,不同之處在於RAID 5 的奇偶校驗信息也同數據一樣被分割保存到所有的硬盤驅動器,而不是寫入一個指定的硬盤驅動器,從而消除了單個奇偶校驗硬盤驅動器的瓶頸問題。RAID 5 磁盤陣列的性能比RAID 3 有所提高,但仍然需要至少3 塊硬盤驅動器。其實際容量爲M×(n-1) ,磁盤利用率爲(n-1)/n 。  

五:綜合隨意類

1.       你最擅長的是oracle 哪部分?

pl/sql 及sql 優化

2.       喜歡oracle 嗎?喜歡上論壇嗎?或者偏好oracle 的哪一部分?

  喜歡。PL/SQL 比較得心應手。

3.       隨意說說你覺得oracle 最有意思的部分或者最困難的部分

我對數據庫的備份/ 恢復和性能調優經驗明顯不足,自然覺得有些困難。

基於ORACLE 的研究應該是個寬廣的領域,所以我覺得還是有意思的。

4.       爲何要選擇做DBA 呢?

我對數據庫的備份/ 恢復和性能調優經驗明顯不足,主要是缺乏環境和交流。

因此,算不上什麼DBA 。不過因此我更需要這樣的機會。

不過就整個ORACLE 來說,一直從事與它相關的工作,感情還是頗深的。放棄可惜。而且就技術本身而言我覺得自己還是有學習和創新的能力,它的諸如數據倉庫,數據挖掘之類的領域也很廣。

六: Databases Questions & Answers

1.       What are two methods of retrieving SQL?  

2.       What cursor type do you use to retrieve multiple recordsets?

3.       What action do you have to perform before retrieving data from the next result set of a stored procedure?

Move the cursor down one row from its current position. A ResultSet cursor is initially positioned before the first row. Before you can get to the first row, you would need to Move the cursor down by one row ( For ex: in java the first call to next makes the first row the current row; the second call makes the second row the current row, and so on).

4.       What is the basic form of a SQL statement to read data out of a table?

SELECT * FROM table_name;

5.       What structure can you have the database make to speed up table reads?

The question is not correct. "What structure can you have the database make to speed up table reads?" It is not clear what exactly the term "structure" means in this case. Follow the rules of DB tuning we have to:

1) properly use indexes ( different types of indexes)

2) properly locate different DB objects across different tablespaces, files and so on.

3) Create a special space (tablespace) to locate some of the data with special datatypes( for example CLOB, LOB and ...)

6.       What is a "join"?

Joins merge the data of two related tables into a single result set, presenting a denormalized view of the data.

7.       What is a "constraint"?

  A constraint allows you to apply simple referential integrity checks to a table. There are 5 primary types of constraints that are currently supported by SQL Server:

  PRIMARY/UNIQUE - enforces uniqueness of a particular table column.

  DEFAULT - specifies a default value for a column in case an insert operation does not provide one.

  FOREIGN KEY - validates that every value in a column exists in a column of another table.

  CHECK - checks that every value stored in a column is in some specified list

  NOT NULL - is a constraint which does not allow values in the specific column to be null. And also it is the only constraint which is not a table level constraint.

8.       What is a "primary key"?

Primary Key is a type of a constraint enforcing uniqueness and data integrity for each row of a table. All columns participating in a primary key constraint must possess the NOT NULL property.

9.       What is a "functional dependency"? How does it relate to database table design?

What functional dependence in the context of a database means is that: Assume that a table exists in the database called TABLE with a composite primary key (A, B) and other non-key attributes (C, D, E). Functional dependency in general, would mean that any non-key attribute - C D or E being dependent on the primary key (A and B) in our table here.

  Partial functional dependency, on the other hand, is another corollary of the above, which states that all non-key attributes - C D or E - if dependent on the subset of the primary key (A and B) and not on it as a whole.

  Example :

  ----------

  Fully Functional Dependent : C D E --> A B

  Partial Functional dependency : C --> A, D E --> B

  Hope that helps!

10.   What is a "trigger"?

A trigger is a database object directly associated with a particular table. It fires whenever a specific statement/type of statement is issued against that table. The types of statements are insert, update, delete and query statements. Basically, trigger is a set of SQL statements that execute in response to a data modification/retrieval event on a table.

Other than table triggers there are also schema and database triggers. These can be made to fire when new objects are created, when a user logs in, when the database shutdown etc. Table level triggers can be classified into row and statement level triggers and those can be further broken down into before and after triggers. Before triggers can modify data.

11.   What is "index covering" of a query?

A nonclustered index that includes (or covers) all columns used in a query is called a covering index. When SQL server can use a nonclustered index to resolve the query, it will prefer to scan the index rather than the table, which typically takes fewer data pages. If your query uses only columns included in the index, then SQL server may scan this index to produce the desired output.

12.   What is a SQL view?

View is a precomplied SQL query which is used to select data from one or more tables. A view is like a table but it doesn't physically take any space. View is a good way to present data in a particular format if you use that query quite often.

View can also be used to restrict users from accessing the tables directly.

A view otherwise known as a virtual table is a mere window over the base tables in the database. This helps us gain a couple of advantages:

1) Inherent security exposing only the data that is needed to be shown to the end user

2) Views are updateable based on certain conditions. For example, updates can only be directed to one underlying table of the view. After modification if the rows or columns don't comply with the conditions that the view was created with, those rows disappear from the view. You could use the CHECK OPTION with the view definition, to make sure that any updates to make the rows invalid will not be permitted to run.

3) Views are not materialized (given a physical structure) in a database. Each time a view is queried the definition stored in the database is run against the base tables to retrieve the data. One exception to this is to create a clustered index on the view to make it persistent in the database. Once you create a clustered index on the view, you can create any number of non-clustered indexes on the view.

13.   存儲過程和函數的區別

存儲過程是用戶定義的一系列sql 語句的集合,涉及特定表或其它對象的任務,用戶可以調用存儲過程,而函數通常是數據庫已定義的方法,它接收參數並返回某種類型的值並且不涉及特定用戶表。

14.   事務是什麼?

事務是作爲一個邏輯單元執行的一系列操作,一個邏輯工作單元必須有四個屬性,稱爲 ACID( 原子性、一致性、隔離性和持久性) 屬性,只有這樣才能成爲一個事務:

原子性:事務必須是原子工作單元; 對於其數據修改,要麼全都執行,要麼全都不執行。

一致性:事務在完成時,必須使所有的數據都保持一致狀態。在相關數據庫中,所有規則都必須應用於事務的修改,以保持所有數據的完整性。事務結束時,所有的內部數據結構( 如 B 樹索引或雙向鏈表) 都必須是正確的。

隔離性:由併發事務所作的修改必須與任何其它併發事務所作的修改隔離。事務查看數據時數據所處的狀態,要麼是另一併發事務修改它之前的狀態,要麼是另一事務修改它之後的狀態,事務不會查看中間狀態的數據。這稱爲可串行性,因爲它能夠重新裝載起始數據,並且重播一系列事務,以使數據結束時的狀態與原始事務執行的狀態相同。

持久性:事務完成之後,它對於系統的影響是永久性的。該修改即使出現系統故障也將一直保持。

15.   遊標的作用? 如何知道遊標已經到了最後?

遊標 用於 定位結果集的行,通過判斷全局變量@@FETCH_STATUS 可以判斷是否到了最後,通常此變量不等於0 表示出錯或到了最後。

16.   觸發器分爲事前觸發和事後觸發,這兩種觸發有和區別。語句級觸發和行級觸發有何區別。

事前觸發器運行於觸發事件發生之前,而事後觸發器運行於觸發事件發生之後。通常事前觸發器可以獲取事件之前和新的字段值。

語句級觸發器可以在語句執行前或後執行,而行級觸發在觸發器所影響的每一行觸發一次。

17.   SQL Server 常用測試題(1)

問題描述:

爲管理崗位業務培訓信息,建立3 個表:

S (S#,SN,SD,SA) S#,SN,SD,SA 分別代表學號、學員姓名、所屬單位、學員年齡

C (C#,CN ) C#,CN 分別代表課程編號、課程名稱

SC ( S#,C#,G ) S#,C#,G 分別代表學號、所選修的課程編號、學習成績

 

1. 使用標準SQL 嵌套語句查詢選修課程名稱爲’ 稅收基礎’ 的學員學號和姓名

  -- 實現代碼:

SELECT SN,SD FROM S

WHERE [S#] IN(SELECT [S#] FROM C,SC WHERE C.[C#]=SC.[C#] AND CN=N' 稅收基礎')

 

2. 使用標準SQL 嵌套語句查詢選修課程編號爲’C2’ 的學員姓名和所屬單位

  -- 實現代碼:

SELECT S.SN,S.SD FROM S,SC

WHERE S.[S#]=SC.[S#] AND SC.[C#]='C2'

 

3. 使用標準SQL 嵌套語句查詢不選修課程編號爲’C5’ 的學員姓名和所屬單位

  -- 實現代碼:

SELECT SN,SD FROM S

WHERE [S#] NOT IN(SELECT [S#] FROM SC WHERE [C#]='C5')

 

4. 使用標準SQL 嵌套語句查詢選修全部課程的學員姓名和所屬單位

  -- 實現代碼:

SELECT SN,SD FROM S

WHERE [S#] IN( SELECT [S#] FROM SC RIGHT JOIN

  C ON SC.[C#]=C.[C#] GROUP BY [S#]

HAVING COUNT(*)=COUNT([S#]))

5. 查詢選修了課程的學員人數

  -- 實現代碼:

  SELECT 學員人數=COUNT(DISTINCT [S#]) FROM SC

6. 查詢選修課程超過5 門的學員學號和所屬單位

  -- 實現代碼:

  SELECT SN,SD FROM S

  WHERE [S#] IN(

  SELECT [S#] FROM SC

  GROUP BY [S#]

  HAVING COUNT(DISTINCT [C#])>5)

  

18.   SQL Server 常用測試題(2)

問題描述:

已知關係模式:

S (SNO,SNAME) 學生關係。SNO 爲學號,SNAME 爲姓名

C (CNO,CNAME,CTEACHER) 課程關係。CNO 爲課程號,CNAME 爲課程名,CTEACHER 爲任課教師

SC(SNO,CNO,SCGRADE) 選課關係。SCGRADE 爲成績

 

1. 找出沒有選修過“ 李明” 老師講授課程的所有學生姓名

-- 實現代碼:

SELECT SNAME FROM S

WHERE NOT EXISTS(

SELECT * FROM SC,C WHERE SC.CNO=C.CNO AND CNAME=' 李明' AND SC.SNO=S.SNO)

 

2. 列出有二門以上( 含兩門) 不及格課程的學生姓名及其平均成績

-- 實現代碼:

SELECT S.SNO,S.SNAME,AVG_SCGRADE=AVG(SC.SCGRADE)

FROM S,SC,(

SELECT SNO FROM SC WHERE SCGRADE<60 GROUP BY SNO

HAVING COUNT(DISTINCT CNO)>=2)A WHERE S.SNO=A.SNO AND SC.SNO=A.SNO

GROUP BY S.SNO,S.SNAME

 

3. 列出既學過“1” 號課程,又學過“2” 號課程的所有學生姓名

  -- 實現代碼:

  SELECT S.SNO,S.SNAME

  FROM S,(SELECT SC.SNO FROM SC,C

  WHERE SC.CNO=C.CNO AND C.CNAME IN('1','2')

  GROUP BY SNO

  HAVING COUNT(DISTINCT CNO)=2

  )SC WHERE S.SNO=SC.SNO

 

4. 列出“1” 號課成績比“2” 號同學該門課成績高的所有學生的學號

  -- 實現代碼:

  SELECT S.SNO,S.SNAME

  FROM S,(

  SELECT SC1.SNO

  FROM SC SC1,C C1,SC SC2,C C2

  WHERE SC1.CNO=C1.CNO AND C1.NAME='1'

  AND SC2.CNO=C2.CNO AND C2.NAME='2'

  AND SC1.SCGRADE>SC2.SCGRADE

  )SC WHERE S.SNO=SC.SNO

 

5. 列出“1” 號課成績比“2” 號課成績高的所有學生的學號及其“1” 號課和“2” 號課的成績

  -- 實現代碼:

  SELECT S.SNO,S.SNAME,SC.[1 號課成績],SC.[2 號課成績]

  FROM S,(

  SELECT SC1.SNO,[1 號課成績]=SC1.SCGRADE,[2 號課成績]=SC2.SCGRADE

  FROM SC SC1,C C1,SC SC2,C C2

  WHERE SC1.CNO=C1.CNO AND C1.NAME='1'

  AND SC2.CNO=C2.CNO AND C2.NAME='2'

  AND SC1.SCGRADE>SC2.SCGRADE

  )SC WHERE S.SNO=SC.SNO

19.   Question 1 : Can you use a batch SQL or store procedure to calculating the Number of Days in a Month

找出當月的天數
select datepart(dd,dateadd(dd,-1,dateadd(mm,1,cast(cast(year(getdate()) as varchar)+'-'+cast(month(getdate()) as varchar)+'-01' as datetime))))

 

20.   Question2 :Can you use a SQL statement to calculating it!
How can I print "10 to 20" for books that sell for between $10 and $20 ,"unknown" for books whose price is null, and "other" for all other prices?


select bookid,bookname,price=case when price is null then 'unknown'

when  price between 10 and 20 then '10 to 20' else price end
from books

21.     Question3 :Can you use a SQL statement to finding duplicate values!
How can I find authors with the same last name?
You can use the table authors in datatabase pubs. I want to get the result as below:
Output:
au_lname                                 number_dups
---------------------------------------- -----------
Ringer                                   2
(1 row(s) affected)
Answer 3
select au_lname,number_dups=count(1) from authors group by au_lname

22.   Question4 :Can you create a cross-tab report in my SQL Server!
How can I get the report about sale quality for each store and each quarter and the total sale quality for each quarter at year 1993?
You can use the table sales and stores in datatabase pubs.
Table Sales record all sale detail item for each store. Column store_id is the id of each store, ord_date is the order date of each sale item, and column qty is the sale qulity. Table stores record all store information.
I want to get the result look like as below:
Output:

stor_name                                Total       Qtr1        Qtr2        Qtr3        Qtr4       
---------------------------------------- ----------- ----------- ----------- ----------- -----------
Barnum's                                 50          0           50          0           0
Bookbeat                                 55          25          30          0           0
Doc-U-Mat: Quality Laundry and Books     85          0           85          0           0
Fricative Bookshop                       60          35          0           0           25
Total                                    250         60          165         0           25


Answer 4 : 用動態SQL 實現

23.   Question5: The Fastest Way to Recompile All Stored Procedures
I have a problem with a database running in SQL Server 6.5 (Service Pack 4). We moved the database (object transfer) from one machine to another last night, and an error (specific to a stored procedure) is cropping up. However, I can't tell which procedure is causing it. Permissions are granted in all of our stored procedures; is there a way from the isql utility to force all stored procedures to recompile?

Tips: sp_recompile can recomplie a store procedure each time
Answer 5 : 在執行存儲過程時, 使用 with recompile 選項強制編譯新的計劃;使用sp_recompile 系統存儲過程強制在下次運行時進行重新編譯

24.   Question6: How can I add row numbers to my result set?
In database pubs, have a table titles , now I want the result shown as below,each row have a row number, how can you do that?
Result:

line-no     title_id
----------- --------
1           BU1032
2           BU1111
3           BU2075
4           BU7832
5           MC2222
6           MC3021
7           MC3026
8           PC1035
9           PC8888
10          PC9999
11          PS1372
12          PS2091
13          PS2106
14          PS3333
15          PS7777
16          TC3218
17          TC4203
18          TC7777

Answer 6 :
--SQL 2005 的寫法
select row_number() as line_no ,title_id from titles
--SQL 2000 的寫法
select line_no identity(int,1,1),title_id into #t from titles
select * from #t
drop table #t

25.   Question 7: Can you tell me what the difference of two SQL statements at performance of execution?


Statement 1:
if NOT EXISTS ( select * from publishers where state = 'NY')
begin
SELECT 'Sales force needs to penetrate New York market'
end
else
begin
SELECT 'We have publishers in New York'
end
Statement 2:
if EXISTS ( select * from publishers where state = 'NY')
begin
SELECT 'We have publishers in New York'
end
else
begin
SELECT 'Sales force needs to penetrate New York market'
end
Answer 7 : 不同點: 執行時的事務數, 處理時間, 從客戶端到服務器端傳送的數據量大小

26.   Question8: How can I list all California authors regardless of whether they have written a book?
In database pubs, have a table authors and titleauthor , table authors has a column state, and titleauhtor have books each author written.
CA behalf of california in table authors.
Answer 8 :
select * from  authors where state='CA'

27.   Question9: How can I get a list of the stores that have bought both 'bussiness' and 'mod_cook' type books?
In database pubs, use three table stores,sales and titles to implement this requestment. Now I want to get the result as below:

stor_id stor_name                               
------- ----------------------------------------
...
7896    Fricative Bookshop
...
...
...
Answer 9 :
select distinct a.stor_id, a.stor_name from stores a,sales b,titles c
where a.stor_id=b.stor_id and b.title_id=c.title_id and c.type='business' and
exists(select 1 from sales k,titles g where stor_id=b.stor_id
and k.title_id=g.title_id and g.type='mod_cook')   

28.   Question10: How can I list non-contignous data?
In database pubs, I create a table test using statement as below, and I insert several row as below

create table test
( id int primary key )
go

insert into test values (1 )
insert into test values (2 )
insert into test values (3 )
insert into test values (4 )
insert into test values (5 )
insert into test values (6 )
insert into test values (8 )
insert into test values (9 )
insert into test values (11)
insert into test values (12)
insert into test values (13)
insert into test values (14)
insert into test values (18)
insert into test values (19)
go

Now I want to list the result of the non-contignous row as below,how can I do it?
Missing after Missing before
------------- --------------
6             8
9             11
...

Answer 10 :
select id from test t where not exists(select 1 from test where id=t.id+1)
or not exists(select 1 from test where id=t.id-1)

29.   Question11: How can I list all book with prices greather than the average price of books of the same type?
In database pubs, have a table named titles , its column named price mean the price of the book, and another named type mean the type of books.
Now I want to get the result as below:

type         title                                                                            price                
------------ -------------------------------------------------------------------------------- ---------------------
business     The Busy Executive's Database Guide                                              19.9900
...
...
...
...

Answer 11 :
select a.type,a.title,a.price from titles a,
(select type,price=avg(price) from titles group by type)b
where a.type=b.type and a.price>b.price

      試題點評:通覽整個試題,我們不難發現,這份試題是針對SQL Server 數據庫人員的。而從難度分析上來看,這份試題也屬於同類試題中比較難的了。之所以說它難,首先是限定時間的全英文試題;其次,儘管這份試題主要是考覈開發能力,但卻涉及到了算法的選擇和性能的調優;最後,這份試題還夾進了SQL Server 數據庫的升級問題。因此,綜上所述,我們估計這是一家從事程序外包工作的外企招聘後臺開發或與後臺開發相關的SQL Server 高級程序員的試題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章