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 1Can 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高級程序員的試題。



開心過好每一天。。。。。