日韩av片子_国产自在自线午夜精品视频在_使劲快高潮了国语对白在线_久久免费毛片大全_激情丁香综合_欧美成人精品欧美一级乱黄码

中培偉業(yè)IT資訊頻道
您現(xiàn)在的位置:首頁(yè) > IT資訊 > 軟件研發(fā) > Java開(kāi)發(fā)人員開(kāi)發(fā)SQL程序的常見(jiàn)錯(cuò)誤

Java開(kāi)發(fā)人員開(kāi)發(fā)SQL程序的常見(jiàn)錯(cuò)誤

2017-03-30 17:01:21 | 來(lái)源:中培企業(yè)IT培訓(xùn)網(wǎng)

Java開(kāi)發(fā)人員來(lái)說(shuō),SQL這種說(shuō)明性語(yǔ)言而非面向?qū)ο蠡蚴敲钍骄幊陶Z(yǔ)言也讓其開(kāi)發(fā)成為一大難題中培偉業(yè)《企業(yè)級(jí)JAVA高級(jí)開(kāi)發(fā)技術(shù)實(shí)戰(zhàn)》培訓(xùn)專(zhuān)家程老師表示,SQL中要寫(xiě)個(gè)查詢語(yǔ)句是很簡(jiǎn)單的但在Java里類(lèi)似的語(yǔ)句卻不容易,因?yàn)槌绦騿T不僅要反復(fù)考慮編程范式,而且也要考慮算法的問(wèn)題。程老師在這里就Java程序員在寫(xiě)SQL時(shí)常犯的錯(cuò)誤以及相應(yīng)的解決方法進(jìn)行了介紹。

1.NULL拋諸腦后

Java程序員寫(xiě)SQL時(shí)對(duì)NULL的誤解可能是最大的錯(cuò)誤。也許是因?yàn)椴⒎俏ㄒ焕碛?NULL也稱作UNKNOWN。如果被稱作UNKNOWN,這還好理解些。另一個(gè)原因是,當(dāng)你從數(shù)據(jù)庫(kù)拿東西或是綁定變量時(shí),JDBCSQL NULL Java中的null對(duì)應(yīng)了起來(lái)。這樣導(dǎo)致了NULL = NULL(SQL)null=null(Java)的誤解。

2.Java內(nèi)存中處理數(shù)據(jù)

很少有Java開(kāi)發(fā)者能將SQL理解的很好偶爾使用的JOIN,還有古怪的UNION,好吧但是對(duì)于窗口函數(shù)呢還有對(duì)集合進(jìn)行分組呢許多的Java開(kāi)發(fā)者將SQL數(shù)據(jù)加載到內(nèi)存中將這些數(shù)據(jù)轉(zhuǎn)換成某些相近的集合類(lèi)型然后再那些集合上面使用邊界循環(huán)控制結(jié)構(gòu)至少在Java8的集合升級(jí)以前執(zhí)行令人生厭的數(shù)學(xué)運(yùn)算

但是一些SQL數(shù)據(jù)庫(kù)支持先進(jìn)的而且是SQL 標(biāo)準(zhǔn)支持的!)OLAP特性這一特性表現(xiàn)更好而且寫(xiě)起來(lái)也更加方便一個(gè)并不怎么標(biāo)準(zhǔn)的例子就是Oracle超棒的MODEL分句只讓數(shù)據(jù)庫(kù)來(lái)做處理然后只把結(jié)果帶到Java內(nèi)存中吧因?yàn)楫吘顾蟹浅B斆鞯募一镆呀?jīng)對(duì)這些昂貴的產(chǎn)品進(jìn)行了優(yōu)化因此實(shí)際上通過(guò)將OLAP移到數(shù)據(jù)庫(kù)

性能表現(xiàn).數(shù)據(jù)庫(kù)應(yīng)該比你的算法處理起來(lái)更加快而且更加重要的是你不必再去傳遞數(shù)百萬(wàn)條記錄了

3. 使用UNION代替UNION ALL

