在10种java开发者编写SQL语句的10个常见错误
在何种程度上java开发者协调面向对象编程和命令行程序取决于他们的能力水平的思考如下:技能(任何人都可以用命令行的形式编写代码)
教条(有些人使用模式——模式,也就是说,模式无处不在,并用名字作标记)。
情感状态(在早期,真正的面向对象代码比命令代码更难理解。)
但当java开发者编写SQL语句,一切都是different.sql是一个说明性的语言无关的对象导向的观念和指挥的想法。在SQL语言的查询表达很容易。但这不是那么容易就写在最好、最正确的方式。开发商不仅需要反思自己的编程模式,还需要深入思考:从集合论的观点。
以下是由java开发者做了写SQL语句的JDBC或jooq几种常见错误:
1。忘记空
对空的意义可能是最常见的错误,java开发者编写SQL。这可能是因为空也叫未知,但是还有其他的原因。当然,如果它被称为唯一的未知是容易理解的。另一个原因是,当JDBC获取数据,或绑定变量的SQL空映射到java零。这可能会导致人们认为类似的情况如空= = null在java,还有一个空空的SQL。
null的一个更奇怪的例子是当空谓词用于行值表达式时。
另一个微妙的问题是误解与空在不反的意义联系。
和解条款
训练自己。一定要弄清楚null的意思。每次编写sql时,都要考虑:
断言是否对空正确。
null是否影响这个函数的结果。
2。在java内存中处理数据
一些java开发者非常了解SQL的特点。偶尔加入,分散的联盟,没有问题。但如果窗函数,分组情况多少java开发者将SQL数据加载到内存中的数据,在一些合适的集合类型,循环结构是在运行很长的数学运算的集合(至少在恼人的java 8改进容器等)。
但一些SQL数据库,除了支持SQL标准,还支持先进的OLAP功能,更好的执行,更容易写。一个非标准的例子是Oracle Model子句。只是让数据库处理数据,和最终结果加载到java内存。因为一些非常聪明的人已经优化了这些昂贵的产品。所以,事实上,通过移动到OLAP数据库,你会得到两个好处:
简洁。这可能会使它更容易在SQL编写正确的代码比java
性能。数据库可能比你的算法快。更重要的是,你不必通过网络传输数百万条记录。
和解条款
每一次你实现以数据为中心的算法,java,试着问自己:有什么办法让数据库执行这些任务,只有把结果给我。
三.试着使用工会,而不是工会。
与工会相反,工会都需要额外的关键字来显得相形见绌。如果在SQL标准上定义了以下支持,那就更好了:
联合(允许重复)
联合分明(消除重复)
通常,很少需要删除重复(有时是重的,甚至是错误的),对于许多多列的大型结果集,它通常非常慢,因为需要对这两个子查询进行排序,并且每个元组都需要与随后的元组进行比较。
值得注意的是,即使SQL标准规定intersectall和exceptall,几乎没有任何的数据库,实现了这些小作业。
和解条款
你写信给联盟的每一次,考虑一下你是否真的想写unionall。
4。使用JDBC分页功能,分页大量结果
大多数数据库通过一定的限制支持分页结果。偏置,顶部开始,抵销取其他条款。没有这些条款的支持,还有行号(Oracle)或row_number()在()(DB2、SQL Server 2008和更低版本),这是比分页内存快得多,这是比较明显的大数据集。
和解条款
只要你使用这些条款或工具(如jooq),你可以模拟上述条款你分页。
5。实现java内存连接
从SQL的早期发展阶段,一些开发商仍然在SQL连接面不安的感觉。有了对---join.if基于成本的优化器选择执行嵌套循环速度慢的固有的恐惧,这是进行完整的表数据库内存之前创建一个连接表的源极慢。但这不会发生。适当的谓词,约束和索引的mergejoin和hashjoin操作非常快。这是正确的元数据相关的(我不需要给Tom Kyte一个例子)。然而,仍有许多java开发人员将负荷两表映射容器分开查询,并在java内存做一些连接操作。
和解条款
如果从多个步骤中选择操作,请仔细考虑是否可以在语句中表达查询函数。
6。使用不同或联合删除笛卡尔乘积中的重复
一个长时间连接的存在导致SQL语句中的一个非常松散的关系。具体地说,它是可能忘记添加谓词在君恩条款如果涉及多柱外键关系。这可能导致重复的记录,但也许只有在特殊情况下,一些开发商可能会选择使用不同的删除这些重复记录一次。这个错误有三种危害:
治疗可能没有治愈的方法,即使在某些边缘情况下,标准也无法治愈。
这将在许多columns.distinct大的结果是很慢的执行顺序操作删除重复项。
在大型笛卡尔乘积中,这也是非常慢的,因为这样做仍然会导致大量数据被加载到内存中。
和解条款
作为一个经验法则,当你重复的结果,你不想,你应该首先检查你的连接谓词。因为这是有可能的是在某一个地方,一个unperceptible笛卡尔积。
7。不要使用合并语句
严格地说,这不是一个真正的错误。它可能只是一个缺乏足够的认知或恐惧强大的合并报表。有些数据库包括其他形式的更新插入语句,如onduplicate密钥更新子句MySQL。但合并真的非常强大,而且最重要的是在数据库中,它扩展了SQL标准在很大程度上,如SQL服务器。
和解条款
如果你实现upserting通过链接插入、更新或链接的选择…为了更新,请仔细考虑一下。您可能会使用简单的合并语句来实现目标,而忽略运行条件的风险。
8。使用聚合函数,而不是窗体函数
在介绍了窗函数,收集数据的唯一方法是使用GROUPBY子句和投影聚合函数。这在大多数情况下是非常有效的。如果聚合数据需要由常规数据来补充,则可以将该组的查询放在连接子查询中。
然而,SQL:2003定义了窗口的功能,和许多主流的数据库厂商都实施了窗函数的时刻。窗口功能可以收集不分组结果数据。事实上,每个窗口的功能支持自己独立的partitionby条款,这是一个非常有用的工具类应用报告。
窗口函数的使用将:
导致更多的可读性SQL(非存在的专门小组通过降低查询子句)
提高性能,作为RDBMS,可能更有可能优化其窗口功能。
和解条款
当你在写一个想查询GroupBy子句,是否可以做一个窗函数。
9。用内存排序法进行间接排序
通过条款6.0中SQL命令支持多类型的表达式,包括案例的陈述,这是非常有用的间接排序。你应该一直都在java内存中的数据,因为你认为:
sql排序太慢了。
SQL排序不能这样做
和解条款
如果你内存中的任何数据,仔细想想你是否可以迁移排序数据库。这是对于分页的数据库迁移的原因相同。
10一点零一分插入大量记录
JDBC包含批处理,你应该使用它。在成千上万的记录面前,不插入操作创建的每个记录新PreparedStatement。如果你想将所有记录到同一个表,使用一个SQL语句和一组多个绑定值建立一个批量插入语句。根据你的数据库和数据库的配置,你可能需要提交一些插入记录撤消日志不太大。
和解条款
大型数据集总是成批插入。
java开发人员编写的10个常见错误的SQL语句的过程中,我们有一个大致的了解,我希望在写作的过程中,要特别注意它!