主頁(yè) > 知識(shí)庫(kù) > ORACLE數(shù)據(jù)庫(kù)應(yīng)用開(kāi)發(fā)的三十個(gè)注意事項(xiàng)

ORACLE數(shù)據(jù)庫(kù)應(yīng)用開(kāi)發(fā)的三十個(gè)注意事項(xiàng)

熱門(mén)標(biāo)簽:AI電銷 呼叫中心市場(chǎng)需求 網(wǎng)站排名優(yōu)化 地方門(mén)戶網(wǎng)站 Linux服務(wù)器 服務(wù)外包 鐵路電話系統(tǒng) 百度競(jìng)價(jià)排名

引言

筆者及所在團(tuán)隊(duì)從2000年開(kāi)始的CRM等系統(tǒng)開(kāi)發(fā),一直主要使用ORACLE數(shù)據(jù)庫(kù)作為應(yīng)用數(shù)據(jù)庫(kù),開(kāi)發(fā)方式包括使用PLSQL編寫(xiě)存儲(chǔ)過(guò)程/數(shù)據(jù)庫(kù)函數(shù)/觸發(fā)器、使用ODBC或OCI和ProC開(kāi)發(fā)C++應(yīng)用、使用JDBC開(kāi)發(fā)Java應(yīng)用、使用tuxdeo開(kāi)發(fā)中間件應(yīng)用等。這些應(yīng)用開(kāi)發(fā)筆者所在團(tuán)隊(duì)自己做過(guò),也委托華為、亞信、思特奇等國(guó)內(nèi)廠商合作做過(guò),整體來(lái)說(shuō)ORACLE數(shù)據(jù)庫(kù)功能強(qiáng)大、性能出眾、系統(tǒng)健壯,確實(shí)是OLTP聯(lián)機(jī)事務(wù)處理的最受歡迎的數(shù)據(jù)庫(kù)。

因ORACLE服務(wù)費(fèi)居高不下、加上最近幾年美國(guó)的操弄打壓,國(guó)產(chǎn)數(shù)據(jù)庫(kù)也走出了一條自己的路,因此數(shù)據(jù)庫(kù)國(guó)產(chǎn)化也越來(lái)越被提上日程,也有部分應(yīng)用走出了成功之路,但眾多傳統(tǒng)應(yīng)用進(jìn)行國(guó)產(chǎn)數(shù)據(jù)庫(kù)的改造需要大量投入,也需要一個(gè)逐步試點(diǎn)及改造的過(guò)程,因此ORACLE仍然是國(guó)內(nèi)眾多單位持續(xù)應(yīng)用的選擇。

今天老猿結(jié)合二十余年的ORACLE數(shù)據(jù)庫(kù)應(yīng)用開(kāi)發(fā)和運(yùn)維的經(jīng)驗(yàn)教訓(xùn),總結(jié)在使用ORACLE數(shù)據(jù)庫(kù)環(huán)境中的應(yīng)用開(kāi)發(fā)中需要注意的一些注意事項(xiàng),這些問(wèn)題不但可以作為ORACLE數(shù)據(jù)庫(kù)開(kāi)發(fā)的注意事項(xiàng),大多數(shù)也適用于常見(jiàn)的關(guān)系型數(shù)據(jù)庫(kù)開(kāi)發(fā)甚至非關(guān)系型數(shù)據(jù)開(kāi)發(fā)。

實(shí)際上,在數(shù)據(jù)庫(kù)應(yīng)用開(kāi)發(fā)上,開(kāi)發(fā)和維護(hù)關(guān)聯(lián)度是非常大的,好的開(kāi)發(fā)設(shè)計(jì)會(huì)給維護(hù)帶來(lái)極大方便。因此雖然維護(hù)關(guān)注的角度和開(kāi)發(fā)有所不同,但在部分內(nèi)容上二者是統(tǒng)一的。

禁忌1:觸發(fā)器代碼忌復(fù)雜

