写sql语句时应注意的事项
By:Roy.LiuLast updated:2013-12-25
开发人员在写sql语句的时候,通常会受面向对象的思维左右之外,还有其他因素也会影响写sql语句的习惯:
1. 以往编程的经验
2. 定式思维模式
3. 心情好坏
对于sql 本身来说,与面向对象没有半毛钱的关系,只是因为ORM 的出现,为了简化编程,好像有了关联,但事实上二者一点关系都没有。要写好SQL 语句并不是一件简单的事。在工作中总结了如下需要注意的地方:
写sql语句时,请忘记java 编程中的null
s数据库记录中的NULL 与 java 中的 null 完全是两回事,有些程序员会搞混, 因为 jdbc 会将 NULL 映射到 Java的null, 这往往会给人造成一种假象 NULL==null(java)
在内存中 处理数据
程序员精通SQL 的并不是很多,所以很多程序员会把数据取到内存中,然后在内存中进行计算或者进行类型转换,特别在喜欢用 java 的 List 循环处理, 这个时候应该多想想,数据库是否提供了一些方法能更简便的处理数据,比如 数据库的 OLAP ,这样可以让数据库处理出结构,而内存中只用这些结果. 这样做至少有两个好处:
1. 简洁, 程序代码简洁,写SQL 或许更容易,java 代码也少很多。
2, 高效, 数据库处理的逻辑比你处理的要高效.
所以,有这种情况的时候,可以问下自己,这个查询语句是否可以让数据库去执行得更好。
用 union 代替 union all
如果有这种情况发生,请问一下自己是否真的需要这样,union 是会去掉重复的记录,性能会比较低,因为它会比较多个结果集中是否有重复记录,而union all 不用比较,性能相对高效。
利用jdbc 分页处理大量记录
这是最笨的办法,内存分页,所有的数据取到内存中,然后再去分页,性能底下。其实很多数据库已经提供了相应的处理方法,比如通过limit .offset, top ... , orACLE 利用 ROWNUM, SQLSERVER 2005 以上版本支持ROW_NUMBER() OVER 等方式分页.
多表查询,在内存中 连接 数据
有些程序员特别喜欢单表操作,总数据查处几个表的数据之后,然后在内存中来关联,除非特殊情况,否则不要这么做,应该多想想是否可以用一条SQL语句关联查询得到结果集。我发现IBM 的产品,很喜欢这么做,基本单表查询,或许与要兼容多种数据库相关吧。
在插入数据的时候,一条一条插入
JDBC 有 batch 处理,不需要一条一条的插入, 那样性能很低,每次都需要创建 PreparedStatement. 如果需要向同一个表中插入多条记录,值需要一条SQL 语句和许多相关的值绑定就可以做到,最后在commit 数据.
尽量用数据库的排序
数据的order by 能对许多类型的数据进行排序,除非特殊情况,你能确定数据库排序比你自己排序还要慢,否则,不要在 内存中进行排序。
灵活运用数据库提供的聚合方法
比如很多数据库都提供了 group by , case ,sum 等方法,能用的地方,尽量用。
1. 以往编程的经验
2. 定式思维模式
3. 心情好坏
对于sql 本身来说,与面向对象没有半毛钱的关系,只是因为ORM 的出现,为了简化编程,好像有了关联,但事实上二者一点关系都没有。要写好SQL 语句并不是一件简单的事。在工作中总结了如下需要注意的地方:
写sql语句时,请忘记java 编程中的null
s数据库记录中的NULL 与 java 中的 null 完全是两回事,有些程序员会搞混, 因为 jdbc 会将 NULL 映射到 Java的null, 这往往会给人造成一种假象 NULL==null(java)
在内存中 处理数据
程序员精通SQL 的并不是很多,所以很多程序员会把数据取到内存中,然后在内存中进行计算或者进行类型转换,特别在喜欢用 java 的 List 循环处理, 这个时候应该多想想,数据库是否提供了一些方法能更简便的处理数据,比如 数据库的 OLAP ,这样可以让数据库处理出结构,而内存中只用这些结果. 这样做至少有两个好处:
1. 简洁, 程序代码简洁,写SQL 或许更容易,java 代码也少很多。
2, 高效, 数据库处理的逻辑比你处理的要高效.
所以,有这种情况的时候,可以问下自己,这个查询语句是否可以让数据库去执行得更好。
用 union 代替 union all
如果有这种情况发生,请问一下自己是否真的需要这样,union 是会去掉重复的记录,性能会比较低,因为它会比较多个结果集中是否有重复记录,而union all 不用比较,性能相对高效。
利用jdbc 分页处理大量记录
这是最笨的办法,内存分页,所有的数据取到内存中,然后再去分页,性能底下。其实很多数据库已经提供了相应的处理方法,比如通过limit .offset, top ... , orACLE 利用 ROWNUM, SQLSERVER 2005 以上版本支持ROW_NUMBER() OVER 等方式分页.
多表查询,在内存中 连接 数据
有些程序员特别喜欢单表操作,总数据查处几个表的数据之后,然后在内存中来关联,除非特殊情况,否则不要这么做,应该多想想是否可以用一条SQL语句关联查询得到结果集。我发现IBM 的产品,很喜欢这么做,基本单表查询,或许与要兼容多种数据库相关吧。
在插入数据的时候,一条一条插入
JDBC 有 batch 处理,不需要一条一条的插入, 那样性能很低,每次都需要创建 PreparedStatement. 如果需要向同一个表中插入多条记录,值需要一条SQL 语句和许多相关的值绑定就可以做到,最后在commit 数据.
尽量用数据库的排序
数据的order by 能对许多类型的数据进行排序,除非特殊情况,你能确定数据库排序比你自己排序还要慢,否则,不要在 内存中进行排序。
灵活运用数据库提供的聚合方法
比如很多数据库都提供了 group by , case ,sum 等方法,能用的地方,尽量用。
From:一号门
Previous:获取django orm query执行的的sql语句
COMMENTS