下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Java程序员在写SQL程序时候常犯的10个错误_ Java程序员编程时需要混合面对对象思维和一般指令式编程的方法,能否完善的将两者结合起来完全得依靠编程人员的水准: 技能(任何人都能简单学会指令式编程) 模式(有些人用“模式-模式”,举个例子,模式可以应用到任何地方,而且都可以归为某一类模式) 心境(首先,要写个好的面对对象程序是比指令式程序难的多,你得花费一些功夫) 但当Java程序员写SQL语句时,一切都不一样了。SQL是说明性语言而非面对对象或是指令式编程语言。在SQL中要写个查询语句是很简洁的。但在Java里类似的语句却不简单,由于程序员不仅要反复考虑编程范式,而且也要考虑算法的问题
2、。 下面是Java程序员在写SQL时常犯的错误(没有特定的挨次): 1.忘掉NULL Java程序员写SQL时对NULL的误会可能是最大的错误。或许是由于(并非唯一理由)NULL也称作UNKNOWN。假如被称作UNKNOWN,这还好理解些。另一个缘由是,当你从数据库拿东西或是绑定变量时,JDBC将SQL NULL 和Java中的null对应了起来。这样导致了NULL = NULL(SQL)和null=null(Java)的误会。 对于NULL最大的误会是当NULL被用作行值表达式完整性约束条件时。 另一个误会消失在对于NULL 在 NOT IN anti-joins的应用中。 解决方法: 好好
3、的训练你自己。当你写SQL时要不停得想到NULL的用法: 这个NULL完整性约束条件是正确的? NULL是否影响到结果? 2.在Java内存中处理数据 很少有Java开发者能将SQL理解的很好.间或用法的JOIN,还有古怪的UNION,好吧.但是对于窗口函数呢?还有对集合进行分组呢?很多的Java开发者将SQL数据加载到内存中,将这些数据转换成某些相近的集合类型,然后再那些集合上面用法边界循环掌握结构(至少在Java8的集合升级以前)执行令人生厌的数学运算. 但是一些SQL数据库支持先进的(而且是SQL 标准支持的!)OLAP特性,这一特性表现更好而且写起来也更加便利.一个(并不怎么标准的)例
4、子就是Oracle超棒的MODEL分句.只让数据库来做处理然后只把结果带到Java内存中吧.由于到底全部特别聪慧的家伙已经对这些昂贵的产品进行了优化.因此事实上,通过将OLAP移到数据库,你将获得一下两项好处: 便利性.这比在Java中编写正确的SQL可能更加的简单. 性能表现.数据库应当比你的算法处理起来更加快.而且更加重要的是,你不必再去传递数百万条记录了. 完善的方法: 每次你用法Java实现一个以数据为中心的算法时,问问自己:有没有一种方法可以让数据库代替为我做这种麻烦事. 3. 用法UNION代替UNION ALL 太可耻了,和UNION相比UNION ALL还需要额外的关键字。假如
5、SQL标准已经规定了支持,那么可能会更好点。 UNION(允许重复) UNION DISTINCT (去除了重复) 移除重复行不仅很少需要(有时甚至是错的),而且对于带许多行的大数据集合会相当慢,由于两个子select需要排序,而且每个元组也需要和它的子序列元组比较。 留意即使SQL标准规定了INTERSECT ALL和EXCEPT ALL,很少数据库会实现这些没用的集合操作符。 处理方法: 每次你写UNION语句时,考虑事实上是否需要UNION ALL语句。 4.通过JDBC分页技术给大量的结果进行分页操作 大部分的数据库都会支持一些分页指令实现分页效果,譬如LIMIT.OFFSET,TOP
6、.START AT,OFFSET.FETCH语句等。即使没有支持这些语句的数据库,仍有可能对ROWNUM(甲骨文)或者是ROW NUMBER() OVER()过滤(DB2,SQL Server2021等),这些比在内存中实现分页更快速。在处理大量数据中,效果尤其明显。 订正: 仅仅用法这些语句,那么一个工具(例如JOOQ)就可以模拟这些语句的操作。 5.在java内存中加入数据 从SQL的初期开头,当在SQL中用法JOIN语句时,一些开发者照旧有担心的感觉。这是源自对加入JOIN后会变慢的固有恐惧。假如基于成本的优化选择去实现嵌套循环,在创建一张连接表源前,可能加载全部的表在数据库内存中,这可
7、能是真的。但是这事发生的概率太低了。通过合适的预报,约束和索引,合并连接和哈希连接的操作都是相当的快。这完全是是关于正确元数据(在这里我不能够引用Tom Kyte的太多)。而且,可能仍旧有不少的Java开发人员加载两张表通过分开查询到一个映射中,并且在某种程度上把他们加到了内存当中。 订正: 假如你在各个步骤中有从各种表的查询操作,好好想想是否可以表达你的查询操作在单条语句中。 6.在一个临时的笛卡尔积集合中用法 DISTINCT 或 UNION 消退重复项 通过简单的连接,人们可能会对SQL语句中扮演关键角色的全部关系失去概念。格外的,假如这涉及到多列外键关系的话,很有可能会遗忘在JOIN
8、. ON子句中增加相关的推断。这会导致重复的记录,但或许只是在特别的状况下。有些开发者因此可能选择DISTINCT来消退这些重复记录。从三个方面来说这是错误的: 它(或许)解决了表面症状但并没有解决问题。它也有可能无法解决极端状况下的症状。 对具有许多列的浩大的结果集合来说它很慢。DISTINCT要执行ORDER BY操作来消退重复。 对浩大的笛卡尔积集合来说它很慢,还是需要加载许多的数据到内存中。 解决方法: 依据阅历,假如你获得了不需要的重复记录,还是检查你的JOIN推断吧。可能在某个地方有一个很难觉察的笛卡尔积集合。 7. 不用法MERGE语句 这并不是一个过失,但是可能是缺少学问或者对
9、于强悍的MERGE语句信念不足。一些数据库理解其它形式的更新插入(UPSERT)语句, 如 MYSQL的重复主键更新语句,但是MERGE在数据库中确是很强大,很重要,以至于大肆扩展SQL标准,例如SQL SERVER。 解决之道: 假如你用法像联合INSERT和UPDATE或者联合SELECT . FOR UPDATE然后在INSERT或UPDATE等更新插入时,请三思。你完全可以用法一个更简洁的MERGE语句来远离冒险竞争条件。 8. 用法聚合函数代替窗口函数(window functions) 在介绍窗口函数之前,在SQL中聚合数据意味着用法GROUP BY语句与聚合函数相映射。在许多情形
10、下都工作得很好,如聚合数据需要浓缩常规数据,那么就在join子查询中用法group查询。 但是在SQL:2021中定义了窗口函数,这个在许多主流数据库都实现了它。窗口函数能够在结果集上聚合数据,但是却没有分组。事实上,每个窗口函数都有自己的、独立的PARTITION BY语句,这个工具对于显示报告太TM好了。 用法窗口函数: 使SQL更易读(但在子查询中没有GROUP BY语句专业) 提升性能,像关系数据库管理系统能够更简单优化窗口函数 解决方法: 当你在子查询中用法GROUP BY语句时,请一再考虑是否可以用法窗口函数完成。 9. 用法内存间接排序 SQL的ORDER BY语句支持许多类型的表达式,包括CASE语句,对于间接排序非常有用。你可能重来不会在Java内存中排序数据,由于你会想: SQL排序很慢 SQL排序办不到 处理方法: 假如你在内存中排序任何SQL数据,请一再考虑,是否不能在数据库中排序。这对于数据库分页数据非常有用。 10. 一条一条的插入大量纪录 JDBC ”懂“批处理(batch),你应当不会忘了它。不要用法INSERT语句来一条一条的出入成千上万的记录,(由于
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 采购计划变更通知及后续调整措施3篇
- 罕见行业绩效评价表
- 酒店大堂经理服务规范执行评估表
- 关于赔偿客户丢失样品回复函(5篇范文)
- 时间管理效率提升时间管理习惯养成
- 电子商务环境下企业培训与发展趋势分析
- 电动机维护与保养标准操作指南
- 快递公司配送员时效性与服务质量KPI考核表
- 汽车行业售后维修技师工作绩效评定表
- 关于2026年客户订单变更确认回复函(5篇范文)
- 2026散装水产品行业保鲜技术发展与终端零售模式研究报告
- 九年级语文(内蒙古专用)上学期期末真题汇编-古诗词赏析试题(含答案)
- 中国心肺复苏指南(2026年更新版)
- 屋面防水翻新工程质量评估报告
- 2026-2027学年人教版九年级上学期数学第一次月考模拟考试培优卷(含答案)
- 脑出血患者的呼吸道管理与吸痰技巧
- 胖东来商品陈列技巧
- T/CEC 137-2017 输电线路钢管塔力加工技术规程
- 金属矿山井下检修培训
- 鄂尔多斯市国有资产投资控股集团有限公司招聘笔试真题2024
- 辅导员工作岗位知识培训课件
评论
0/150
提交评论