數(shù)據(jù)庫(kù)觸發(fā)器由于可以基于表級(jí)進(jìn)行所有應(yīng)用或手工DML操作數(shù)據(jù)增刪改查的前向或后向處理,易于收斂邏輯,使用方便,容易受到眾多開(kāi)發(fā)人員的喜愛(ài)。

但在使用上觸發(fā)器與操作數(shù)據(jù)的事務(wù)處于同一個(gè)事務(wù),因此比較適合簡(jiǎn)單處理邏輯,切忌不能在觸發(fā)器上使用復(fù)雜邏輯,一般推薦在10行左右代碼比較適合,否則容易導(dǎo)致事務(wù)處理出現(xiàn)問(wèn)題。

如果一定要通過(guò)觸發(fā)器進(jìn)行復(fù)雜邏輯處理,最好的做法是通過(guò)觸發(fā)器將需要處理的數(shù)據(jù)寫(xiě)入到單獨(dú)的任務(wù)表中,然后使用單獨(dú)進(jìn)程對(duì)任務(wù)表數(shù)據(jù)進(jìn)行處理。這樣能使得觸發(fā)器和觸發(fā)源二者的事務(wù)解耦,又能收斂相關(guān)數(shù)據(jù)處理。

禁忌2:忌使用dblink

dblink提供的機(jī)制可以使得在一個(gè)數(shù)據(jù)庫(kù)的存儲(chǔ)過(guò)程、觸發(fā)器、數(shù)據(jù)庫(kù)函數(shù)中方便的訪問(wèn)另一個(gè)數(shù)據(jù)庫(kù),可以方便地為應(yīng)用只需連接一個(gè)數(shù)據(jù)庫(kù)就可以訪問(wèn)另一個(gè)數(shù)據(jù)庫(kù)中的數(shù)據(jù),因此給多數(shù)據(jù)庫(kù)環(huán)境使用帶來(lái)了很大的便利性。

但dblink在跨數(shù)據(jù)庫(kù)事務(wù)提交上容易引發(fā)問(wèn)題,一般可以在不帶事務(wù)的DML簡(jiǎn)單查詢中使用,如果一定要帶事務(wù)必須確保事務(wù)提交迅速,否則容易引發(fā)分布式事務(wù)鎖。而應(yīng)用程序中使用時(shí),由于運(yùn)行的環(huán)境復(fù)雜多變,無(wú)法百分之百保障事務(wù)的完整性和響應(yīng)快速,很容易引發(fā)分布式事務(wù)鎖并有一定幾率觸發(fā)ORACLE的BUG,同時(shí)dblink本身會(huì)大概率甚至百分之百帶來(lái)scn號(hào)跳變bug,并引發(fā)scn號(hào)跳變?cè)跀?shù)據(jù)庫(kù)間傳播。導(dǎo)致系統(tǒng)故障甚至數(shù)據(jù)庫(kù)癱瘓。因此不要在代碼開(kāi)發(fā)中使用dblink。平時(shí)運(yùn)維也盡量少用,如果一定要用最好不帶事務(wù),并盡快釋放連接。

禁忌3:忌用大表關(guān)聯(lián)統(tǒng)計(jì)

在一個(gè)系統(tǒng)中,除了實(shí)時(shí)類交易外,也存在一定要求數(shù)據(jù)實(shí)時(shí)的統(tǒng)計(jì)或查詢需求,針對(duì)這種數(shù)據(jù)統(tǒng)計(jì),切忌使用大表關(guān)聯(lián)進(jìn)行統(tǒng)計(jì),因?yàn)闀?huì)導(dǎo)致數(shù)據(jù)庫(kù)消耗大量計(jì)算資源、占用過(guò)多的臨時(shí)空間,影響其他實(shí)時(shí)業(yè)務(wù)的響應(yīng)甚至導(dǎo)致系統(tǒng)無(wú)法響應(yīng)。

