基於oracle 11g 的SQL優化

1.查看當前數據庫版本:

     select* from v$version;(以下示例基於oracle 11.2.0.1.0)

2.ROWID

     oracle數據庫的表中的每一行數據都有一個唯一的標識符,該標識符表明了該行在oracle數據庫中的物理具體位置.

3.execute procedure 命令是在PL/SQL命令窗口執行的。

4.SQL/PLUS下查看執行計劃詳細信息

在這裏插入圖片描述
說明:
     recursive calls 用戶執行一條SQL語句的時候,Oracle必須調用其他的語句,這些額外調用的語句,就稱爲"recursive calls"
     consistent gets:一致性讀,爲了保持讀一致性而獲取的塊, 通常情況下針對select語句產生的
     db block gets:其實這個名字可能有點歧義,這個表示 no consistent gets,即非一致性讀, 通常情況下針對 dml語句產生的
     PhysicalReads(物理讀)物理讀的內容不在內存中,要去硬盤中讀入內存,包含了邏輯讀。
     PhysicalReads=dbblockgets+consistentgets;
     LogicalReads(邏輯讀)邏輯讀內容在內存中,不需要讀硬盤。
     logical reads= (db block gets + consistent gets) - physical reads。(這裏的- physical reads 表示排除物理讀)
所以不管是db block gets還是consistent gets,都可能出現了physical reads和logical reads兩種情況(由buffer中的是否已經存在需要的數據)
,也即是說,db block gets與consistent gets兩者已經構成了一次數據庫操作中讀取的所有block的總次數了。
因此,logical reads自然也就可以通過如下公式算的:logical reads= (db block gets + consistent gets) - physical reads。
     由於在Oracle中,取數據最後都是從Buffer中取,所以每出現一個physical reads必然會出現一次 logical reads,但是這裏有一個需要注意的地 方,就是當出現一個physical reads後接着會有一個logical reads這裏,實際上這裏只算了1 block(physical reads)!

5 sqlplus如何設置SQLPlus結果顯示的寬度

     SQLPlus查詢的結果可以根據自己的屏幕情況進行調節,設置如下:
     1.設置頁面顯示總行數
           show pagesize; //首先查看目前的pagesize,默認是14
           set pagesize 800; //將pagesize設置好800,則可以一次顯示夠多行記錄了
     2.設置行的寬度
           show linesize; //查看目前的linesize,默認是80
           set linesize 800; //設置成800或者更寬都可

6 查看執行計劃的幾種方式(常用)

1 explain plan(plsql中按 F5快捷鍵)

1.1 往 explain plan命令中添加目標SQL

     explain plan for select t.id,t2.user_name,t2.note from t_user t, t_user2 t2 where t.id=t2.id;

1.2 PLAN_TABLE$ 用來保存目標SQL的執行計劃對應的具體步驟

      select * from sys.PLAN_TABLE$;

1.3 查看PLAN_TABLE表中目標SQL執行計劃

      select * from table(dbms_xplan.display)
      說明1 explain plan 查看目標SQL 執行計劃時,目標SQL不會真正的執行。
      說明2 explain plan得到執行計劃不一定準確, 當explain plan 執行的目標SQL綁定變量時,得到執行計劃不準確
      說明3 explain plan 執行目標爲DML語句時會真正去執行,例如 delete from t1。

2 dbms_xplan(適用於SQLPLUS,執行完SQL後,執行)

 select * from table(dbms_xplan.display);
select * from table(dbms_xplan.display_cursor(null,null,'advanced'));
select * from table(dbms_xplan.display_cursor('sql_id/hash_value',child_cursor_number,'advanced'));
select * from table(dbms_xplan.display_awr('sql_id'));
-- 說明1  除第一個外,其它3個會真正執行目標SQL。
-- 說明1  除第一個外,其它三個能得到真實的執行計劃

3 autotrace開關(sqlplus)

     語法 set autotrace {off| on |traceonly } [explain] [statistics] 默認爲off
     set timing on (顯示執行時間)
     set autotrace on (顯示執行結果具體內容,執行計劃,統計信息)
     set autotrace traceonly (顯示執行結果數量,執行計劃,統計信息)
     set autotrace traceonly explain(顯示執行計劃)
     set autotrace traceonly statistics (顯示統計信息)
      說明1 set autotrace {on,traceonly},執行目標SQL時,目標SQL會真實被執行。
      說明2 上面所有autotrace 的執行計劃都來源於explain plan ,得到執行計劃不一定準確。

7.Buffer Cache與Shared Pool原理

7.1 Buffer Cache

在這裏插入圖片描述

7.2 Buffer Cache

在這裏插入圖片描述

