一則簡單樣本看Oracle的“無私”健壯性,樣本oracle無私
Oracle的強大之處就在於他能總協助讓你選擇正確的執行計畫,即使你給了它錯誤的指示。
實驗:
1. 建立測試表:
收集統計資訊:
建立B樹索引:
2. 執行select id from tbl_plan;查看它的執行計畫:
因為建立了B樹索引,正常講可以從索引中獲得id的值,不用全表掃描,但這裡使用了全表掃描的方式。
即使使用了HINT,這依舊使用的是全表掃描:
原因在於這是個B樹索引,不會儲存NULL值,儘管這張表沒有NULL值。如果直接從可能包含NULL值的B樹索引中查詢記錄,NULL值不會儲存於索引,就會漏一些記錄,那麼查詢結果就會有錯,所以Oracle在此並沒有選擇使用索引掃描,而是進行的全表掃描。
3. 將id欄位設為非空:
相當於這是一個唯一性索引了。
再執行select id from tbl_plan;:
Oracle選擇的是索引快速全掃描,因為id是索引欄位,直接從索引中獲得值是最快速的方式。
如果是使用了HINT的方式:
這使用的是索引全掃描,不如索引快速全掃描,但至少HINT起到了作用,原因就在於從非空索引中獲得值是一種可靠的方式,因此Oracle允許HINT的使用。
總結:
從上面的簡單樣本可以看到,Oracle總會幫你選擇正確的執行計畫,即使你將錯誤的資訊給了Oracle,Oracle這種“無私”的精神值得我們學習,如果我們的應用系統也是這樣足夠健壯,那就更好了。
對於oracle的一個小問題---簡單說一下oracle的執行個體與常式,以及他們的聯絡
oracle的這2個概念可以看這裡:
執行個體:hi.baidu.com/...d.html
常式就是進程:hi.baidu.com/...9.html
資料庫執行個體就是一組oracle的後台進程/線程和共用記憶體地區的組合
所以說常式就是oracle執行個體的一部分。。
shutdown 是關閉資料庫。
資料庫和執行個體一般是一對一 你可以理解為關閉執行個體
一個簡單的oracle語句,
Oracle 的 SqlPlus
輸入了一段 SQL 陳述式之後。
如果是 SELECT 語句, 以分號 或者 / 結束,就可以執行了。
如果輸入的是一個 預存程序的語句,那麼最後輸入分號之後, 還不能運行。
非要輸入 / 才會執行
下面是個最簡單的例子:
SQL> set serveroutput on
SQL> BEGIN
2 dbms_output.put_line('Hello World');
3 END;
4 /
Hello World
PL/SQL procedure successfully completed
看到 第3行, 輸入一個 ; 實際上代碼已經都輸入完畢了。
但是沒有執行
非要在第4行,輸入一個 / 才執行。