Oracle查詢優化讀書筆記

本文爲讀書筆記<<Oracle查詢優化改寫2.0技巧與案例》-電子工業出版社(有教無類、落落著)html

---------------------------------------------------基礎----------------------------------------------------------------------------------sql

一、空值:查詢(is null)、處理空值(NVL(null,0)、COALESCE(null,null,0))、空值不支持運算(+-*/ 比較 相等) 查詢爲空、排序(升序在後降,手動更改:nulls first)、'' is null(爲true)dom

二、別名:AS 引用別名要再嵌套一層函數

三、拼接:||' '=>生成sql語句工具

四、列排序:列名(DESC ASC)、 序號(從1開始)、 多列排序(從左至右)、隨機排序(dbms_random.value)、條件排序(order by case when..)oop

五、關聯鏈接:INNER JOIN(兩表匹配)、LEFT JOIN(左表全部,右表匹配)、RIGTH JOIN(右表全部,左表匹配)、FULL JOIN(所有數據)fetch

  用(+) LEFT JOIN (+號在右表上) 連接與過濾條件(先過濾再JOIN 、先JOIN再關連)優化

六、多表插入:無條件INSERT 、有條件INSERT ALL WHEN THEN INTO 、INSERT FIRST WHEN THEN、轉置:Isert all into t1() values ('',仁) 同價於union all :不一樣列的數據插入到同一表中spa

七、批量更新:MERGE INTO EMP USING(select ...) DEPT ON (條件) when mathed then update set ... when not mathecd then insert ()code

八、樹形查詢:select LEVEL,(PRIOR 上級信息) from emp start with 開始條件 CONNECT BY LEVEL (PRIOR ID)=parentId  

    connect_by_isleaf isleaf:是否葉節點

    sys_connect_by_path(t.orgname,','):',

    排序:order SIBLINGS BY 

select level,t.orgname ,sys_connect_by_path(t.orgname,',') 
from AUTH_ORG t 
where connect_by_isleaf=1
start with t.parentid='-1' 
connect by (prior t.id)=t.parentid
order siblings by t.sortcode

九、分頁排序:select rn,ename from (select rownum as rn,ename from (select ename from emp where .. order by ..)  x where rownum<=10)) where rn>=6

                       select ename,rn from( select ename,row_number() over(patition deptid order by sal)as rn,ename from emp where)x where rn between 6 and 10;

十、partition by:分析函數,能夠與聚合函數一塊兒配合使用,OVER (PARTITION BY子句 ORDER BY子句 ROWS/RANGE子句),

     rows與range窗口子句:若是分析函數沒有指定ORDER BY子句,也就不存在ROWS/RANGE窗口的計算,range是邏輯窗口,是指定當前行對應值的範圍取值,列數不固定,只要行值在範圍內,對應列都包含在內;rows是物理窗口,即根據order by 子句排序後,取的前N行及後N行的數據計算

   unbounded:無界限 preceding:從分區第一行頭開始,則爲 unbounded。 N爲:相對當前行向前的偏移量 following :與preceding相反,到該分區結束,則爲 unbounded。N爲:相對當前行向後的偏移量 current row:顧名思義,當前行,偏移量爲0

     PARTITION BY W_PURCH_SCHEDULE_LINE_F.PRODUCT_WID ORDER BY TRUNC(W_DAY_D.DAY_DT) RANGE BETWEEN INTERVAL '2' day preceding and INTERVAL '1' day following

   經常使用分析函數:row_number() sum() max() count() 

十一、包結構:包含兩部分包規範和包體,包定義PACKAGE:包內公有元素(類型 變量名等) 包體PACKAGE BODY:包的實現 

十二、管道函數:能夠返回行集合,能夠像查詢物理表同樣查詢它或者將其賦值給集合變量;PRAGMA AUTONOMOUS_TRANSACTION使用自治事務使管道函數做爲獨立事務處理; 最後空返回:return;

1三、%TYPE定義方式:一個變量的數據類型與另外一個已經定義了的變量(尤爲是表的某一列)的數據類型  %ROWTYPE:使一個變量的數據類型與一個表中記錄的各個列的數據類型相對應、一致

1四、遊標: sys_refcursor;  open cur for select * from t ; loop fetch cur into v_row exit when cur%NOTFOUND(v_cur%notfound有三種狀態,true,false,null) pipe ROW(v_row) end loop; close cur; 

1五、

---------------------------------------------------技巧----------------------------------------------------------------------------------

一、刪除名稱重複的記錄:DELETE FROM TABLE T WHERE EXISTS(SELECT NULL FROM TABLE B WHERE B.NAME=T.NAME AND T.ROWID>B.ROWID)

二、計算字符在字符串中出現的次數:regexp_count(srcstr,pattern,position,modifer)

三、刪除字符串中不須要的字符:TRANSLATE(str,'1'||replace,'1') regexp_replace(str,'[replace]')

四、行變分隔列表:listagg(t.username,',') within group(order by t.no)

五、複製表:create table t_2 as select * from t where 1=2

6.

---------------------------------------------------執行計劃----------------------------------------------------------------------------------

explain plan --sql  select * from table(dbms_xplan.display());

一、執行計劃是一條查詢語句在Oracle中的執行過程或訪問路徑的描述

二、列的管理: 工具 —> 首選項 —> 窗口類型 —> 計劃窗口 —> 根據須要配置要顯示在執行計劃中的列

基數(Rows):Oracle估計的當前操做的返回結果集行數
字節(Bytes):執行該步驟後返回的字節數
耗費(COST)、CPU耗費:Oracle估計的該步驟的執行成本,用於說明SQL執行的代價,理論上越小越好(該值可能與實際有出入)
時間(Time):Oracle估計的當前操做所需的時間

三、常見描述:

表訪問的幾種方式:(非所有):表上存在選擇性很好的索引,卻走了全表掃描,並且是大表的全表掃描,就說明表的訪問方式可能存在問題,大表上沒有合適的索引而走了全表掃描,就須要分析可否創建索引,或者是否能選擇更合適的錶鏈接方式和鏈接順序以提升效率。
TABLE ACCESS FULL(全表掃描)
TABLE ACCESS BY ROWID(經過ROWID的表存取)
TABLE ACCESS BY INDEX SCAN(索引掃描)
索引掃描又分五種:
INDEX UNIQUE SCAN(索引惟一掃描)
INDEX RANGE SCAN(索引範圍掃描)
INDEX FULL SCAN(索引全掃描)
INDEX FAST FULL SCAN(索引快速掃描)
INDEX SKIP SCAN(索引跳躍掃描)

四、hint:詳見:https://www.cnblogs.com/emilyyoucan/p/7844795.html(hurong

五、Oracle優化器:基於規則的優化方式(Rule-Based Optimization,簡稱爲RBO)、基於代價的優化方式(Cost-Based Optimization,簡稱爲CBO)

    默認:Choolse:默認的狀況下Oracle用的即是這種方式。指的是當一個表或或索引有統計信息,則走CBO的方式,若是表或索引沒統計信息,表又不是特別的小,並且相應的列有索引時,那麼就走索引,走RBO的方式。

相關文章
相關標籤/搜索