SQL编程规范

来源:互联网 发布:linux 如何设置ntp 编辑:程序博客网 时间:2024/05/20 00:36
 
1.原则
  首先为人编写程序,其次才是计算机,只有易读、易维护的软件代码才是有生命力的。
 
  保持代码的简明清晰,避免过分的编程技巧,否则会降低程序的可读性。
 
  关键字的大写或小写保持统一,字段的大写或小写也要保持统一


  尽可能复用、修正老的代码,可以很大的提高效率。如查询作为一个方法,查询的条件作为方法的参数是一个重用度很高的办法。
 
  尽量减少同样的错误出现的次数,坚持零缺陷的开发思想,良好的编程习惯。


  完整的代码注释
  
2. SQL格式
  表名与字段名大小写要统一。建议大写。 SQL在内部解析时,如果是完全一样的SQL(包括大小写、空格),不用重复解析,可提高效率。
  
  禁止使用制表符(TAB键),必须使用空格进行缩排。缩进为4个空格。


  所有关键字要另起一行开始。
  

  运算符两侧都要留空格


3. 规则

  禁止在查询中使用*(ORACLE)。 ORACLE 在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。
  
  使用count(索引字段)代替count(1)或count(*)。 ????
  
  涉及到多表检索时,明确地为每个字段指定表名。 一来可以减少解析时间,而来可以避免由于歧义引起的语法错误。
  
  可以过滤掉最大数量记录的条件必须写在WHERE子句末尾(ORACLE)。 ORACLE 采用自下而上的顺序解析WHERE 子句
  
  在进行多个表连接时,FROM中的表的顺序要按照记录数由多到少的顺序来排列(ORACLE)
  
  去掉没有意义的GROUP BY、ORDER BY子语,如使用则必须对索引列排序, 而且排序不能建立在可以为NULL的列上
  
  有使用IN或者EXISTS的语句吗? 使用本身是没有问题的,但是需要确认。如果这样的SQL耗时的话,能否用EXISTS代替IN,或者用IN代替EXISTS,通过改写或许可以使SQL变快,视具体情况来定
     适用于T2表数据较少的情况:
     SELECT * FROM T1 WHERE X IN (SELECT Y FROM T2)
     适用于T2表数据较多的情况(EXISTS引起T1的全表扫描):
     SELECT * FROM T1 WHERE X EXISTS (SELECT Y FROM T2)
     t2数据量巨大且索引情况不好(大量重复值等),则不宜使用产生对t2的DISTINCT检索而导致系统开支巨大的IN操作,反之当t1表数据量巨大(不受索引影响)而t2表数据较少且索引良好则不宜使用引起t1全表扫描的EXISTS操作。
     通常EXISTS比IN快。
     EXISTS只返回TRUE和False,不返回列表的值。
     EXISTS先查外表再判断内查询,IN先执行内查询再进行外表查询
     EXISTS断是否有记录,IN判断一个字段是否存在于几个值的范围中


  使用表连接替换EXIST或IN ***
  
  WHERE语句中不要使用NOT IN。在子查询中,NOT IN 子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN 都是最低效的 (因为它对子查询中的表执行了一个全表遍历). 为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS.


  对于索引列不要使用函数和计算式
  
  尽可能将操作移至等号右边
  
  索引只做成[有]的数据。调整成不执行NULL检索的SQL,或者修改表的定义。
  
  对于索引列不要执行NULL值的检索。索引只做成[有]的数据。调整成不执行NULL检索的SQL,或者修改表的定义。
  
  对于索引列,不要使用"NOT"、"!="、"<>"比较运算
  
  禁止改变索引字段类型,类型转换要显示标出,不能隐式转换数据类型。 因为内部发生的类型转换, 这个索引将不会被用到。 注意当字符和数值比较时, ORACLE 会优先转换数值类型到字符类型。
  
  尽量避免较多地使用子查询。必须用子查询的时候,在子查询里写尽量多条件,使得子查询返回的行数尽量少
   
  减少数据库的访问次数,如需循环,在程序中处理
0 0