oracle常識整理

Oracle SQL編寫注意事項
1.SQL語句用大寫的;因爲Oracle總是先解析SQL語句,把小寫的字母轉換成大寫的再執行。

2.數據表最好起別名;因爲便於sql優化器快速分析。

3.儘量不要使用 insert into table value(?,?,?,?,?)格式,要指出具體要賦值的字段。INSERT.....SELECT的效率會有提高。

4.select與from語句之間只定義返回的字段名,除非返回所有的字段,儘量不要使用 * 。

5.select字段名應按照表的字段物理順序編寫,字段提取要按照“需多少、提多少”的原則,原因是大批量數據的抽取會影響sql緩存的效率。

6.COUNT(*)也是要避免的,因爲Count(*)會對全字段做聚集。但一般的觀點相反, count(*) 比count(1)稍快 , 當然如果可以通過索引檢索,對索引列的計數仍舊是最快的. 例如 COUNT(EMPNO)。

7.條件中使用or 會引起全表掃描,比較影響查詢效率,儘可能少用或不用,實在不行可以用UNION代替。

8.儘量避免子查詢。假如子查詢不可避免,那麼要在子查詢中過濾掉儘可能多的行。能用直連接代替的就替換掉。

9.在SQL語句中,LIKE關鍵字支持通配符匹配,但這種匹配非凡耗費時間。例如:cust_nm like '%custnm%'。即使在cust_nm字段上建立了索引,在這種情況下也還是採用順序掃描的方式,查詢表中有1000條記錄,就需要比較1000次。 執行查詢時最好利用索引來查詢,會大大提高速度。可以改成方式:instr(‘cust_nm’, ‘AAA’,1)>0.

10.Distinct :使用distinct是爲了保證在結果集中不出現重複值,但是distinct會產生一張工作表,並進行排序來刪除重複記錄,這會大大增加查詢和I/O的操作次數。因此應當避免使用distinct關鍵字。

11.負邏輯  負邏輯如!=、<>、not in等,都會導致oralce用表掃描來完成查詢。當表較大時,會嚴重影響系統性能,可以用別的操作來代替。 儘量不要使用負邏輯如!=、<>、not in等。

12.使用ORDER BY和GROUP BY短語,任何一種索引都有助於SELECT的性能提高。注意如果索引列裏面有NULL值,優化器將無法優化。

13.join…on 後面慎用 or ,如果用到,請把or的範圍用( )括起來。

14.SQL語句包含多表連接時,必須對每個表命名別名,對每個字段的使用都要帶上別名。

15.Where 子句中的連接順序:oracle採用自下而上的順序解析where子句,根據這個原理,表之間的連接必須寫在其他where條件之前,那些可以過濾掉大量記錄的條件必須寫在where子句的末尾。如:
低效:select * from emp e where sal>5000 and job = ‘manager’ and 25< (select count (*) from emp where mgr=e.empno);
高效:select * from emp e where 25<(select count(*) from emp where mgr=e.empno) and sal>5000 and job=’manager’;
16.儘量不使用右連接。參與左連接的列不能爲常量。例如,不允許如下語句: select * from t1 left outer join t2 on t1.f1='A'。
左連接的寫法必須帶“outer”關鍵字。例如: select f1 from t1 left outer join t2 on t1.f1 = t2.f1;而不是: select f1 from t1 left join t2 on t1.f1 = t2.f1。

17.在使用UNION或UNION  ALL 的前後的兩個SQL需要加 ( )。
    union掃描的是全索引,可以適當用集合差:MINUS 和 集合交:INTERSECT 來代替。
    UNION ALL不會去除重複記錄,執行效率要高於UNION。

18.優化group by提高group by語句的效率,可以將不需要的記錄在group by之前過濾掉。如:
低效:select job, avg(sal) from emp group by job having job = ‘president’ or job=’manager’;           
高效: select job, avg(sal) from emp having  job=’president’ or job=’manager’ group by job;

19.將計算從等號左邊移到右邊,例如:把a*2>4 改爲a>4/2;把TO_CHAR(zip) = ‘ 94002’ 改爲zip = TO_NUMBER('94002');

20.不要使用Not,如Goods_no != 2,要改爲:  where Goods_no>2 or Goods_no<2   當Oracle“碰到”NOT,他就會停止使用索引轉而執行全表掃描。

21.不要使用is null , 如WHERE DEPT_CODE IS NOT NULL 要改爲:  WHERE DEPT_CODE >=0;

22.儘量多使用commit只要有可能就在程序中對每個delete insert update操作儘量多使用commit,這樣系統性能會因爲commit所釋放的資源而大大提高。
  COMMIT所釋放的資源:
   a.回滾段上用於恢復數據的信息.
   b.被程序語句獲得的鎖
   c.redo log buffer 中的空間
   d.ORACLE爲管理上述3種資源中的內部花費
23.儘量把循環的操作封裝到PL/SQL寫的存儲過程裏,因爲存儲過程都在服務端執行,所以沒有數據往返的消耗。有機會,將一些查詢封裝到函數裏,而在普通SQL裏使用這些函數,同樣是很有效的優化。

24.開發人員編寫sql語句時,儘量使用綁定變量,增加sql在sharepool中重用命中的機率。

25.大數據量的操作:大表中刪除大記錄:分段循環刪除,批量綁定刪除 ;大表中更新大記錄:分段更新。

26.對於開銷比較大的SQL查詢,要建立數據庫索引。數據庫索引可以大大加快數據庫的查詢速度,索引是把表中的邏輯值映射到RowID,因此索引能進行快速定位數據的物理地址,快速返回想要查詢的結果集。
   索引需要空間來存儲,也需要定期維護,每當有記錄在表中增減或索引列被修改時, 索引本身也會被修改。這意味着每條記錄的INSERT,DELETE ,UPDATE將爲此多付出4、5次的磁盤I/O 。因爲索引需要額外的存儲空間和處理,那些不必要的索引反而會使查詢反應時間變慢。

27.索引不被使用的幾種情況:null,比較,not函數

28.索引列上不要進行計算,如where trunc(order_date)=trunc(sysdate) ,  i+2>4。索引失效的原因也簡單,索引是針對原值建的二叉樹,你將列值*3/4+2折騰一番後,原來的二叉樹當然就用不上了。解決的方法:(1)換成等價語法,比如trunc(order_date) 換成where order_date>trunc(sysdate)-1 and order_date<trunc(sysdate)+1(2)特別爲計算建立函數索引:create index I_XXXX on shop_order(trunc(order_date))

29.低效:select * from emp where deptno > 3高效:select * from emp where deptno >=4
兩者的區別在於,前者dbms將直接跳到第一個deptno等於4的記錄,而後者將首先定位到deptno等於3的記錄並且向前掃描到第一個deptno大於3的。

30.當插入的數據爲數據表中的記錄數量的10%以上,首先需要刪除該表的索引來提高數據的插入效率,當數據插入後,再建立索引。

31.通常如果一個表有5個字段經常作爲查詢條件,那麼創建5個單獨字段的索引,然後再創建一個包含這5個字段的組合索引。索引的列儘量編寫在where條件語句的最後,以便執行計劃命中索引。

32.刪除表中的記錄時,在通常情況下, 回滾段(rollback segments ) 用來存放可以被恢復的信息. 如果你沒有COMMIT事務,ORACLE會將數據恢復到刪除之前的狀態(準確地說是恢復到執行刪除命令之前的狀況).而當運用TRUNCATE時, 回滾段不再存放任何可被恢復的信息.當命令運行後,數據不能被恢復.因此很少的資源被調用,執行時間也會很短.

33.Update 多個Column 例子:
     低效: UPDATE EMP
           SET EMP_CAT = (SELECT MAX(CATEGORY) FROM EMP_CATEGORIES),
            SAL_RANGE = (SELECT MAX(SAL_RANGE) FROM EMP_CATEGORIES)
           WHERE EMP_DEPT = 0020;
     高效: UPDATE EMP
           SET (EMP_CAT, SAL_RANGE)= (SELECT MAX(CATEGORY) ,
MAX(SAL_RANGE)FROM EMP_CATEGORIES)
           WHERE EMP_DEPT = 0020;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章