10种Java开发者编写SQL语句时常见错误


当前第2页 返回上一页

解决办法

如果你从多个步骤的多个表中进行了SELECT操作,那要慎重考虑一下是否可以在一条语句中表达你所需要的查询功能。
6.使用DISTINCT或UNION从一个笛卡尔积中删除重复

冗长连接的存在,会导致SQL语句中起作用的关系显得十分松散。具体地,如果涉及到多列外键关系,很有可能忘记在JOINON子句上添加谓词。这可能会导致重复的记录,但也许只在特殊情况下。然后一些开发者可能会选择使用DISTINCT再次删除这些重复记录。这种错误有三种危害:

可能治标不治本。甚至在某些边缘情况下,标都治不了
这在有很多列的大结果集上会十分的缓慢。DISTINCT会执行ORDER BY操作来删除重复。
这在大型笛卡尔积中也十分的缓慢,因为这样做仍然会导致在内存中加载大量数据。
解决办法

作为一个经验法则,当你得到不想要的重复结果时,应该首先检查你的连接谓词。因为有可能是在某个地方存在着一个不易察觉的笛卡尔积。

7.不使用MERGE语句

严格意义上讲,这不是一个真正的错误,可能只是对于功能强大的MERGE语句缺乏足够的认知或存在着某种恐惧而已。有些数据库包括其他形式的UPSERT 语句,如MySQL的ONDUPLICATE KEY UPDATE子句。但MERGE真的十分强大,最重要的是在数据库中,它在很大程度上扩展了SQL标准,如SQL Server。

解决办法

如果你通过链接INSERT和UPDATE或链接SELECT... FOR UPDATE来实现UPSERTING,那么你要多想一想。抛开与运行条件的风险,你也许可以使用一个简单的MERGE语句来达到目的。

8.使用了聚合函数,而不是窗体功能

引入窗函数之前,使用GROUPBY子句与投影聚合函数是汇总数据的唯一方式。这在大部分情况下都十分有效,如果聚集后的数据需要由常规的数据进行补充,该分组的查询可以置于连接子查询中。

但是,SQL:2003定义了窗口功能,目前很多主流的数据库厂商也纷纷实现了窗口功能。窗口功能可以聚集结果集中未被分组的数据。事实上,每个窗口的功能支持自身独立的PARTITIONBY子句,这对于报表类应用是一个非常有用的工具。

使用窗口功能将:

导致更多的可读性SQL(减少子查询中非专用GROUP BY子句的存在)
提高性能,作为一个RDBMS很可能更容易优化其窗口功能。
解决办法

当你在一个子查询写一个GROUPBY子句时,仔细想想这是否能用一个窗口函数来完成。

9.使用内存排序法进行间接排序

在SQLORDER BY子句支持多种类型的表达式,包括CASE语句,这对间接排序非常有用。你应该永远可能在Java内存中对数据进行排序,因为你认为:

SQL排序太慢
SQL排序不能做到这一点
解决办法

如果你在内存中对任何SQL数据进行排序,请仔细想想,你是否能把排序迁移至数据库中。这和将分页迁移至数据库中的原因一样。

10 一个接一个的插入大量的记录

JDBC包含了批处理,而且你应该使用它。面对成千上万的记录,切勿为每一条记录都创建一个新的PreparedStatement来进行插入操作。如果你要将所有记录都插入到同一个表,使用单一的SQL语句和多个绑定值集合建立一个批处理的INSERT语句。根据您的数据库和数据库配置,您可能需要在一定数量的插入的记录后进行提交,为了保持UNDO日志不过分庞大。

解决办法

始终批量插入大型数据集。

Java开发者编写SQL语句时常见的10种错误,大家是不是有了大概了解,希望在编写的过程中一定要特别注意!

更多SQL内容来自木庄网络博客


打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...