太可恥了,和UNION相比UNION ALL還需要額外的關(guān)鍵字。如果SQL標(biāo)準(zhǔn)已經(jīng)規(guī)定了支持,那么可能會(huì)更好點(diǎn)。

移除重復(fù)行不僅很少需要(有時(shí)甚至是錯(cuò)的,而且對(duì)于帶很多行的大數(shù)據(jù)集合會(huì)相當(dāng)慢,因?yàn)閮蓚€(gè)子select需要排序,而且每個(gè)元組也需要和它的子序列元組比較。

注意即使SQL標(biāo)準(zhǔn)規(guī)定了INTERSECT ALLEXCEPT ALL,很少數(shù)據(jù)庫(kù)會(huì)實(shí)現(xiàn)這些沒(méi)用的集合操作符。

 4.通過(guò)JDBC分頁(yè)技術(shù)給大量的結(jié)果進(jìn)行分頁(yè)操作

大部分的數(shù)據(jù)庫(kù)都會(huì)支持一些分頁(yè)命令實(shí)現(xiàn)分頁(yè)效果,譬如LIMIT..OFFSET,TOP..START AT,OFFSET..FETCH語(yǔ)句等。即使沒(méi)有支持這些語(yǔ)句的數(shù)據(jù)庫(kù),仍有可能對(duì)ROWNUM(甲骨文或者是ROW NUMBER() OVER()過(guò)濾(DB2,SQL Server2008,這些比在內(nèi)存中實(shí)現(xiàn)分頁(yè)更快速。在處理大量數(shù)據(jù)中,效果尤其明顯。

5.java內(nèi)存中加入數(shù)據(jù)

從SQL的初期開(kāi)始,當(dāng)在SQL中使用JOIN語(yǔ)句時(shí),一些開(kāi)發(fā)者仍舊有不安的感覺(jué)。這是源自對(duì)加入JOIN后會(huì)變慢的固有恐懼。假如基于成本的優(yōu)化選擇去實(shí)現(xiàn)嵌套循環(huán),在創(chuàng)建一張連接表源前,可能加載所有的表在數(shù)據(jù)庫(kù)內(nèi)存中,這可能是真的。但是這事發(fā)生的概率太低了。通過(guò)合適的預(yù)測(cè),約束和索引,合并連接和哈希連接的操作都是相當(dāng)?shù)目臁_@完全是是關(guān)于正確元數(shù)據(jù)在這里我不能夠引用Tom Kyte的太多。而且,可能仍然有不少的Java開(kāi)發(fā)人員加載兩張表通過(guò)分開(kāi)查詢到一個(gè)映射中,并且在某種程度上把他們加到了內(nèi)存當(dāng)中。

6.在一個(gè)臨時(shí)的笛卡爾積集合中使用 DISTINCT 或 UNION 消除重復(fù)項(xiàng)

通過(guò)復(fù)雜的連接,人們可能會(huì)對(duì)SQL語(yǔ)句中扮演關(guān)鍵角色的所有關(guān)系失去概念。特別的,如果這涉及到多列外鍵關(guān)系的話,很有可能會(huì)忘記在JOIN .. ON子句中增加相關(guān)的判斷。這會(huì)導(dǎo)致重復(fù)的記錄,但或許只是在特殊的情況下。有些開(kāi)發(fā)者因此可能選擇DISTINCT來(lái)消除這些重復(fù)記錄。從三個(gè)方面來(lái)說(shuō)這是錯(cuò)誤的:

它(也許解決了表面癥狀但并沒(méi)有解決問(wèn)題。它也有可能無(wú)法解決極端情況下的癥狀。

對(duì)具有很多列的龐大的結(jié)果集合來(lái)說(shuō)它很慢。DISTINCT要執(zhí)行ORDER BY操作來(lái)消除重復(fù)。對(duì)龐大的笛卡爾積集合來(lái)說(shuō)它很慢,還是需要加載很多的數(shù)據(jù)到內(nèi)存中。

7. 不使用MERGE語(yǔ)句

這并不是一個(gè)過(guò)失,但是可能是缺少知識(shí)或者對(duì)于強(qiáng)悍的MERGE語(yǔ)句信心不足。一些數(shù)據(jù)庫(kù)理解其它形式的更新插入(UPSERT)語(yǔ)句, 如 MYSQL的重復(fù)主鍵更新語(yǔ)句,但是MERGE在數(shù)據(jù)庫(kù)中確是很強(qiáng)大,很重要,以至于大肆擴(kuò)展SQL標(biāo)準(zhǔn),例如SQL SERVER

8. 使用聚合函數(shù)代替窗口函數(shù)(window functions)

在介紹窗口函數(shù)之前,在SQL中聚合數(shù)據(jù)意味著使用GROUP BY語(yǔ)句與聚合函數(shù)相映射。在很多情形下都工作得很好,如聚合數(shù)據(jù)需要濃縮常規(guī)數(shù)據(jù),那么就在join子查詢中使用group查詢。

但是在SQL2003中定義了窗口函數(shù),這個(gè)在很多主流數(shù)據(jù)庫(kù)都實(shí)現(xiàn)了它。窗口函數(shù)能夠在結(jié)果集上聚合數(shù)據(jù),但是卻沒(méi)有分組。事實(shí)上,每個(gè)窗口函數(shù)都有自己的、獨(dú)立的PARTITION BY語(yǔ)句,這個(gè)工具對(duì)于顯示報(bào)告太TM好了。

9. 使用內(nèi)存間接排序

SQLORDER BY語(yǔ)句支持很多類(lèi)型的表達(dá)式,包括CASE語(yǔ)句,對(duì)于間接排序十分有用。你可能重來(lái)不會(huì)在Java內(nèi)存中排序數(shù)據(jù)

10. 一條一條的插入大量紀(jì)錄

JDBC ”懂“批處理(batch),你應(yīng)該不會(huì)忘了它。不要使用INSERT語(yǔ)句來(lái)一條一條的出入成千上萬(wàn)的記錄,因?yàn)槊看味紩?huì)創(chuàng)建一個(gè)新的PreparedStatement對(duì)象。如果你的所有記錄都插入到同一個(gè)表時(shí),那么就創(chuàng)建一個(gè)帶有一條SQL語(yǔ)句以及附帶很多值集合的插入批處理語(yǔ)句。你可能需要在達(dá)到一定量的插入記錄后才提交來(lái)保證UNDO日志瘦小,這依賴于你的數(shù)據(jù)庫(kù)和數(shù)據(jù)庫(kù)設(shè)置。