7.3 清空共享池和緩存(sqlplus下)

      alter system flush shared_pool;
      alter system flush buffer_cache;

8.vsqlvsql和vsqlarea視圖

v$sqlarea和v$sql兩個視圖的不同之處在於,v$sql中爲每一條SQL保留一個條目,
而v$sqlarea中根據sql_text進行group by,通過version_count計算子指針的個數。 v$sqlarea和v$sql的數據存在於shared_pool。

8.1 v$sql 列信息

gffffff

8.2 v$sqlarea 列信息

在這裏插入圖片描述

9.位圖索引

9.1位圖索結構(左邊表數據,右邊位圖索引結構)

在這裏插入圖片描述

9.2說明:

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

10 執行計劃順序

10.1 執行計劃順序

在這裏插入圖片描述
示例:
在這裏插入圖片描述
執行步驟:4, 6 ,5, 3, 9, 10, 8 ,13, 12 ,11, 7, 2 ,1, 0
思路:由上往下找到的第一個並列是id爲3和7,靠上的(id=3)先執行,再看id=3裏面的節點信息, id=4和id=5並列,則上面的(id=4)先執行,然後再看下面,id=5裏面有葉子節點則先執行id=6再執行id=5, 接着看id=7裏面有id=8和id=11,按照靠上的先執行,則看id=8裏面的節點,裏面有id=9和id=10並列,則先執行id=9,再執行id=10,再接着看id=11裏面的節點,得知執行順序爲13,12,11 最後執行第一個並列節 點的父節點id=2,然後是2,1。
參考博客:http://blog.itpub.net/30126024/viewspace-2141974/

10.2 通過執行腳本顯示執行計劃順序

10.2.1 通過管理員賬號登陸後執行腳本 F:\WWK\xuexi\oracle\腳本\XPLAN_修正後.sql

    腳本包括2個類型和一個包,其中包分爲包聲明和包體,2都要分開執行,不然後會報錯。

10.2.2 然後執行 grant execute on sys.xplan to scott2(用戶名);

10.2.3 用scoot2登陸 操作如下:

在這裏插入圖片描述

11 表連接方式以及執行計劃

11.1 排序合併連接 Sort Merge

11.1.1 原理

在這裏插入圖片描述

11.1.2 優缺點及適應場景

在這裏插入圖片描述

11.1.3 執行計劃

在這裏插入圖片描述
說明:最先掃描t2全表,然後對t2.col2進行排序,然後掃描t1全表,然後對t2.col2進行排序,最後進行合併。

12 嵌套循環連接 Nested Loops

12.1.1 原理

在這裏插入圖片描述

12.1.2 優缺點及適應場景

在這裏插入圖片描述

12.1.3 執行計劃

在這裏插入圖片描述
說明 從執行步驟上看先執行 t2 全表掃描(t2 是驅動表),從t2表中取出一條記錄到t1表中遍歷尋找匹配記錄,成功後,再從t2表中取出一 條記錄再到t1表中遍歷匹配記錄,直至全部匹配完。

ordered user_no 則將t1設爲驅動表
在這裏插入圖片描述

14 反連接 Anit Join

14.1.1 描述

在這裏插入圖片描述

14.1.2 not in 和<>ALL執行計劃

        select * from t1 where col2 not  in (select col2 from t2);
        select * from t1 where col2 <> all (select col2 from t2);

在這裏插入圖片描述

14.1.3 not exists 執行計劃

在這裏插入圖片描述

14.1.4 當連接列上有NULL值時

在這裏插入圖片描述

15 半連接 Semi Join

15.1.1 描述

在這裏插入圖片描述

15.1.2 int, exists 執行計劃

在這裏插入圖片描述

16 AND-EQUEL(INDEX-MARGE)

16.1.1 描述

在這裏插入圖片描述

16.1.2 and-equel 執行計劃(如果謂詞有一個是唯一索引則不會走and-equal 則會走索引唯一掃描)

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

17 oracle裏如何做SQL優化

17.1 優化的本質

在這裏插入圖片描述

17.2 通過索引優化

17.2.1 用合適的索引來避免不必要的全表掃描。

在這裏插入圖片描述

17.2.1.1 單鍵值索引對NULL值是不走索引

在這裏插入圖片描述

17.2.1.2 複合值索引對NULL值是不走索引(創建複合索引,第二個參數爲常量0 create index idx_t1_object_name on t1_object(object_name,0);)

在這裏插入圖片描述

17.3.1 用合適的索引來避免不必要的排序。

17.3.1.1 沒有索引的排序

在這裏插入圖片描述

17.3.1.1 有索引的排序 idx_t1_boejct_id

在這裏插入圖片描述

發佈了4 篇原創文章 · 獲贊 5 · 訪問量 3141
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章