Free性欧美Hd另类_精品亚洲欧美视频在线观看_freesex欧美喷水_字幕av在线_久久久久久国产免费_伊人5566

中培偉業IT資訊頻道
您現在的位置:首頁 > IT資訊 > 軟件研發 > Java開發人員開發SQL程序的常見錯誤

Java開發人員開發SQL程序的常見錯誤

2017-03-30 17:01:21 | 來源:中培企業IT培訓網

Java開發人員來說,SQL這種說明性語言而非面向對象或是命令式編程語言也讓其開發成為一大難題中培偉業《企業級JAVA高級開發技術實戰》培訓專家程老師表示,SQL中要寫個查詢語句是很簡單的但在Java里類似的語句卻不容易,因為程序員不僅要反復考慮編程范式,而且也要考慮算法的問題。程老師在這里就Java程序員在寫SQL時常犯的錯誤以及相應的解決方法進行了介紹。

1.NULL拋諸腦后

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

2.Java內存中處理數據

很少有Java開發者能將SQL理解的很好偶爾使用的JOIN,還有古怪的UNION,好吧但是對于窗口函數呢還有對集合進行分組呢許多的Java開發者將SQL數據加載到內存中將這些數據轉換成某些相近的集合類型然后再那些集合上面使用邊界循環控制結構至少在Java8的集合升級以前執行令人生厭的數學運算

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

性能表現.數據庫應該比你的算法處理起來更加快而且更加重要的是你不必再去傳遞數百萬條記錄了

3. 使用UNION代替UNION ALL

太可恥了,和UNION相比UNION ALL還需要額外的關鍵字。如果SQL標準已經規定了支持,那么可能會更好點。

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

注意即使SQL標準規定了INTERSECT ALLEXCEPT ALL,很少數據庫會實現這些沒用的集合操作符。

 4.通過JDBC分頁技術給大量的結果進行分頁操作

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

5.java內存中加入數據

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

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

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

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

對具有很多列的龐大的結果集合來說它很慢。DISTINCT要執行ORDER BY操作來消除重復。對龐大的笛卡爾積集合來說它很慢,還是需要加載很多的數據到內存中。

7. 不使用MERGE語句

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

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

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

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

9. 使用內存間接排序

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

10. 一條一條的插入大量紀錄

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


標簽: Java開發
主站蜘蛛池模板: 成人免费av在线播放 | 欧美疯狂xxx免费视频 | 亚洲一区二区三区四区的 | 欧美精品久久99人妻无码 | 国产无套精品久久久久久 | 夜夜调教禁脔欢爱h | 美女又大又黄www免费网站 | 国产91精品久久久久久久 | 欧美黑人又粗又大又爽免费 | 国产精品视频一区二区免费不卡 | 三年中文在线观看免费大全 | 日韩欧美成人影院 | 色综合久久久久综合一小说 | 黄页在线免费看 | 国产A∨天天免费观看美女 在线免费观看视频黄 | 国产日产精品久久久久快鸭 | 国产不卡一级无码视频 | 天天躁日日躁狠狠躁av麻豆男男 | 中文字幕另类日韩欧美亚洲嫩草 | 日韩一区二区三区高清免费看看 | 黄色一级片在线播放 | 成人爽a毛片免费啪啪红桃视频 | 欧美激情精品久久久久久不卡 | 国内揄拍国内精品少妇国语 | 欧美日韩网站在线观看 | 中文字幕有码无码人妻在线 | 亚洲一级在线 | 伊人狠狠色丁香婷婷综合动态图 | 国产骚货在线播放 | 国产欧美一区二区三区观看不卡 | 在线视频免费观看国产 | 1769免费视频在线观看 | 中文字幕在线无码手机一区 | 68精品国产免费久久久久久婷婷 | 神马久久久久久久久久久 | 1区2区3区4区产品乱码入口 | www.youjizz.com在线| 久久九九国产视频 | 国产精品黑色丝袜高跟鞋 | 18欧美乱大交 | 久久精品爱视频 |