對(duì)于這種需要跨多個(gè)大表的統(tǒng)計(jì),最理想的是不放在OLTP數(shù)據(jù)庫(kù)執(zhí)行,如果一定要執(zhí)行,一是要想辦法限制數(shù)據(jù)的范圍(如基于時(shí)間限制只能統(tǒng)計(jì)當(dāng)天的),二是對(duì)于兩個(gè)大表關(guān)聯(lián)的SQL進(jìn)行拆分,拆分成兩個(gè)SQL,前一個(gè)SQL獲取的數(shù)據(jù)通過(guò)游標(biāo)打開(kāi)后再逐條去另一個(gè)大表使用索引逐條數(shù)據(jù)進(jìn)行訪問(wèn),再用客戶端進(jìn)行統(tǒng)計(jì)運(yùn)算,或者通過(guò)游標(biāo)獲取數(shù)據(jù)生產(chǎn)臨時(shí)表再基于臨時(shí)表進(jìn)行統(tǒng)計(jì)。

禁忌4:忌用字典式字段索引

索引只有說(shuō)數(shù)據(jù)在索引字段比較分散才有效果,如果基于一些字典式字段(如性別、課程等)建索引,起不到很好的效果不說(shuō),還浪費(fèi)存儲(chǔ)空間。這種字典式的字段如果一定要發(fā)揮類似索引的效果,可以按字典值建分區(qū)鍵。

禁忌5:慎用主鍵約束

某個(gè)表的主鍵理論上看起來(lái)是個(gè)很好的機(jī)制,但在一般性應(yīng)用中,由于主鍵不能更新,因此在運(yùn)維時(shí)會(huì)帶來(lái)很多不便,一般建議慎用,而是可以用非空和唯一性約束方式來(lái)替代。

禁忌6:慎用外鍵關(guān)聯(lián)

外鍵關(guān)聯(lián)可以確保某個(gè)表的主鍵被其他表作為非主鍵使用時(shí)來(lái)保障兩個(gè)表數(shù)據(jù)的一致性,但外鍵關(guān)聯(lián)給程序開(kāi)發(fā)、運(yùn)維都帶來(lái)了更多的復(fù)雜性,而好的開(kāi)發(fā)習(xí)慣能確保兩個(gè)有外鍵關(guān)聯(lián)的表滿足數(shù)據(jù)一致性的要求,因此一般情況下慎用外鍵關(guān)聯(lián)。這其實(shí)是根據(jù)在方便性、數(shù)據(jù)一致性之間應(yīng)用更傾向于哪方面來(lái)決策使用方式。

禁忌7:組合索引使用要注意

  1. 使用多個(gè)字段的混合索引是常見(jiàn)的,但索引使用的字段越多,就意味著開(kāi)發(fā)時(shí)需要關(guān)注的字段越多,開(kāi)發(fā)時(shí)部分人員容易忘記索引字段,導(dǎo)致容易寫(xiě)出用不到索引的語(yǔ)句。因此一般建議復(fù)合索引使用字段不超過(guò)5個(gè);
  2. 組合索引中字段的順序是非常重要的,越是唯一的字段越是要靠前;
  3. 程序代碼使用組合索引時(shí),在使用索引字段作為條件時(shí),如果該索引是復(fù)合索引,那么必須使用到該索引中的第一個(gè)字段作為條件時(shí)才能保證系統(tǒng)使用該索引,并且應(yīng)盡可能的讓字段順序與索引順序相一致。

禁忌8:慎重考慮表字段調(diào)整

當(dāng)一個(gè)初始設(shè)計(jì)的表在運(yùn)行一段時(shí)間后,隨著業(yè)務(wù)的發(fā)展和系統(tǒng)的持續(xù)運(yùn)營(yíng),對(duì)表結(jié)構(gòu)進(jìn)行調(diào)整是遲早的事,但調(diào)整表結(jié)構(gòu)如增加新字段、字段長(zhǎng)度調(diào)整等都需要慎重,特別是針對(duì)數(shù)據(jù)量大訪問(wèn)頻繁的表更要謹(jǐn)慎。

在評(píng)估表結(jié)構(gòu)調(diào)整時(shí),一般需要考慮:

  1. 是否需要停系統(tǒng)調(diào)整,對(duì)于高并發(fā)訪問(wèn)頻繁的表至少要等到業(yè)務(wù)閑時(shí)進(jìn)行調(diào)整;
  2. 如果是調(diào)整字段大小需要評(píng)估是否有代碼限制了字段大?。?/li>
  3. 如果是新增字段需要評(píng)估是否有代碼采用了select *方式訪問(wèn);
  4. 是否需要初始化歷史數(shù)據(jù)?如果有是否會(huì)造成行遷移?是否需要重建表?
  5. 是否會(huì)影響外圍接口或系統(tǒng)數(shù)據(jù)的交互?

為了應(yīng)對(duì)字段增加可能帶來(lái)的風(fēng)險(xiǎn),有2個(gè)方法來(lái)提取預(yù)防:

  1. 給一些大表預(yù)留一定的字段,這樣可以避免停系統(tǒng)、減少行數(shù)據(jù)遷移、并避免系統(tǒng)運(yùn)行時(shí)進(jìn)行表結(jié)構(gòu)調(diào)整的風(fēng)險(xiǎn),但要規(guī)劃好預(yù)留字段的數(shù)量、并做好啟用管理;
  2. 盡量不動(dòng)大表本身,而是設(shè)計(jì)擴(kuò)展表來(lái)解決。

禁忌9:忌直接使用用戶名和密碼連接數(shù)據(jù)

在信息安全非常重視的今天,數(shù)據(jù)庫(kù)的安全性是重中之重,應(yīng)用系統(tǒng)不應(yīng)該在程序代碼或配置文件中直接使用用戶名和密碼方式連接訪問(wèn)業(yè)務(wù)數(shù)據(jù)。如果這樣,對(duì)開(kāi)發(fā)人員和維護(hù)人員密碼就和沒(méi)有密碼一樣,另外如果出現(xiàn)數(shù)據(jù)庫(kù)必須修改密碼時(shí),需要到處改密碼相關(guān)的代碼或配置文件。

比較好的解決辦法是用最小權(quán)限的用戶登錄,登錄后通過(guò)專用加密配置表獲取用戶真正使用的用戶和密碼,這就是二次登錄。

禁忌10:慎用數(shù)據(jù)庫(kù)連接

在一個(gè)大型系統(tǒng)內(nèi),數(shù)據(jù)庫(kù)連接是寶貴的資源,ORACLE的連接數(shù)單實(shí)例一般限制在4096個(gè),看起來(lái)不少,但如果連接節(jié)點(diǎn)多真正使用起來(lái)后會(huì)發(fā)現(xiàn)連接數(shù)往往不夠用。為此需要對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)進(jìn)行連接收斂管控,實(shí)現(xiàn)連接的復(fù)用。
要實(shí)現(xiàn)連接的收斂,有如下做法:

  1. WEB服務(wù)器通過(guò)連接池管理收斂客戶端的數(shù)據(jù)訪問(wèn);
  2. 后臺(tái)進(jìn)程或中間間通過(guò)數(shù)據(jù)訪問(wèn)代理層來(lái)進(jìn)行連接的復(fù)用和收斂;
  3. 后臺(tái)維護(hù)限制單機(jī)登錄會(huì)話數(shù)。

禁忌11:忌用并行

在程序代碼或表的參數(shù)設(shè)置里,都可以設(shè)置并行參數(shù),并行對(duì)于單表或單語(yǔ)句能起到迅速提高執(zhí)行效率的作用,但這種并行是以搶占其他任務(wù)的資源為代價(jià),因此在OLTP數(shù)據(jù)庫(kù)應(yīng)用中,最好別使用并行的DML語(yǔ)句或?qū)⒈淼牟⑿袇?shù)打開(kāi)。臨時(shí)執(zhí)行任務(wù)考慮到執(zhí)行速度需要使用并行時(shí),一定要與DBA協(xié)商是否可以開(kāi)啟并行,并在任務(wù)執(zhí)行結(jié)束后關(guān)閉
表的并行參數(shù)。

前幾年,有個(gè)工程割接時(shí)為了提升割接速度,當(dāng)晚一個(gè)參與割接的工程師未和任何人商議就將一個(gè)重要的訪問(wèn)頻繁的大表的并行參數(shù)設(shè)置調(diào)整多倍,割接后也未關(guān)閉,導(dǎo)致第二天業(yè)務(wù)起來(lái)后數(shù)據(jù)庫(kù)出現(xiàn)了鎖、主機(jī)CPU全忙,影響業(yè)務(wù)超過(guò)4個(gè)小時(shí)。經(jīng)過(guò)較長(zhǎng)時(shí)間定位才發(fā)現(xiàn)是該表并行被打開(kāi)導(dǎo)致的,問(wèn)題最終解決但造成了不良影響。而那個(gè)導(dǎo)致問(wèn)題的工程師也在華為年底考核中得到了處罰離職走人。

禁忌12:忌SQL語(yǔ)句不使用綁定變量

在應(yīng)用開(kāi)發(fā)中,SQL語(yǔ)句大多數(shù)是動(dòng)態(tài)SQL,這種動(dòng)態(tài)SQL又分為兩種,一種是字段取值是變化的,一種是連數(shù)據(jù)對(duì)象名都是動(dòng)態(tài)的。

對(duì)于字段取值變化的情況,基本的訪問(wèn)SQL是固定的,針對(duì)變化的字段值就需要用綁定變量方式傳值,這時(shí)數(shù)據(jù)庫(kù)才不會(huì)重新編譯該SQL語(yǔ)句,可以提高執(zhí)行效率,如果不使用綁定變量,直接將該SQL語(yǔ)句用字符串方式拼接,其實(shí)就與數(shù)據(jù)對(duì)象也是不同變換的方式相同,這樣SQL語(yǔ)句每回都會(huì)被編譯,效率會(huì)大幅下降。

對(duì)于數(shù)據(jù)對(duì)象名都是動(dòng)態(tài)的SQL,不適合通過(guò)綁定變量方式傳遞數(shù)據(jù)對(duì)象名。

禁忌13:忌索引數(shù)量過(guò)多

一個(gè)表的索引是需要單獨(dú)占用存儲(chǔ)空間的,過(guò)多的索引會(huì)導(dǎo)致表數(shù)據(jù)發(fā)生變化時(shí)索引的調(diào)整占用過(guò)多的時(shí)間,會(huì)引發(fā)數(shù)據(jù)的增刪改性能下降。對(duì)于頻繁進(jìn)行插入、刪除、更新的數(shù)據(jù)表,應(yīng)控制索引的數(shù)量,提高效率,一般一個(gè)表的索引數(shù)控制在5個(gè)以內(nèi)。如果一個(gè)表要建5個(gè)以上索引,一般說(shuō)明表和應(yīng)用的設(shè)計(jì)是存在問(wèn)題的。

禁忌14:select for update 要帶nowait

select ... for update語(yǔ)句 對(duì)于保證事務(wù)的完整性很有必要,但在一個(gè)并發(fā)環(huán)境中,使用該語(yǔ)句的應(yīng)用很可能會(huì)導(dǎo)致數(shù)據(jù)庫(kù)鎖甚至死鎖,正確的做法是select ... for update nowait,并且在獲取鎖失敗時(shí)要有重新處理的機(jī)制。

禁忌15:批量任務(wù)要控制好事務(wù)提交的頻度

在后臺(tái)進(jìn)程或存儲(chǔ)過(guò)程處理大批量數(shù)據(jù)時(shí),事務(wù)提交禁止單條提交或者全部完成后再提交,提交太頻繁會(huì)產(chǎn)生過(guò)多的數(shù)據(jù)庫(kù)日志,一次性提交容易導(dǎo)致回滾段不夠等問(wèn)題。建議使用100、500或者1000條提交的頻度。

禁忌16:sequence使用注意

對(duì)于部分表的內(nèi)部關(guān)鍵ID字段如流水號(hào)等使用sequence是個(gè)非常不錯(cuò)的主意,可以有效保障并發(fā)環(huán)境下這種序列號(hào)分配的高效和唯一性。但在應(yīng)用中使用sequence時(shí)要注意幾點(diǎn):

  1. 長(zhǎng)度設(shè)置要充分考慮業(yè)務(wù)發(fā)展的速度,有效序列在初期增長(zhǎng)緩慢,但隨著業(yè)務(wù)發(fā)展會(huì)迅速增長(zhǎng),因此開(kāi)發(fā)設(shè)計(jì)時(shí)要進(jìn)行充分的評(píng)估,防止出現(xiàn)sequence很快被耗盡;
  2. 對(duì)于長(zhǎng)期增長(zhǎng)的序列號(hào),最后采用時(shí)間戳+序列號(hào)的方式來(lái)作為字段值,防止序列號(hào)翻轉(zhuǎn);
  3. 序列號(hào)分配時(shí),由于序列號(hào)在不同數(shù)據(jù)庫(kù)實(shí)例的緩沖機(jī)制,可能會(huì)出現(xiàn)后面的數(shù)據(jù)記錄序列號(hào)比前面插入記錄序列號(hào)還要小的情況,因此序列號(hào)字段的值只能作為唯一鍵值使用,而不能作為業(yè)務(wù)排序的依據(jù)。

禁忌17:慎用rowid更新數(shù)據(jù)

rowid是數(shù)據(jù)庫(kù)記錄的一個(gè)內(nèi)部記錄ID,使用rowid訪問(wèn)數(shù)據(jù)比普通索引還要高效,但如果在一個(gè)表的數(shù)據(jù)頻繁插入、刪除時(shí),不要使用rowid來(lái)進(jìn)行數(shù)據(jù)的操作,因?yàn)镺RACLE的rowid在數(shù)據(jù)有刪除機(jī)制時(shí),是有一定幾率出現(xiàn)重復(fù)的。

禁忌18:慎用子查詢

通過(guò)子查詢方式進(jìn)行數(shù)據(jù)的嵌套查詢SQL的可讀性比較好,但子查詢很容易導(dǎo)致全表掃描,且容易導(dǎo)致回滾段或臨時(shí)表空間使用過(guò)高,因此慎用子查詢,特別是子查詢的結(jié)果集也很大時(shí)忌用。

禁忌19:忌用SELECT *

在查詢SQL語(yǔ)句中,要盡量減少返回的結(jié)果行,包括行數(shù)和字段列數(shù)。返回的結(jié)果越大,意味著相應(yīng)的SQL語(yǔ)句的logical reads 就越大,對(duì)服務(wù)器的性能影響就越甚。

一個(gè)特別不好的設(shè)計(jì)就是使用SELECT * 返回表的所有數(shù)據(jù),除了影響服務(wù)器性能外,還可能會(huì)由于表結(jié)構(gòu)的調(diào)整在編譯階段無(wú)法發(fā)現(xiàn),導(dǎo)致運(yùn)行時(shí)錯(cuò)誤。

禁忌20:where 子句中慎用!=或>操作符

使用!=或>意味著對(duì)應(yīng)字段的訪問(wèn)不會(huì)使用索引,因此只有在其他字段使用了索引的基礎(chǔ)上才使用!=或>操作。

禁忌21:where 子句中慎用like

如果在where字句中使用字段A like ‘%xxx' 或字段A like ‘%xxx%'方式匹配結(jié)果記錄時(shí),該字段不會(huì)使用索引,因此只有在其他字段使用了索引的基礎(chǔ)上才使用字段A like ‘%xxx' 或字段A like ‘%xxx%'方式,即忌用前置百分號(hào)匹配。

禁忌22:where 子句中慎用in和not in

如果in后面的結(jié)果數(shù)據(jù)比較多,很可能會(huì)導(dǎo)致全表掃描。因此只能和其他能使用索引的條件組合使用時(shí)使用。

禁忌23:where字句中慎用字段函數(shù)操作

應(yīng)盡量避免在where子句中對(duì)字段進(jìn)行函數(shù)操作,這將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描。不要在 where 子句中的“=”左邊進(jìn)行函數(shù)、算術(shù)運(yùn)算或其他表達(dá)式運(yùn)算,否則系統(tǒng)將可能無(wú)法正確使用索引。

禁忌24:忌用select count(*)

使用select count(*)的效率不如使用select count(1)。

禁忌25:索引字段訪問(wèn)慎用OR

索引字段用OR的字句容易導(dǎo)致全表掃描,一定要判斷多個(gè)值可以分解成多個(gè)查詢,并且通過(guò)UNION 連接多個(gè)查詢。

禁忌26:慎重考慮字符集

在一個(gè)應(yīng)用系統(tǒng)中,涉及應(yīng)用服務(wù)器主機(jī)字符集、數(shù)據(jù)庫(kù)字符集以及客戶端字符集的兼容性問(wèn)題,要在系統(tǒng)構(gòu)架時(shí)統(tǒng)一考慮,確保從前臺(tái)到后臺(tái)到數(shù)據(jù)庫(kù)的字符集都是兼容的。

禁忌27、慎用視圖嵌套

視圖最好建在表上,盡量不要基于視圖嵌套建立視圖,一方面一般視圖嵌套不要超過(guò)2個(gè)為宜,視圖嵌套層級(jí)多訪問(wèn)效率會(huì)下降,并且可維護(hù)性變差。

禁忌28: 忌數(shù)據(jù)對(duì)象名過(guò)長(zhǎng)

oracle的表名、字段名等對(duì)象命名字節(jié)個(gè)數(shù)限制在了30個(gè)字節(jié),不能超過(guò)30。

禁忌29:謹(jǐn)慎表和索引的inittrans設(shè)置

每個(gè)塊都有一個(gè)塊首部。這個(gè)塊首部中有一個(gè)事務(wù)表。事務(wù)表中會(huì)建立一些條目來(lái)描述哪些事務(wù)將塊上的哪些行/元素鎖定。這個(gè)事務(wù)表的初始大小由對(duì)象的INITRANS 設(shè)置指定。對(duì)于表,這個(gè)值默認(rèn)為2(索引的INITRANS 也默認(rèn)為2)。事務(wù)表會(huì)根據(jù)需要?jiǎng)討B(tài)擴(kuò)展,最大達(dá)到MAXTRANS 個(gè)條目(假設(shè)塊上有足夠的自由空間)。所分配的每個(gè)事務(wù)條目需要占用塊首部中的23~24 字節(jié)的存儲(chǔ)空間。注意,對(duì)于Oracle 10g以上版本,MAXTRANS 則會(huì)忽略,所有段的MAXTRANS 都是255。

也就是說(shuō),如果某個(gè)事物鎖定了這個(gè)塊的數(shù)據(jù),則會(huì)在這個(gè)地方記錄事務(wù)的標(biāo)識(shí),當(dāng)然那個(gè)事務(wù)要先看一下這個(gè)地方是不是已經(jīng)有人占用了,如果有,則去看看那個(gè)事務(wù)是否為活動(dòng)狀態(tài)。如果不活動(dòng),比如已經(jīng)提交或者回滾,則可以覆蓋這個(gè)地方。如果活動(dòng),則需要等待(閂的作用)。

所以,如果有大量的并發(fā)訪問(wèn)使用的這個(gè)塊,則參數(shù)不能太小,否則資源競(jìng)爭(zhēng)將導(dǎo)致系統(tǒng)并發(fā)性能下降。

在創(chuàng)建表和索引時(shí),需要根據(jù)表數(shù)據(jù)的訪問(wèn)頻度和數(shù)據(jù)量來(lái)評(píng)估設(shè)置的inittrans值,雖然不夠時(shí)Oracle會(huì)自動(dòng)增加,但增加的過(guò)程需要ORACLE進(jìn)行評(píng)估,且該評(píng)估機(jī)制是針對(duì)所有對(duì)象的,需要排隊(duì),如果inittrans值設(shè)置過(guò)小,就會(huì)影響系統(tǒng)的并發(fā)性能。因此系統(tǒng)設(shè)計(jì)和部署時(shí)需要考慮不同表的inittrans的設(shè)置。

