Java措施员在写SQL时辰常犯的10个错误
4.通过JDBC分页技能给大量的功效举办分页操纵 大部门的数据库城市支持一些分页呼吁实现分页结果,譬如LIMIT..OFFSET,TOP..START AT,OFFSET..FETCH语句等。纵然没有支持这些语句的数据库,仍有也许对ROWNUM(甲骨文)可能是ROW NUMBER() OVER()过滤(DB2,SQL Server2008等),这些比在内存中实现分页更快速。在处理赏罚大量数据中,结果尤其明明。 更正: 仅仅行使这些语句,那么一个器材(譬喻JOOQ)就可以模仿这些语句的操纵。 5.在java内存中插手数据 从SQL的初期开始,当在SQL中行使JOIN语句时,一些开拓者仍然有不安的感受。这是源自对插手JOIN后会变慢的固有惊骇。若是基于本钱的优化选择去实现嵌套轮回,在建设一张毗连表源前,也许加载全部的表在数据库内存中,这也许是真的。可是这事产生的概率太低了。通过吻合的猜测,束缚和索引,归并毗连和哈希毗连的操纵都是相等的快。这完满是是关于正确元数据(在这里我不可以或许引用Tom Kyte的太多)。并且,也许如故有不少的Java开拓职员加载两张表通过度隔查询到一个映射中,而且在某种水平上把他们加到了内存傍边。 更正: 若是你在各个步调中有从各类表的查询操纵,好好想想是否可以表达你的查询操纵在单条语句中。 6.在一个姑且的笛卡尔积荟萃中行使 DISTINCT 或 UNION 消除一再项 通过伟大的毗连,人们也许会对SQL语句中饰演要害脚色的全部相关失去观念。出格的,假如这涉及到多列外键相关的话,很有也许会健忘在JOIN .. ON子句中增进相干的判定。这会导致一再的记录,但或者只是在非凡的环境下。有些开拓者因此也许选择DISTINCT来消除这些一再记录。从三个方面来嗣魅这是错误的: • 它(大概)办理了外貌症状但并没有办理题目。它也有也许无法办理极度环境下的症状。 • 对具有许多列的复杂的功效荟萃来说它很慢。DISTINCT要执行ORDER BY操纵来消除一再。 • 对复杂的笛卡尔积荟萃来说它很慢,照旧必要加载许多的数据到内存中。 办理要领: 按照履历,假如你得到了不必要的一再记录,照旧搜查你的JOIN判定吧。也许在某个处全部一个很难发觉的笛卡尔积荟萃。 7. 不行使MERGE语句 这并不是一个纰谬,可是也许是穷乏常识可能对付刁悍的MERGE语句信念不敷。一些数据库领略其余情势的更新插入(UPSERT)语句, 如 MYSQL的一再主键更新语句,可是MERGE在数据库中确是很强盛,很重要,以至于大举扩展SQL尺度,譬喻SQL SERVER。 办理之道: 假如你行使像连系INSERT和UPDATE可能连系SELECT .. FOR UPDATE然后在INSERT或UPDATE等更新插入时,请三思。你完全可以行使一个更简朴的MERGE语句来阔别冒险竞争前提。 8. 行使聚合函数取代窗口函数(window functions) 在先容窗口函数之前,在SQL中聚合数据意味着行使GROUP BY语句与聚合函数相映射。在许多气象下都事变得很好,如聚合数据必要浓缩通例数据,那么就在join子查询中行使group查询。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |