《Oracle9i&10g編程藝術(shù)》讀后感

          《Oracle9i&10g編程藝術(shù)--深入數(shù)據(jù)庫體系結(jié)構(gòu)》即為《Expert one to one oracle》的升級版本,不過升級后可能會變?yōu)槿緯@本書強調(diào)的是深入數(shù)據(jù)庫體系結(jié)構(gòu)的講解,本書的作者Thomas Kyte(即Tom)無疑是Oracle界最為知名的人物,而這本書可以說基本是專為開發(fā)人員而寫的,因為我個人覺得書中講的東西大部分DBA都是懂的,但對于開發(fā)人員來講估計大部分都不懂,Thomas Kyte抓住了怎么給開發(fā)人員講才能講清的方法,對于書中的每項內(nèi)容Thomas會講解什么時候這么做、為什么要這么做、什么時候不能這么做以及為什么不這么做,要說服開發(fā)人員,很多時候除了告訴怎么做以外,還必須得告訴為什么要這么做,否則很難說服,而Tom在書中則很好的做到了這點,Tom會告訴你Oracle是怎么去實現(xiàn)的,所以你要這么做或者不能這么做,這本書除了讓我學(xué)習(xí)到了更多的Oracle知識外,還讓我更加明白了數(shù)據(jù)庫在系統(tǒng)中的重要性以及充分發(fā)揮數(shù)據(jù)庫的功能是多么重要的一件事,還有一個附加的好處就是讓我們可以窺探到部分Oracle的設(shè)計,對于自己實現(xiàn)應(yīng)用系統(tǒng)也是會找到一些可參考的地方,這本書寫的實在是太好了,強烈推薦給開發(fā)人員看。
          按照書中所講的東西,個人覺得開發(fā)人員對于數(shù)據(jù)庫應(yīng)了解如下內(nèi)容:
          1、讀一致性
                Oracle在讀數(shù)據(jù)時采用的是保證數(shù)據(jù)一致的方法,也就是說查詢出的所有數(shù)據(jù)均為發(fā)起查詢時的數(shù)據(jù),Oracle這么做的主要原因是為了避免讀阻塞寫,這么設(shè)計的目的是為了支持高并發(fā),而其他的數(shù)據(jù)庫有些不是這么做的,就像在sql server中需要明確的在查詢語句中加上with nolock才會避免讀阻塞寫。
                以一個這樣的例子來說明下oracle的讀一致性:
                假設(shè)現(xiàn)在有一張賬戶表,來看看同時進(jìn)行的一個轉(zhuǎn)賬動作和查詢動作:
                查詢動作:查詢所有賬戶的money的總數(shù);
                轉(zhuǎn)賬動作:從A賬戶轉(zhuǎn)400到B賬戶。
                查詢到A賬戶的money為:600
                                                                              更新A賬戶的錢為200
                查詢到C賬戶的money為:100
                                                                              更新B賬戶的錢為500+400
                                                                              提交。
                此時查詢才查詢到B賬戶,那么
                這個時候查詢到的B賬戶的money到底是500還是900呢?
                按照oracle的讀一致性非常明顯這個時候查詢到的B賬戶的money會是500,這就是讀一致性的概念,在其他的讀會阻塞寫的數(shù)據(jù)庫中確實不會出現(xiàn)這樣的疑問(因為轉(zhuǎn)賬的動作得等到查詢動作結(jié)束后才能執(zhí)行),但那樣的方式很大程度降低了數(shù)據(jù)庫的可并發(fā)性,在后面的redo&undo中會講講oracle的這種讀一致性是怎么實現(xiàn)的。                                    
          2、鎖機制
                Oracle主要有行級鎖和表級鎖,大多數(shù)情況下Oracle都只會出現(xiàn)行級鎖,很少會出現(xiàn)表級鎖,所以在oracle中出現(xiàn)死鎖的現(xiàn)象還是非常少的,開發(fā)人員在設(shè)計系統(tǒng)時應(yīng)盡量避免等待行鎖的現(xiàn)象,也就是避免多人共同修改同一行,只要解決了這種現(xiàn)象,其實也就意味著Oracle支持高并發(fā)是完全沒有任何問題的,關(guān)于鎖定機制最容易出現(xiàn)的問題就是丟失更新這個問題了。     
          3、丟失更新
                丟失更新的實際例子就是:A、B均已讀出數(shù)據(jù)并開始進(jìn)行修改,當(dāng)A提交數(shù)據(jù)后,B再提交就出現(xiàn)了B覆蓋掉A修改的內(nèi)容的情況。
                丟失更新的解決方法通常都是采用版本列、時間戳列這樣的方法來實現(xiàn),不過只有在多并發(fā)共同修改同一行的系統(tǒng)中才需要慎重的考慮這個問題。
          4、索引
                索引無疑是數(shù)據(jù)庫中非常重要的機制,盡管這個更多的可以交給DBA來進(jìn)行調(diào)優(yōu)設(shè)計,不過開發(fā)人員還是要大概的有所了解,至少要知道索引有哪幾種(B樹索引、函數(shù)索引、bitmap索引、聚簇索引、對部分行建索引等),什么場合下適合用哪種索引。
                Tom在書中強調(diào)了很多次,沒有"fast=true"這種銀彈式的提速開關(guān),只能是根據(jù)實際情況來分析,也就是說不是說只要加了索引性能就會提升的,索引主要是為了查詢大表中的少量數(shù)據(jù)的,Tom在書中講解了索引的查找數(shù)據(jù)的方法(索引中映射到的為rowid,在查找到索引后查找數(shù)據(jù)時oracle是根據(jù)每個rowid去表存儲的塊中讀取的),按照其查找數(shù)據(jù)的方法完全有可能出現(xiàn)查找索引比全表掃描還慢的現(xiàn)象,舉例來說明下:
                假設(shè)一張表有100,000行記錄,現(xiàn)在我們要讀取其中的20,000行,假設(shè)每行的大小約為80字節(jié),數(shù)據(jù)庫的塊大小為8k,在這種情況下表中的記錄大約會產(chǎn)生1000個塊,那么這個時候使用索引讀取的話就要做20,000次Table access by rowid,而整個表都只有1000個塊,也就是說即使全表掃描也只需要做1000次的動作,但現(xiàn)在竟然要做20,000次,自然慢多了。
                 索引還和物理組織呀、聚簇因子呀等等都有關(guān)系。
          5、Oracle文件
                Oracle文件主要有服務(wù)器參數(shù)文件、數(shù)據(jù)文件、控制文件、密碼文件、在線日志文件等等,這些開發(fā)人員也應(yīng)該大概的了解下。
          6、事務(wù)
                事務(wù)對于并發(fā)系統(tǒng)而言也是非常重要的機制,所以開發(fā)人員要對這塊比較了解,Oracle建議是否提交事務(wù)要根據(jù)數(shù)據(jù)邏輯的完整性來決定,而不是說越快提交越好,oracle會保證語句級的原子性(例如執(zhí)行語句時的觸發(fā)器、存儲過程都會控制在統(tǒng)一的事務(wù)范圍),同時oracle還支持像分布式事務(wù)、自治事務(wù)等。
                對于開發(fā)人員而言,要把握的就是什么時候提交事務(wù),應(yīng)該注意的就是事務(wù)應(yīng)該控制在自己手里來決定什么時候提交,像對于使用jdbc的java開發(fā)人員而言,要注意,jdbc默認(rèn)是執(zhí)行一條就提交一條的。
          7、redo&undo
                redo和undo絕對是oracle中非常重要的兩個東西,redo用來記錄所有的操作,以便oracle在遇到斷電等等意外的情況下也可準(zhǔn)確的恢復(fù)實例和之前的動作,而undo則是用來記錄所有的操作的逆動作,以支持像回滾、讀一致性這樣的操作,從這里我們就可以知道當(dāng)undo設(shè)置的太小或查詢執(zhí)行時間太長的時候,就可能會出現(xiàn)snapshoot too old這種錯誤。
                從這個章節(jié)中還得學(xué)會評估redo、undo產(chǎn)生的大小,另外就是遵循Tom所說的生產(chǎn)環(huán)境一定要是archivelog模式的,否則數(shù)據(jù)丟了也就只能哭了。
          8、數(shù)據(jù)庫表
                要了解下oracle中的堆組織表、索引組織表、聚簇索引表等幾種表的形式。
          9、數(shù)據(jù)類型
                要了解下oracle中的varchar2、number、lob這些類型。
          10、表和索引分區(qū)
                  應(yīng)該了解oracle支持哪幾種表和索引分區(qū),什么時候用,怎么去用,開發(fā)人員要了解的原因是其實表和索引分區(qū)要高效的使用是得根據(jù)業(yè)務(wù)分析來形成的,隨意的表和索引分區(qū)很有可能會造成性能下降。
          這些方面應(yīng)該是開發(fā)人員至少應(yīng)該了解的,在數(shù)據(jù)庫方面的開發(fā)上開發(fā)人員最應(yīng)該關(guān)注的就是基本的SQL編寫優(yōu)化法則、并發(fā)和鎖的控制機制、事務(wù)使用機制,因為對于開發(fā)而言,會帶來挑戰(zhàn)的就是在并發(fā)的情況下,設(shè)計人員則應(yīng)根據(jù)數(shù)據(jù)庫的并發(fā)實現(xiàn)機制來盡量減少鎖等待的現(xiàn)象,其他的調(diào)優(yōu)工作可以由DBA來完成,但開發(fā)人員也應(yīng)該提供輔助,像表分區(qū)的做法等等。
          根據(jù)Tom在書中描述的數(shù)據(jù)庫的鎖機制、并發(fā)機制等等,可以看出每種數(shù)據(jù)庫在實現(xiàn)這些方面都是不一樣的,所以要做到數(shù)據(jù)庫獨立性其實是不可能的,就像Tom說的,付出了那么高的價格買下了數(shù)據(jù)庫,難道你就只是把它當(dāng)成一個簡單的文件系統(tǒng)而使用,而不去充分使用/發(fā)揮它的功能,因為很多時候你付出了巨大努力實現(xiàn)的東西對于數(shù)據(jù)庫而言也許就只是簡單的一句話而已,所以從此我對數(shù)據(jù)庫獨立性也say NO!,即使是使用Hibernate這種相對來講可以使數(shù)據(jù)庫獨立的東西,幾個簡單的例子來說明在數(shù)據(jù)庫切換時要做的工作:
          1、is null和字段=null
                在Oracle和SQL Server中采用的均為is null,而在有些數(shù)據(jù)庫里采用的則是字段=null的方式來獲取。
          2、函數(shù)
                例如sql server的dateadd、identity這些,到了oracle中自然要切換。
          3、鎖機制
                這個是最麻煩的,就像你在oracle中可以使用select而不必?fù)?dān)心讀會阻塞寫,但在sql server中就得帶上with nolock。
          4、事務(wù)
                雖然表面看起來事務(wù)類型都是一樣的,但各種數(shù)據(jù)庫實現(xiàn)事務(wù)機制方法的不同決定了在切換的時候還得考慮事務(wù)使用上是不是要修改。
          對于1、2兩點你可以盡量的避免,3、4兩點則是無法避免的,所以在是使用數(shù)據(jù)庫上不用過多的去考慮數(shù)據(jù)庫獨立性的實現(xiàn),當(dāng)然,這并不意味著hibernate這些ORM的東西就不需要了,:),我倒是一直非常希望有哪個ORM工具能透明實現(xiàn)數(shù)據(jù)庫的切換,包括上面所說的那些機制的自動轉(zhuǎn)換,但這相對而言幾乎是不可能的,因為要對每種數(shù)據(jù)庫都精通才能做得到。

          posted on 2007-08-10 12:20 BlueDavy 閱讀(4361) 評論(3)  編輯  收藏 所屬分類: 業(yè)界隨想

          評論

          # re: 《Oracle9i&10g編程藝術(shù)》讀后感 2007-08-10 18:08 mingj

          1、is null和字段=null
          這種在oracle和sql server中非常明顯,前者為oracle的,后者為sql server的。


          sql server 是 is null  回復(fù)  更多評論   

          # re: 《Oracle9i&10g編程藝術(shù)》讀后感 2007-08-11 09:41 BlueDavy

          @mingj
          多謝提醒。
          看來是其他的數(shù)據(jù)庫才支持字段=null的這種方式,oracle和sql server均為采用is null的方式。
            回復(fù)  更多評論   

          # re: 《Oracle9i&10g編程藝術(shù)》讀后感 2010-09-28 23:25 youlong699

          哈哈,您的讀后感很棒,“Thomas Kyte抓住了怎么給開發(fā)人員講才能講清的方法,對于書中的每項內(nèi)容Thomas會講解什么時候這么做、為什么要這么做、什么時候不能這么做以及為什么不這么做,要說服開發(fā)人員,很多時候除了告訴怎么做以外,還必須得告訴為什么要這么做,否則很難說服”。
          您的分布式JAVA什么時候也打磨到這個水平啊~~  回復(fù)  更多評論   

          公告

           









          feedsky
          抓蝦
          google reader
          鮮果

          導(dǎo)航

          <2007年8月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          統(tǒng)計

          隨筆分類

          隨筆檔案

          文章檔案

          Blogger's

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 苏尼特左旗| 化隆| 城固县| 六枝特区| 长治县| 华坪县| 苗栗县| 白河县| 莱西市| 曲水县| 巩留县| 宁津县| 罗定市| 晴隆县| 子长县| 东乌| 酒泉市| 明溪县| 建水县| 台前县| 涡阳县| 郎溪县| 拜城县| 乃东县| 广州市| 曲沃县| 饶阳县| 宜宾县| 永州市| 靖州| 东源县| 迭部县| 厦门市| 西安市| 浮山县| 盐城市| 濉溪县| 龙陵县| 绿春县| 弥勒县| 博乐市|