无码人妻A片一区二区三区_18禁裸乳无遮挡啪啪无码免费_91精品亚?影视在线?看_人人妻人人爽人人澡AV_国产精品人妻一区二区三区四区_午夜免费影视

中培偉業(yè)IT資訊頻道
您現(xiàn)在的位置:首頁 > IT資訊 > 軟件研發(fā) > 詳解Java開發(fā)工程師在寫SQL程序時的經(jīng)常性錯誤

詳解Java開發(fā)工程師在寫SQL程序時的經(jīng)常性錯誤

2016-09-05 15:26:54 | 來源:中培企業(yè)IT培訓網(wǎng)
對Java開發(fā)人員來說,SQL這種說明性語言而非面向?qū)ο蠡蚴敲钍骄幊陶Z言也讓其開發(fā)成為一大難題。 ???中培偉業(yè)《JAVA高級開發(fā)技術實戰(zhàn)》培訓專家程老師表示??,??????在SQL中要寫個查詢語句是很簡單的,但在Java里類似的語句卻不容易,因為程序員不僅要反復考慮編程范式,而且也要考慮算法的問題。程老師在這里就????Java程序員在寫SQL時常犯的錯誤以及相應的解決方法進行了介紹。 ?????????  1.將NULL拋諸腦后  Java程序員寫SQL時對NULL的誤解可能是最大的錯誤。也許是因為(并非唯一理由)NULL也稱作UNKNOWN。如果被稱作UNKNOWN,這還好理解些。另一個原因是,當你從數(shù)據(jù)庫拿東西或是綁定變量時,JDBC將SQL NULL 和Java中的null對應了起來。這樣導致了NULL = NULL(SQL)和null=null(Java)的誤解。  對于NULL最大的誤解是當NULL被用作行值表達式完整性約束條件時。  另一個誤解出現(xiàn)在對于NULL 在 NOT IN anti-joins的應用中。  解決方法:  好好的訓練你自己。當你寫SQL時要不停得想到NULL的用法:  這個NULL完整性約束條件是正確的?  NULL是否影響到結(jié)果?  2.在Java內(nèi)存中處理數(shù)據(jù)  很少有Java開發(fā)者能將SQL理解的很好.偶爾使用的JOIN,還有古怪的UNION,好吧.但是對于窗口函數(shù)呢?還有對集合進行分組呢?許多的Java開發(fā)者將SQL數(shù)據(jù)加載到內(nèi)存中,將這些數(shù)據(jù)轉(zhuǎn)換成某些相近的集合類型,然后再那些集合上面使用邊界循環(huán)控制結(jié)構(gòu)(至少在Java8的集合升級以前)執(zhí)行令人生厭的數(shù)學運算.  但是一些SQL數(shù)據(jù)庫支持先進的(而且是SQL 標準支持的!)OLAP特性,這一特性表現(xiàn)更好而且寫起來也更加方便.一個(并不怎么標準的)例子就是Oracle超棒的MODEL分句.只讓數(shù)據(jù)庫來做處理然后只把結(jié)果帶到Java內(nèi)存中吧.因為畢竟所有非常聰明的家伙已經(jīng)對這些昂貴的產(chǎn)品進行了優(yōu)化.因此實際上,通過將OLAP移到數(shù)據(jù)庫,你將獲得一下兩項好處:  便利性.這比在Java中編寫正確的SQL可能更加的容易.  性能表現(xiàn).數(shù)據(jù)庫應該比你的算法處理起來更加快.而且更加重要的是,你不必再去傳遞數(shù)百萬條記錄了.  完善的方法:  每次你使用Java實現(xiàn)一個以數(shù)據(jù)為中心的算法時,問問自己:有沒有一種方法可以讓數(shù)據(jù)庫代替為我做這種麻煩事.  3. 使用UNION代替UNION ALL  太可恥了,和UNION相比UNION ALL還需要額外的關鍵字。如果SQL標準已經(jīng)規(guī)定了支持,那么可能會更好點。  UNION(允許重復)  UNION DISTINCT (去除了重復)  移除重復行不僅很少需要(有時甚至是錯的),而且對于帶很多行的大數(shù)據(jù)集合會相當慢,因為兩個子select需要排序,而且每個元組也需要和它的子序列元組比較。  注意即使SQL標準規(guī)定了INTERSECT ALL和EXCEPT ALL,很少數(shù)據(jù)庫會實現(xiàn)這些沒用的集合操作符。  處理方法:  每次你寫UNION語句時,考慮實際上是否需要UNION ALL語句。  4.通過JDBC分頁技術給大量的結(jié)果進行分頁操作  大部分的數(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ù)中,效果尤其明顯。  糾正:  僅僅使用這些語句,那么一個工具(例如JOOQ)就可以模擬這些語句的操作。  5.在java內(nèi)存中加入數(shù)據(jù)  從SQL的初期開始,當在SQL中使用JOIN語句時,一些開發(fā)者仍舊有不安的感覺。這是源自對加入JOIN后會變慢的固有恐懼。假如基于成本的優(yōu)化選擇去實現(xiàn)嵌套循環(huán),在創(chuàng)建一張連接表源前,可能加載所有的表在數(shù)據(jù)庫內(nèi)存中,這可能是真的。但是這事發(fā)生的概率太低了。通過合適的預測,約束和索引,合并連接和哈希連接的操作都是相當?shù)目臁_@完全是是關于正確元數(shù)據(jù)(在這里我不能夠引用Tom Kyte的太多)。而且,可能仍然有不少的Java開發(fā)人員加載兩張表通過分開查詢到一個映射中,并且在某種程度上把他們加到了內(nèi)存當中。  糾正:  假如你在各個步驟中有從各種表的查詢操作,好好想想是否可以表達你的查詢操作在單條語句中。  6.在一個臨時的笛卡爾積集合中使用 DISTINCT 或 UNION 消除重復項  通過復雜的連接,人們可能會對SQL語句中扮演關鍵角色的所有關系失去概念。特別的,如果這涉及到多列外鍵關系的話,很有可能會忘記在JOIN .. ON子句中增加相關的判斷。這會導致重復的記錄,但或許只是在特殊的情況下。有些開發(fā)者因此可能選擇DISTINCT來消除這些重復記錄。從三個方面來說這是錯誤的:  它(也許)解決了表面癥狀但并沒有解決問題。它也有可能無法解決極端情況下的癥狀。  對具有很多列的龐大的結(jié)果集合來說它很慢。DISTINCT要執(zhí)行ORDER BY操作來消除重復。  對龐大的笛卡爾積集合來說它很慢,還是需要加載很多的數(shù)據(jù)到內(nèi)存中。  解決方法:  根據(jù)經(jīng)驗,如果你獲得了不需要的重復記錄,還是檢查你的JOIN判斷吧。可能在某個地方有一個很難覺察的笛卡爾積集合。  7. 不使用MERGE語句  這并不是一個過失,但是可能是缺少知識或者對于強悍的MERGE語句信心不足。一些數(shù)據(jù)庫理解其它形式的更新插入(UPSERT)語句, 如MYSQL的重復主鍵更新語句,但是MERGE在數(shù)據(jù)庫中確是很強大,很重要,以至于大肆擴展SQL標準,例如SQL SERVER。  解決之道:  如果你使用像聯(lián)合INSERT和UPDATE或者聯(lián)合SELECT .. FOR UPDATE然后在INSERT或UPDATE等更新插入時,請三思。你完全可以使用一個更簡單的MERGE語句來遠離冒險競爭條件。  8. 使用聚合函數(shù)代替窗口函數(shù)(window functions)  在介紹窗口函數(shù)之前,在SQL中聚合數(shù)據(jù)意味著使用GROUP BY語句與聚合函數(shù)相映射。在很多情形下都工作得很好,如聚合數(shù)據(jù)需要濃縮常規(guī)數(shù)據(jù),那么就在join子查詢中使用group查詢。  但是在SQL:2003中定義了窗口函數(shù),這個在很多主流數(shù)據(jù)庫都實現(xiàn)了它。窗口函數(shù)能夠在結(jié)果集上聚合數(shù)據(jù),但是卻沒有分組。事實上,每個窗口函數(shù)都有自己的、獨立的PARTITION BY語句,這個工具對于顯示報告太TM好了。  使用窗口函數(shù):  使SQL更易讀(但在子查詢中沒有GROUP BY語句專業(yè))  提升性能,像關系數(shù)據(jù)庫管理系統(tǒng)能夠更容易優(yōu)化窗口函數(shù)  解決方法:  當你在子查詢中使用GROUP BY語句時,請再三考慮是否可以使用窗口函數(shù)完成。  9. 使用內(nèi)存間接排序  SQL的ORDER BY語句支持很多類型的表達式,包括CASE語句,對于間接排序十分有用。你可能重來不會在Java內(nèi)存中排序數(shù)據(jù),因為你會想:  SQL排序很慢  SQL排序辦不到  處理方法:  如果你在內(nèi)存中排序任何SQL數(shù)據(jù),請再三考慮,是否不能在數(shù)據(jù)庫中排序。這對于數(shù)據(jù)庫分頁數(shù)據(jù)十分有用。  10. 一條一條的插入大量紀錄  JDBC ”懂“批處理(batch),你應該不會忘了它。不要使用INSERT語句來一條一條的出入成千上萬的記錄,(因為)每次都會創(chuàng)建一個新的PreparedStatement對象。如果你的所有記錄都插入到同一個表時,那么就創(chuàng)建一個帶有一條SQL語句以及附帶很多值集合的插入批處理語句。你可能需要在達到一定量的插入記錄后才提交來保證UNDO日志瘦小,這依賴于你的數(shù)據(jù)庫和數(shù)據(jù)庫設置。  處理方法:  總是使用批處理插入大量數(shù)據(jù)。
標簽: Java開發(fā)
主站蜘蛛池模板: 91插插影院| 欧美日韩国产不卡 | 国产大学生情侣自啪高清 | 国产一级视频观看 | 一区二区三区精品视频免费播放 | 最美女人体内射精一区二区 | 在线观看av不卡网站永久 | 欧美性视频网站 | 亚洲网站视频福利 | 18禁高h高辣小说文 久久久久久久久久久网 | 玩弄丰满奶水的女邻居 | 人妻忍着娇喘被中进中出视频 | 国产经典在线 | 天天澡天天添天天摸av | 国产精品久久久久久久女厕留拍 | 久久精品国产精品亚洲精品 | 戴着项圈的贵妇被调教 | 海角国精产品一区一区三区糖心 | 97超碰人人模人人人爽人人爱 | 日本午夜在线视频 | 欧美日韩一区二 | 91福利社在线 | 国产亚洲精品久久久久久动漫 | 日本视频在线观看 | 波多野结衣乱码中文字幕 | 免费不卡视频 | 中文字幕亚洲欧美在线 | 农民工嫖妓50岁老熟女 | 国产精品久久久久这里只有精品 | 在线观看黄免费 | 色婷婷av一区二区三区之红樱桃 | 欧美黄页在线观看 | 国产午夜精品一区理论片 | 少妇饥渴XXHD麻豆XXHD骆驼 | 波多野中文字幕 | 亚洲性人人天天夜夜摸 | 一级三级毛片 | 国产成人无码a区精油按摩 黄色av网站在线播放 | 催眠调教美妇长辈后宫h | aaaaaaa片毛片免费观看 | 午夜大片|