想要寫出高性能sql語句,你得記住這些


轉載出自:http://www.cnblogs.com/wangwust/p/6432209.html


1、在from子句中包含多個表名時,必須選擇記錄條數最少的表作爲基礎表;若有三個以上的表連接查詢,那就需要選擇交叉表作爲基礎表,交叉表指被其他表引用的表。


2、使用exists代替in、使用not exists 代替not in
   高效:SELECT * FROM EMP (基礎表) WHERE EMPNO > 0 AND EXISTS (SELECT 'X' ROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = 'MELB')
   低效:SELECT * FROM EMP (基礎表) WHERE EMPNO > 0 AND DEPTNO IN(SELECT DEPTNO  FROM  DEPT  WHERE  LOC = 'MELB')

3、當提交一個包含一對多表信息(比如部門表和僱員表)的查詢時,避免在SELECT子句中使用DISTINCT. 一般可以考慮用EXIST替換, EXISTS 使查詢更爲迅速,
   因爲RDBMS核心模塊將在子查詢的條件一旦滿足後,立刻返回結果。
   低效:SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D, EMP E WHERE D.DEPT_NO = E.DEPT_NO
   高效:SELECT DEPT_NO, DEPT_NAME FROM DEPT D WHERE EXISTS ( SELECT 'X' FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO)

4、要避免在索引列上使用NOT。NOT會產生在和在索引列上使用函數相同的影響。 當ORACLE"遇到"NOT,他就會停止使用索引轉而執行全表掃描。

5、WHERE子句中,如果索引列是函數的一部分,優化器將不使用索引而使用全表掃描
   低效:SELECT … FROM  DEPT  WHERE SAL * 12 > 25000
   高效: SELECT … FROM DEPT WHERE SAL > 25000/12

6、用>=替代>。前者DBMS將直接跳到第一個等於4的記錄而後者將首先定位到DEPTNO=3的記錄並且向前掃描到第一個大於3的記錄。

7、避免在索引列上使用IS NULL和IS NOT NULL。避免在索引中使用任何可以爲空的列。

8、如果索引是建立在多個列上,只有在它的第一個列(leading column)被where子句引用時,優化器纔會選擇使用該索引. 這也是一條簡單而重要的規則,當僅引用索引的第二個
   列時,優化器使用了全表掃描而忽略了索引。

9、某些SELECT 語句中的WHERE子句不使用索引。
   例子:(1)'!='將不使用索引。 記住, 索引只能告訴你什麼存在於表中, 而不能告訴你什麼不存在於表中
         (2)'||'是字符連接函數. 就象其他函數那樣, 停用了索引 
         (3)'+'是數學函數. 就象其他數學函數那樣, 停用了索引 
         (4)相同的索引列不能互相比較,這將會啓用全表掃描

10、a. 如果檢索數據量超過30%的表中記錄數,使用索引將沒有顯著的效率提高
    b. 在特定情況下,使用索引也許會比全表掃描慢, 但這是同一個數量級上的區別。而通常情況下,使用索引比全表掃描要快幾倍乃至幾千倍!

11、避免使用耗費資源的操作。帶有DISTINCT、UNION、MINUS、INTERSECT、ORDER BY的SQL語句會啓動SQL引擎。執行耗費資源的排序(SORT)功能,DISTINCT需要一次排序操作、 
    而其他的至少需要執行兩次排序。通常, 帶有UNION、 MINUS、INTERSECT的SQL語句都可以用其他方式重寫。 如果你的數據庫的SORT_AREA_SIZE調配得好, 使用UNION、 
    MINUS、 INTERSECT也是可以考慮的、 畢竟它們的可讀性很強。

12、不能用null作索引,任何包含null值的列都將不會被包含在索引中。即使索引有多列這樣的情況下,只要這些列中有一列含有null,該列就會從索引中排除。也就是說
    如果某列存在空值,即使對該列建索引也不會提高性能。任何在where子句中使用is null或is not null的語句優化器是不允許使用索引的。

13、通配符(%)在搜尋詞首出現,索引將變的無效。即使用通配符儘量這樣使用:like '關鍵詞%'。



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