Posted on 2009-06-08 17:38 漠北的天空 閱讀(111) 評論(0) 編輯 收藏 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 < 30 minus select * from (select * from test order by c desc) y where rownum < 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)。其對數據庫備份和恢復有下列用處: 數據庫後備以及在線和歸檔日誌文件,在操做系統和磁盤故障中可保證所有提交的事物可被恢復。