• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • SQL編程規范

    發表于:2007-05-25來源:作者:點擊數: 標簽:規范sql編程優化書寫
    一、sql書寫規范: 二、書寫優化 性能 建議 三、其他經驗性規則 一、sql書寫規范: 1、sql語句的所有表名、字段名全部小寫,系統保留字、內置函數名、sql保留字大寫。 2、連接符or、in、and、以及=、=、=等前后加上一個空格。 3、對較為復雜的sql語句加上注

    一、sql書寫規范:

    二、書寫優化性能建議

    三、其他經驗性規則

    一、sql書寫規范:

    1、sql語句的所有表名、字段名全部小寫,系統保留字、內置函數名、sql保留字大寫。

    2、連接符or、in、and、以及=、<=、>=等前后加上一個空格。

    3、對較為復雜的sql語句加上注釋,說明算法、功能。

    注釋風格:注釋單獨成行、放在語句前面。
    (1) 應對不易理解的分支條件表達式加注釋;
    (2) 對重要的計算應說明其功能;
    (3) 過長的函數實現,應將其語句按實現的功能分段加以概括性說明;
    (4) 每條SQL語句均應有注釋說明(表名、字段名)。
    (5) 常量及變量注釋時,應注釋被保存值的含義(必須),合法取值的范圍(可選)
    (6) 可采用單行/多行注釋。(-- 或 /* */ 方式)

    4、SQL語句的縮進風格

    (1) 一行有多列,超過80個字符時,基于列對齊原則,采用下行縮進
    (2) where子句書寫時,每個條件占一行,語句令起一行時,以保留字或者連接符開始,連接符右對齊。

    5、多表連接時,使用表的別名來引用列。

    6、供別的文件或函數調用的函數,絕不應使用全局變量交換數據;

    如例(1)


    二、書寫優化性能建議

    1、避免嵌套連接。例如:A = B and B = C and C = D

    2、where條件中盡量減少使用常量比較,改用主機變量

    3、系統可能選擇基于規則的優化器,所以將結果集返回數據量小的表作為驅動表(from后邊最后一個表)。

    4、大量的排序操作影響系統性能,所以盡量減少order by和group by排序操作。

    如必須使用排序操作,請遵循如下規則:

    (1) 排序盡量建立在有索引的列上。
    (2) 如結果集不需唯一,使用union all代替union。

    5、索引的使用。

    (1) 盡量避免對索引列進行計算。如對索引列計算較多,請提請系統管理員建立函數索引。
    (2) 盡量注意比較值與索引列數據類型的一致性。
    (3) 對于復合索引,SQL語句必須使用主索引列
    (4) 索引中,盡量避免使用NULL。
    (5) 對于索引的比較,盡量避免使用NOT=(!=)
    (6) 查詢列和排序列與索引列次序保持一致

    6、盡量避免相同語句由于書寫格式的不同,而導致多次語法分析。

    7、盡量使用共享的SQL語句。

    8、查詢的WHERE過濾原則,應使過濾記錄數最多的條件放在最前面。

    9、任何對列的操作都將導致表掃描,它包括數據庫函數、計算表達式等等,查詢時要盡可能將操作移至等號右邊。

    10、in、or子句常會使用工作表,使索引失效;如果不產生大量重復值,可以考慮把子句拆開;拆開的子句中應該包含索引。

    三、其他經驗性規則

    1、盡量少用嵌套查詢。如必須,請用not exist代替not in子句。如例(2)

    2、用多表連接代替EXISTS子句。如例(3)

    3、少用DISTINCT,用EXISTS代替 如例(4)

    4、使用UNION ALL、MINUS、INTERSECT提高性能

    5、使用ROWID提高檢索速度。對SELECT得到的單行記錄,需進行DELETE、UPDATE操作時,使用ROWID將會使效率大大提高。

    6、使用優化線索機制進行訪問路徑控制。

    7、使用cursor時,顯示光標優于隱式光標

    本規范示例:

    例一:
    SELECT aka042 -- 單位繳費劃入個人帳戶比例
    INTO prm_aaa043
    FROM ka01 --醫療保險單位繳費劃入個人帳戶比例分段信息
    WHERE akc021 = rec_kc01.akc021 -- 醫療人員類別
    AND aka041 >= rec_kc01.akc023 -- 年齡上限
    AND aka040 <= rec_kc01.akc023 -- 年齡下限
    AND aae030 <= prm_date -- 開始時間
    AND ( aae031 >= prm_date OR aae031 IS NULL ); -- 終止時間

    例二:
    X SELECT ......
    FROM emp
    WHERE dept_no NOT IN ( SELECT dept_no
    FROM dept
    WHERE dept_cat='A');

    O SELECT ......
    FROM emp e
    WHERE NOT EXISTS ( SELECT 'X'
    FROM dept
    WHERE dept_no=e.dept_no
    AND dept_cat='A');

    例三:
    X SELECT ......
    FROM emp
    WHERE EXISTS ( SELECT 'X'
    FROM dept
    WHERE dept_no=e.dept_no
    AND dept_cat='A');

    O SELECT ......
    FROM emp e,dept d
    WHERE e.dept_no=d.dept_no
    AND dept_cat='A';

    例四:
    X SELECT DISTINCT d.dept_code,d.dept_name
    FROM dept d ,emp e
    WHERE e.dept_code=d.dept_code;

    O SELECT dept_code,dept_name
    FROM dept d
    WHERE EXISTS ( SELECT 'X'
    FROM emp e
    WHERE e.dept_code=d.dept_code);

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>