標(biāo)簽: Java開(kāi)發(fā)
主站蜘蛛池模板: 蜜桃精品视频在线 | 国产AV尤物一区二区三区 | 蜜桃视频在线网站 | 毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 未满成年国产在线观看 | 五月天婷亚洲天久久综合网 | 日本在线看片免费人成视1000 | 欧美网站一区二区 | 黄色免费大片 | 中文字幕无码久久一区 | 在线日本欧美 | 国产成人亚洲精品无码影院BT | 亚洲国产精品无码专区影院 | 国产乱子一区二区 | 老师好湿好紧我要进去了在线观看 | 欧美人妻小说 | av小簧片在线亚洲天堂在线 | 久久亚洲日本 | 高清视频播放在线观看 | 成人欧美一区二区三区在线播放 | 国产三级韩国三级日产三级剧情 | 一区二区视频免费观看 | 毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 久久亚洲A精品网站婷婷 | 国产男人操女人 | 99re66在线观看精品免费 | 99久久黄色 | 八区精品色欲人妻综合网 | 国产第一页浮力影院入口 | 500av导航大全精品 | 黄色直接看 | 亚洲AV成人无码一区在线观看 | 精品服丝袜无码视频一区 | 国产婷婷综合在线视频 | 日韩3区 | 国产成人AV无码永久免费一线天 | 性欧洲黑人巨大videos | 夏同学福利网 | av在线免费视屏 | 国产性av | 九九九久久久精品 |