91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Oracle系列:(31)Oracle SQL語句優化

發布時間:2020-10-08 20:17:11 來源:網絡 閱讀:264 作者:lsieun 欄目:關系型數據庫


(01)選擇最有效率的表名順序(筆試常考) 

      ORACLE的解析器按照從右到左的順序處理FROM子句中的表名, 

      FROM子句中寫在最后的表將被最先處理,

      在FROM子句中包含多個表的情況下,你必須選擇記錄條數最少的表放在最后,

      如果有3個以上的表連接查詢,那就需要選擇那個被其他表所引用的表放在最后。

      例如:查詢員工的編號,姓名,工資,工資等級,部門名

      select emp.empno,emp.ename,emp.sal,salgrade.grade,dept.dname
      from salgrade,dept,emp
      where (emp.deptno = dept.deptno) and (emp.sal between salgrade.losal and salgrade.hisal)


      1)如果三個表是完全無關系的話,將記錄列名最少的表,寫在最后,然后依次類推

      2)如果三個表是有關系的話,將引用最多的表,放在最后,然后依次類推



(02)WHERE子句中的連接順序(筆試常考)  

      ORACLE采用自右而左的順序解析WHERE子句,根據這個原理,表之間的連接必須寫在其他WHERE條件之左,那些可以過濾掉最大數量記錄的條件必須寫在WHERE子句的之右。  

      例如:查詢員工的編號,姓名,工資,部門名  

      select emp.empno,emp.ename,emp.sal,dept.dname
      from emp,dept
      where (emp.deptno = dept.deptno) and (emp.sal > 1500)

 

 

(03)SELECT子句中避免使用*號

      ORACLE在解析的過程中,會將*依次轉換成所有的列名,這個工作是通過查詢數據字典完成的,這意味著將耗費更多的時間

      select empno,ename from emp;


(04)使用DECODE函數來減少處理時間

      使用DECODE函數可以避免重復掃描相同記錄或重復連接相同的表


(05)整合簡單,無關聯的數據庫訪問


(06)用TRUNCATE替代DELETE

   

(07)盡量多使用COMMIT

      因為COMMIT會釋放回滾點


(08)用WHERE子句替換HAVING子句

      WHERE先執行,HAVING后執行

     

(09)多使用內部函數提高SQL效率

     

(10)使用表的別名

      salgrade s

     

(11)使用列的別名

      ename e


(12)用索引提高效率

      在查詢中,善用索引

      

(13)字符串型,能用=號,不用like

      因為=號表示精確比較,like表示模糊比較 


(14)SQL語句用大寫的

      因為Oracle服務器總是先將小寫字母轉成大寫后,才執行

      在eclipse中,先寫小寫字母,再通過ctrl+shift+X轉大寫;ctrl+shift+Y轉小寫


(15)避免在索引列上使用NOT

      因為Oracle服務器遇到NOT后,他就會停止目前的工作,轉而執行全表掃描


(16)避免在索引列上使用計算

      WHERE子句中,如果索引列是函數的一部分,優化器將不使用索引而使用全表掃描,這樣會變得變慢 

      例如,SAL列上有索引,

      低效:

      SELECT EMPNO,ENAME
      FROM EMP 
      WHERE SAL*12 > 24000;

      高效:

      SELECT EMPNO,ENAME
      FROM EMP
      WHERE SAL > 24000/12;


(17)用 >= 替代 >

      低效:

      SELECT * FROM EMP WHERE DEPTNO > 3   

      首先定位到DEPTNO=3的記錄并且掃描到第一個DEPT大于3的記錄

      高效:

      SELECT * FROM EMP WHERE DEPTNO >= 4  

      直接跳到第一個DEPT等于4的記錄


(18)用IN替代OR

      select * from emp where sal = 1500 or sal = 3000 or sal = 800;
      select * from emp where sal in (1500,3000,800);


(19)總是使用索引的第一個列

      如果索引是建立在多個列上,只有在它的第一個列被WHERE子句引用時,優化器才會選擇使用該索引

      當只引用索引的第二個列時,不引用索引的第一個列時,優化器使用了全表掃描而忽略了索引

      create index emp_sal_job_idex

      on emp(sal,job);

      ----------------------------------

      select *

      from emp  

      where job != 'SALES';      


(20)避免改變索引列的類型,顯示比隱式更安全 

      當字符和數值比較時,ORACLE會優先轉換數值類型到字符類型 

      select 123 || '123' from dual;







向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

云安县| 惠水县| 宜良县| 鄂托克旗| 平邑县| 罗山县| 孟州市| 日喀则市| 定陶县| 湾仔区| 越西县| 翁牛特旗| 桐柏县| 喀什市| 深泽县| 铜鼓县| 楚雄市| 尉犁县| 农安县| 新巴尔虎左旗| 滨海县| 金华市| 临海市| 青岛市| 虹口区| 扎赉特旗| 临邑县| 张北县| 都安| 南华县| 内乡县| 永清县| 阿瓦提县| 亚东县| 双桥区| 铜梁县| 台南县| 蒙山县| 铁岭县| 大渡口区| 新丰县|