sql語句書寫規範

一、sql書寫規範:
  1sql語句的所有表名、欄位名全部小寫,系統保留字、內置函數名、sql保留字大寫。
  2、連接子orinand、以及=、<=>=等前後加上一個空格。
  3、對較為複雜的sql語句加上注釋,說明演算法、功能。
   注釋風格:注釋單獨成行、放在語句前面。
    (1)   應對不易理解的分支條件運算式加注釋;
    (2)   對重要的計算應說明其功能;
    (3)   過長的函數實現,應將其語句按實現的功能分段加以概括性說明;
    (4)   每條SQL語句均應有注釋說明(表名、欄位名)。
    (5)  常量及變數注釋時,應注釋被保存值的含義(必須),合法取值的範圍(可選
    (6)  可採用單行/多行注釋。(--  /* */ 方式)   
  4SQL語句的縮進風格
    (1)  一行有多列,超過80個字元時,基於列對齊原則,採用下行縮進
    (2)  where子句書寫時,每個條件占一行,語句令起一行時,以保留字或者連接子開始,連接子右對齊。
  5、多表連接時,使用表的別名來引用列。
  6、供別的檔或函式呼叫的函數,絕不應使用全域變數交換資料;
    如例(1
二、書寫優化性能建議
  1、避免嵌套連接。例如:A = B and B = C and C = D 
  2where條件中儘量減少使用常量比較,改用主機變數
  3、系統可能選擇基於規則的優化器,所以將結果集返回資料量小的表作為驅動表(from後邊最後一個表)。
  4、大量的排序操作影響系統性能,所以儘量減少order bygroup by排序操作。  
   如必須使用排序操作,請遵循如下規則:
    (1)  排序儘量建立在有索引的列上。
    (2)  如結果集不需唯一,使用union all代替union
  5、索引的使用。
    (1)  儘量避免對索引列進行計算。如對索引列計算較多,請提請系統管理員建立函數索引。
    (2)  儘量注意比較值與索引列資料類型的一致性。
    (3)  對於複合索引,SQL語句必須使用主索引列
    (4)  索引中,儘量避免使用NULL
    (5)  對於索引的比較,儘量避免使用NOT=!=
    (6)  查詢列和排序列與索引列次序保持一致
  6、儘量避免相同語句由於書寫格式的不同,而導致多次語法分析。
  7、儘量使用共用的SQL語句。
  8、查詢的WHERE過濾原則,應使過濾記錄數最多的條件放在最前面。
  9、任何對列的操作都將導致資料表掃描,它包括資料庫函數、計算運算式等等,查詢時要盡可能將操作移至等號右邊。
       10inor子句常會使用工作表,使索引失效;如果不產生大量重複值,可以考慮把子句拆開;拆開的子句中應該包含索引。


三、其他經驗性規則
  1、儘量少用嵌套查詢。如必須,請用not exist代替not in子句。如例(2
  2、用多表連接代替EXISTS子句。如例(3
  3、少用DISTINCT,用EXISTS代替如例(4
  4、使用UNION ALLMINUSINTERSECT提高性能
  5、使用ROWID提高檢索速度。對SELECT得到的單行記錄,需進行DELETEUPDATE操作時,使用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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
8.用执行计划分析SQL性能      EXPLAIN PLAN是一个很好的分析SQL语句的工具,它可以在不执行SQL的情况下分析语句      通过分析,我们就可以知道ORACLE是怎样连接表,使用什么方式扫描表(索引扫描或全表扫描),以及使用到的索引名称      按照从里到外,从上到下的次序解读分析的结果      EXPLAIN PLAN的分析结果是用缩进的格式排列的,最内部的操作将最先被解读,如果两个操作处于同一层中,带有最小操作号的将首先被执行      目前许多第三方的工具如PLSQL Developer和TOAD等都提供了极其方便的EXPLAIN PLAN工具      PG需要将自己添加的查询SQL文记入log,然后在EXPLAIN PLAN中进行分析,尽量减少全表扫描      ORACLE SQL性能优化系列      1.选择最有效率的表名顺序(只在基于规则的优化器中有效)      ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表driving table)将被最先处理      在FROM子句中包含多个表的情况下,必须选择记录条数最少的表作为基础表      当ORACLE处理多个表时,会运用排序及合并的方式连接它们      首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行排序;      然后扫描第二个表(FROM子句中最后第二个表);      最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并      例如:      表 TAB1 16,384 条记录      表 TAB2 5 条记录      选择TAB2作为基础表 (最好的方法)      select count(*) from tab1,tab2 执行时间0.96秒      选择TAB2作为基础表 (不佳的方法)      select count(*) from tab2,tab1 执行时间26.09秒      如果有3个以上的表连接查询,那就需要选择交叉表(intersection table)作为基础表,交叉表是指那个被其他表所引用的表      例如:   EMP表描述了LOCATION表和CATEGORY表的交集   SELECT *   FROM LOCATION L,   CATEGORY C,   EMP E   WHERE E.EMP_NO BETWEEN 1000 AND 2000   AND E.CAT_NO = C.CAT_NO   AND E.LOCN = L.LOCN      将比下列SQL更有效率   SELECT *   FROM EMP E ,   LOCATION L ,   CATEGORY C   WHERE E.CAT_NO = C.CAT_NO   AND E.LOCN = L.LOCN   AND E.EMP_NO BETWEEN 1000 AND 2000      2.WHERE子句中的连接顺序      ORACLE采用自下而上的顺序解析WHERE子句      根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾      例如:   (低效,执行时间156.3秒)   SELECT *   FROM EMP E   WHERE SAL > 50000   AND JOB = 'MANAGER'   AND 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO);      (高效,执行时间10.6秒)   SELECT *   FROM EMP E   WHERE 25 50000   AND JOB = 'MANAGER';      3.SELECT子句中避免使用'*'      当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用'*'是一个方便的方法,不幸的是,这是一个非常低效的方法      实际上,ORACLE在解析的过程中,会将'*'依次转换成所有的列名      这个工作是通过查询数据字典完成的,这意味着将耗费更多的时间      4.减少访问数据库的次数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值