禁忌30:數(shù)據(jù)模型和數(shù)據(jù)對(duì)象的設(shè)計(jì)必須商DBA確認(rèn)

一個(gè)業(yè)務(wù)系統(tǒng),會(huì)有大量的數(shù)據(jù)模型,會(huì)創(chuàng)建大量數(shù)據(jù)對(duì)象,在考慮業(yè)務(wù)需求的同時(shí)必須考慮系統(tǒng)運(yùn)維,因此請(qǐng)DBA參與設(shè)計(jì)是非常必要的。
在做設(shè)計(jì)時(shí),要考慮:

  1. 制定數(shù)據(jù)庫(kù)對(duì)象命名規(guī)范;
  2. 數(shù)據(jù)庫(kù)表空間的使用規(guī)劃(包括業(yè)務(wù)數(shù)據(jù)表和索引、字典表、臨時(shí)表空間、回滾段等);
  3. 表和索引的inittrans大??;
  4. 各個(gè)表的PCTFREE 和 PCTUSED設(shè)置;
  5. 數(shù)據(jù)維護(hù)周期

小結(jié):

本文詳細(xì)介紹了筆者在二十余年ORACLE應(yīng)用開(kāi)發(fā)中遇到的三十條開(kāi)發(fā)注意事項(xiàng)(本來(lái)想寫(xiě)成三十六忌的,奈何沒(méi)湊夠),這些注意事項(xiàng)是實(shí)際工作中的經(jīng)驗(yàn)和教訓(xùn)總結(jié),好些注意事項(xiàng)是筆者的團(tuán)隊(duì)以及華為等合作廠商一些工作兩三年的人都容易犯的錯(cuò),筆者前2年遭遇的一次事件還導(dǎo)致了一個(gè)華為工程師的考核離職。

這些注意事項(xiàng)不但可以在和ORACLE有關(guān)的應(yīng)用開(kāi)發(fā)中遇到,大部分也可以在其他關(guān)系型數(shù)據(jù)庫(kù)有關(guān)的應(yīng)用開(kāi)發(fā)中遇到,甚至部分問(wèn)題可以在非關(guān)系型數(shù)據(jù)有關(guān)的應(yīng)用開(kāi)發(fā)中遇到。

以上就是ORACLE數(shù)據(jù)庫(kù)應(yīng)用開(kāi)發(fā)的三十個(gè)注意事項(xiàng)的詳細(xì)內(nèi)容,更多關(guān)于ORACLE數(shù)據(jù)庫(kù)應(yīng)用開(kāi)發(fā)的注意事項(xiàng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • zabbix agent2 監(jiān)控oracle數(shù)據(jù)庫(kù)的方法
  • Python查詢oracle數(shù)據(jù)庫(kù)速度慢的解決方案
  • ORACLE數(shù)據(jù)庫(kù)對(duì)long類型字段進(jìn)行模糊匹配的解決思路
  • 配置python連接oracle讀取excel數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù)的操作流程
  • SpringBoot多數(shù)據(jù)庫(kù)連接(mysql+oracle)的實(shí)現(xiàn)
  • 使用zabbix監(jiān)控oracle數(shù)據(jù)庫(kù)的方法詳解
  • Oracle數(shù)據(jù)庫(kù)下載與安裝的完整步驟
  • QT連接Oracle數(shù)據(jù)庫(kù)并實(shí)現(xiàn)登錄驗(yàn)證的操作步驟
  • oracle取數(shù)據(jù)庫(kù)中最新的一條數(shù)據(jù)可能會(huì)遇到的bug(兩種情況)
  • 使用IDEA對(duì)Oracle數(shù)據(jù)庫(kù)進(jìn)行簡(jiǎn)單增刪改查操作
  • Oracle數(shù)據(jù)庫(kù)scott用戶創(chuàng)建view視圖權(quán)限的操作方法

標(biāo)簽:仙桃 黃山 湘潭 湖南 衡水 崇左 銅川 蘭州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《ORACLE數(shù)據(jù)庫(kù)應(yīng)用開(kāi)發(fā)的三十個(gè)注意事項(xiàng)》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266