欧美麻豆久久久久久中文_成年免费观看_男人天堂亚洲成人_中国一级片_动漫黄网站免费永久在线观看_国产精品自产av一区二区三区

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

Java開發(fā)人員開發(fā)SQL程序的常見錯誤

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

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

1.NULL拋諸腦后

Java程序員寫SQL時對NULL的誤解可能是最大的錯誤。也許是因為并非唯一理由)NULL也稱作UNKNOWN。如果被稱作UNKNOWN,這還好理解些。另一個原因是,當(dāng)你從數(shù)據(jù)庫拿東西或是綁定變量時,JDBCSQL NULL Java中的null對應(yīng)了起來。這樣導(dǎo)致了NULL = NULL(SQL)null=null(Java)的誤解。

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

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

但是一些SQL數(shù)據(jù)庫支持先進(jìn)的而且是SQL 標(biāo)準(zhǔn)支持的!)OLAP特性這一特性表現(xiàn)更好而且寫起來也更加方便一個并不怎么標(biāo)準(zhǔn)的例子就是Oracle超棒的MODEL分句只讓數(shù)據(jù)庫來做處理然后只把結(jié)果帶到Java內(nèi)存中吧因為畢竟所有非常聰明的家伙已經(jīng)對這些昂貴的產(chǎn)品進(jìn)行了優(yōu)化因此實際上通過將OLAP移到數(shù)據(jù)庫

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

3. 使用UNION代替UNION ALL

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

移除重復(fù)行不僅很少需要(有時甚至是錯的,而且對于帶很多行的大數(shù)據(jù)集合會相當(dāng)慢,因為兩個子select需要排序,而且每個元組也需要和它的子序列元組比較。

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

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

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

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

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

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

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

它(也許解決了表面癥狀但并沒有解決問題。它也有可能無法解決極端情況下的癥狀。

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

7. 不使用MERGE語句

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

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

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

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

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

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

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

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


標(biāo)簽: Java開發(fā)
主站蜘蛛池模板: 国产又黄又潮娇喘视频 | 久久亚洲精品无码AV大香 | 亚洲人成网站在线播放vr | 国产午夜激无码AV毛片不 | 黄色免费观看视频 | 国产欧美在线亚洲一区 | 国内精品免费一区二区2001 | 老师露双奶头无遮挡挤奶视频 | 人妻少妇69式99偷拍 | 国产精品国产三级国快看 | 色噜噜亚洲男人的天堂 | 韩国三级l中文字幕无码 | 久久影片 | 最好看免费中文字幕2018 | 色94色欧美sute亚洲线路二 | 乱码精品一卡二卡无卡 | 欧美a级成人网站免费 | 日本三级韩国三级香港三级写真集 | 一色桃子av一区二区 | 综合图区亚洲欧美另类图片 | 丰满岳乱妇在线观看中字 | 大雞巴亂倫有声小说 | 精品国产乱码久久久久软件 | 精品国产三级在线观看 | 亚洲成在人线AV品善网好看 | 大学生男男澡堂69GAYSEX | 99久久无码一区人妻A片孕妇 | 四季中文字幕av | 久久国内精品自在自线 | 波多野结衣高清一区二区三区 | 偷窥xxxx盗摄国产 | 亚洲人成伊人成综合网小说 | 女厕厕露P撒尿八个少妇 | 少妇爆乳无码专区网站 | 最近更新中文字幕在线2018二 | 手机在线观看AV无码片 | 精品人妻无码一区二区三区下一 | 好吊在线观看 | 欧美粗又大gay69 | 中国老太婆bbbbbxxxxx | 精品日产一区二区三区 |