日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

oracle clob截取_Oracle数据库设计规范建议

發布時間:2024/7/19 数据库 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle clob截取_Oracle数据库设计规范建议 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Oracle-數據庫設計規范建議

來源于項目資料

目的

本規范的主要目的是希望規范數據庫設計,盡量提前避免由于數據庫設計不當而產生的麻煩;同時好的規范,在執行的時候可以培養出好的習慣,好的習慣是軟件質量的很好的保證。數據庫設計是指對于一個給定的應用環境,構造最優的數據庫模式,建立數據庫及其應用系統,有效存儲數據,滿足用戶信息要求和處理要求。

數據對象的命名規范

通用規范

使用英文:要用簡單明了的英文單詞,不要用拼音,特別是拼音縮寫。主要目的很明確,讓人容易明白這個對象是做什么用的; 一律大寫,特別是表名:有些數據庫,表的命名乃至其他數據對象的命名是大小寫敏感的,為了避免不必要的麻煩,并且尊重通常的習慣,最好一律用大寫;

數據庫對象命名規范

表的命名

表名的前綴:前綴表名T。為表的名稱增加一個或者多個前綴,前綴名不要太長,可以用縮寫,最好用下劃線與后面的單詞分開;其目的有這樣幾個:

  • 為了不與其他項目或者其他系統、子系統的表重名;

  • 表示某種從屬關系,比如表明是屬于某個子系統、某個模塊或者某個項目等等。表示這種從屬關系的一個主要目的是,從表名能夠大概知道如何去找相關的人員。比如以子系統為前綴的,當看到這個表的時候,就知道有問題可以去找該子系統的開發和使用人員;

  • 視圖命名:相關表名_V(或者根據需要另取名字);

    程序包命名:程序包名_PKG(用英文表達程序包意義);

    存儲過程命名:存儲過程名_PRO(用英文表達存儲過程意義);

    函數命名:函數名稱_FUN(用英文表達函數作用);

    觸發器命名:觸發器名稱_TRI(用英文表達觸發器作用);

    索引命名:表名字段名IDX(如果存在多字段索引,取每字段前三個字符加下劃線組合,如在 custom, cutting, curtail 上建立聯合索引,命名為 表名cus_cut_cur_IDX,如果前三個截取字符相同,就從字段名稱中不同的字符開始取三個字符加下劃線組合,如在 custid, custom,custname上建立聯合索引,就命名為表tid_tom_tna_IDX;

    唯一索引命名:表名字段名UNI(如果存在多字段唯一索引,取每字段前三個字符加下劃線組合,如在 custom, cutting, curtail上建立唯一索引,命名為 表名_ cus_cut_cur_UNI,如果前三個截取字符相同,就從字段名稱中不同的字符開始取三個字符加下劃線組合,如:在 custid, custom,custname上建立唯一索引,命名:表_tid_tom_tna_UNI;

    主鍵命名:表名字段名PK(如果存在多字段主鍵,取每字段前三個字符加下劃線組合,如在 custom, cutting, curtail上建立主鍵,命名為 表名cus_cut_cur_PK,如果前三個截取字符相同,就從字段名稱中不同的字符開始取三個字符加下劃線組合,如在 custid, custom,custname上建立主鍵,命名:表tid_tom_tna_PK;

    外鍵命名:表名主表名字段名_FK;

    Sequence 命名:表名列名SEQ(或者根據需要另取名字);

    Synonym 命名:與對應的數據庫對象同名;

    JAVA 命名:遵守公司相應的JAVA命名規范;

    數據庫對象設計原則

    表的設計

    主、外鍵

  • 每個表,都必須要有主鍵。主鍵是每行數據的唯一標識,保證主鍵不可隨意更新修改,在不知道是否需要主鍵的時候,請加上主鍵,它會為你的程序以及將來查找數據中的錯誤等等,提供一定的幫助;

  • 一個表的某列與另一表有關聯關系的時候,如果加得上的話,請加上外鍵約束。外鍵是很重要的,所以要特別強調:

  • 適量建外鍵。為了保證外鍵的一致性,數據庫會增加一些開銷,如果有確鑿的并且是對性能影響到無法滿足用戶需求的證據,可以考慮不建外鍵。否則,還是應該建外鍵;

  • 不要以數據操作不方便為理由而不建外鍵。是的,加上外鍵以后,一些數據操作變得有些麻煩,但是這正是對數據一致性的保護。正是因為這種保護很有效,所以最好不要拒絕它;

  • 以缺省的方式建立外鍵(即用delete restrict方式),以達到保護數據一致性的目的;外鍵在保護數據一致方面非常有效。如果不建外鍵,數據庫中容易出現垃圾數據,并且無人知曉。當數據量很大的時候,查找這些垃圾數據也是相當困難的。而應用程序在設計時,往往沒有考慮或者也無法照顧到垃圾數據。因此垃圾數據很可能造成應用程序工作不正常,并且表現出來的現象會很奇怪,讓人摸不著頭腦。

  • 列的設計

  • 字段的寬度要在一定時間內足夠用,但也不要過寬,占用過多的存儲空間,對于長度不確定的列,采用可變長度的數據類型如 varchar類型;

  • 字段的類型及寬度在設計以及后面進行開發時,往往要與應用的設計、開發人員商討,以得到雙方認可的類型及寬度;

  • 除非必要,否則盡量不加冗余列。所謂冗余列,是指能通過其他列計算出來的列,或者是與某列表達同一含義的列,或者是從其他表復制過來的列等等。冗余列需要應用程序來維護一致性,相關列的值改變的時候,冗余列也需要隨之修改,而這一規則未必所有人都知道,就有可能因此發生不一致的情況。如果是應用的特殊需要,或者是為了優化某些邏輯很復雜的查詢等操作,可以加冗余列;

  • 除非必要,否則盡量不使用LONG, TEXT, BLOB, CLOB, NCLOB, LONG, LONG RAW這一類的數據類型,而是使用其他可以替代的數據類型;優先使用varchar2類型替代CHAR類型,除非列寬有嚴格的要求而且得到應用嚴格支持;

  • 記錄數

  • 單表的記錄數一般控制在兩千萬條 (參考值,各應用可以根據實際情況進行適量調整) 以內;

  • 記錄數在兩千萬和兩億條之間的表一定要采用分區技術,并根據應用的使用情況創建合適的分區標準,單個分區內的記錄數一般控制在兩千萬條(參考值,各應用可以根據實際情況進行適量調整)以內,同時表的索引使用對應的分區索引;

  • 記錄數超過兩億條的表一定要考慮信息生命周期,必須考慮歷史數據的剝離,并在應用設計中完成對歷史數據的相應處理功能(歷史數據的剝離規則須經業務使用部門的確認);

  • 索引的設計

    索引是從數據庫中獲取數據的最高效方式之一。95%的數據庫性能問題都可以采用索引技術得到解決。但大量的DML操作會增加系統對索引的維護成本,對性能會有一定影響,對于插入相當頻繁的表要慎重建索引,索引也會占相當的存儲空間,所以要根據硬件環境和應用需求在空間和時間上達到最好的平衡點,主要原則:

  • 適當利用索引提高查詢速度:當數據量比較大,了解應用程序的會有哪些查詢,依據這些查詢需求建相應的索引;最好親自試驗一下,模擬一下生產環境的數據量,在此數據量下,比較一下建索引前后的查詢速度;索引對性能會有一定影響,對于DML頻繁列的索引要定期維護(重建)。但是,索引的結構對于索引的更新(比如在插入數據的時候)是有一定優化的,所以不要在沒有試驗以前過分夸大它對性能的影響。最終還是以試驗為準;

  • 不要建實際用不上的索引,與上條相關,如果建的索引并不提高任何一應用中的查詢速度,則要把它刪除;有些數據庫有相關工具可以發現實際未被使用的索引,可以利用一下;

  • 索引類型的選擇:要根據數據分布及應用來決定如何建立索引,一般的高基數數據列(高基數數據列是指該列有很多不同的值)時 ,建立BTree索引(一般數據庫索引的缺省類型);當低基數數據列(該列有大量相同的值)時,可以考慮建立位圖索引(如果所選數據庫支持的話),但位圖索引是壓縮類型索引,所以DML(增、刪、改)的代價更高,要綜合考慮;

  • 索引列的選擇:如果檢索條件有可能包含多列,創建聯合主鍵或者聯合索引,把最常用于檢索條件的列放在最前端,其他的列排在后面;不要索引使用頻繁的小型表,假如這些小表有頻繁的DML就更不要建立索引,維護索引的代價遠遠高于掃描表的代價;

  • 主鍵索引在建立的時候一定要明確的指定名稱,不能讓系統默認建立主鍵索引(可能有些數據庫無法指定主鍵名,則例外);

  • 外鍵必須需建索引。當有一定數據量,并且經常以外鍵所在列為關聯,進行關聯查詢時,需要建索引(可能有些數據庫自動為外鍵建索引,則例外);

  • 當有聯合主鍵或者聯合索引時,注意不要建重復的索引。舉例說明:

    • 更復雜的情況,比如表EMPLOYEES,有一個索引建立在列CORPID, DEPARTID, EMPLOYEEID三列上,在創建語句中也依據上述順序,就沒有必要再為CORPID建立索引;也沒有必要再建立以CORPID在前,DEPARTID在后的聯合索引;如果EMPLOYEEID需要索引,那么為EMPLOYEEID建立一個索引是不與上面的索引重復的;DEPARTID列也類似;

    • 表EMPLOYEES,它的主鍵是建立在列DEPARTID和EMPLOYEEID上的聯合主鍵,并且創建主鍵的語句中DEPARTID在前,EMPLOYEEID在后。在這樣一 個表里,通常就沒有必要再為DEPARTID建一個索引了;聯合索引的情況也一樣;

    控制一個表的索引數量,盡量使得一個表的索引數量小于五個;

    視圖的設計

  • 在不太清楚視圖用法的情況下,盡量不建。因為一旦建了,就有被濫用的危險;

  • 如果需要建視圖,只要是打算長期使用的,請寫入數據庫設計中。明確它的用途、目的;

  • 建立視圖時要明確寫出所有要選擇出的列名而不要以SELECT *來代替,可以使結構清晰可讀性增強,也不會增加它對表的所有字段的依賴,而表是很可能修改的,特別是增加字段。就很有可能導致使用該視圖的應用程序出錯;

  • 存儲過程、函數、觸發器的設計

  • 觸發器的功能通常可以用其他方式實現。在調試程序時觸發器可能成為干擾。假如你確實需要采用觸發器,一定要經過測試再應用在生產系統中,而且必須集中對它文檔化。

  • 請把程序包、存儲過程、函數、觸發器,與應用程序一同加入CVS中,進行版本控制。因為此四者包含了代碼,應用程序對他們的依賴程度比對表、視圖的依賴程度更高;

  • 適量但盡量少使用存儲過程、函數、觸發器。使用存儲過程、函數、觸發器的影響:

    (1) 可以減少數據庫與客戶端的交互,提高性能;(2) 有的數據庫還對他們進行了某種程度的編譯,在執行的時候,不用再對其中的SQL等語句進行解析,從而提高速度;(3) 如果有多個應用,使用了不同的開發語言,當有某些關鍵的或者復雜邏輯希望共享,則可以考慮使用存儲過程或者函數。因為存儲過程等在數據庫一級是共享的;(4) 增強了應用對數據庫的依賴,如果打算將來移植數據庫的話,使用得越多,則移植的困難越大;數據庫中的業務邏輯越多(存儲過程等),應用以及存儲過程等的維護難度也會增大;(5) 通常存儲過程等沒有面向對象的特性,不容易設計出易于擴展的結構。當存儲過程比較復雜時,或者它們相互間的調用關系比較復雜時,可能難于維護;

  • SQL的設計和使用

    Sql 書寫規范
  • 盡量不要寫復雜的SQL:過于復雜的SQL可以用存儲過程或函數來代替,效率更高;甚至如果能保證不造成瓶頸的話,把條SQL拆成多條也是可以的。這與一般的編碼規范很相似的,首先是要易懂。易懂也就意味著容易維護,對較為復雜的sql語句加上注釋,說明算法、功能注釋風格:注釋單獨成行、放在語句前面。

  • 應對不易理解的分支條件表達式加注釋;

  • 對重要的計算應說明其功能;

  • 過長的函數實現,應將其語句按實現的功能分段加以概括性說明;

  • 每條復雜SQL語句均應有注釋說明(表名、字段名 主要是說明此句SQL執行 的作用及所取得結果集的意義);

  • 常量及變量注釋時,應注釋被保存值的含義(必須),合法取值的范圍(可選__) ;

  • 可采用單行/多行注釋。(-- 或 /* */ 方式,不同數據庫可能語法不同);

  • 連接符or、in、and、以及=、<=、>=等前后加上一個空格;

  • 不要用SELECT *:SELECT語句中寫出必要的要選擇的全部列名,增強語句可讀性,避免不必要的選擇;SELECT * 增加了對所有字段的依賴,當表增加了字段后,有可能發生錯誤;此外還可能增加了數據的流量,查詢了一些實際不需要的字段;

  • 避免長事務(Transaction):長事務容易造成死鎖,應該避免,單個事務使用的數據庫和系統資源不宜超過總資源1-2%(參考值,各應用可以根據實際情況進行適量調整,這種情況不適用于數據倉庫);

  • 行最長不能超過80字符,同一語句不同字句之間逗號以后空格,其他分割符前空格 where子句書寫時,每個條件占一行,語句令起一行時,以保留字或者連接符開始,連接符右對齊;

  • 多表連接時,使用表的別名來引用列;

  • SQL中對視圖的引用:在不太清楚視圖用法的情況下,盡量不用。只是因為視圖中有自己想要的字段就拿來用,是相當普遍和錯誤的用法。原因如下:

    • 增加了應用程序對視圖的依賴,不必要的依賴是越少越好的。當有應用程序依賴了某個視圖,不久可能其他人因為某種原因會修改此視圖,原來的應用有可能會受到不同程度的影響;

    • 增加了不必要的數據流量,對你的實際需求,那很可能是一個非常復雜的視圖,有大量你不需要的字段,并且關聯了很多你實際不需要的表,對數據庫資源 會有過多的消耗;

    不要在SQL語句中使用基于rule規則的hint,因為在Oracle 10g及以后版本不再支持;

    SQL 性能優化建議
  • 系統可能選擇基于規則的優化器,所以將結果集返回數據量小的表作為驅動表,即將結果集返回數據量小的表放在FROM后邊最后一個表;

  • 大量的排序操作影響系統性能,所以盡量減少order by和group by排序操作;

  • 如必須使用排序操作,排序盡量建立在有索引的列上;

  • 索引的使用
  • 盡量避免對索引列進行計算。如對索引列計算較多,請提請數據庫管理員建立函數索引;

  • 盡量注意比較值與索引列數據類型的一致性(number與number比較、char與char比較),避免使用數據庫的類型自動轉換功能;如:SELECT * FROM categoryWHERE id = ‘123’; -- id’s type is number

  • 對于復合索引,SQL語句必須使用主索引列;

  • 索引字段中,盡量避免使用NULL值;

  • 對于索引的比較,盡量避免使用NOT=(!=)

  • 查詢列和排序列與索引列次序保持一致 ;

  • 盡量避免相同語句由于書寫格式的不同,而導致多次語法分析(減少數據庫的硬分析),如可使用TOAD的格式化工具對SQL語句進行格式化處理;

  • 查詢的WHERE過濾原則,應使過濾記錄數最多的條件放在最前面;

  • 在WHERE中,數據庫函數、計算表達式等等,要盡可能將放在等號右邊。否則會使所比較的字段上的索引失效;如:

    = TO_DATE(‘2001-9-01’,’yyyy-mm-dd’)AND gmt_modified< TO_DATE(‘2001-9-02’,’yyyy-mm-dd’);

  • SELECT * FROM service_promotionWHERE TO_CHAR(gmt_modified,’yyyy-mm-dd’)= ‘20001-09-01’; 而應使用:SELECT *FROM service_promotionWHERE gmt_modified

  • in、or子句常會使索引失效,盡可能不使用in、or;

  • 盡量避免在循環中使用SQL語句;

  • 在循環中盡量使用動態SQL語句提高執行性能;

  • 其他與性能有關的設計原則

    前面與提高數據庫訪問的性能相關的內容,這里就不再重復了,下面提出一些與數據庫性能極為相關,但上文又未涉及的條目:

    大數據量的開發環境

    開發過程中,開發人員往往使用一個非常簡單的、只有很少數據的數據庫環境,便于程序的調試。但是,最好還提供一個數據量與真實環境相當的環境,數據量和應用的設計目標差不多,供開發人員使用。這樣開發人員能立刻發現那些非常慢的數據庫操作,比如寫了一個非常不合理的SQL,因而能夠在此時就排除,而不必等到測試或者甚至上線時才發覺。因為很多開發人員,由于對數據庫的認識不夠,通常只以完成功能為首要目的,容易寫出效率非常低的SQL;

    限制使用

    這里說的限制使用是指如果能有其他的技術途徑,就不要使用如下的Oracle技術,包括:DBLink, Trigger,用Java編寫的存儲過程等內容;

    模擬測試

    這里說的測試主要是指模擬實際應用對數據庫的操作,進行測試,并發及訪問量要模擬應用的設計需求。主要目的是了解在系統上線后,數據庫的大概狀況,避免一上線就崩潰或者慢得不能忍受的情況。提前發現瓶頸,做相應的優化;

    應用測試

    每個應用的測試階段,特別是性能方面的測試,也要關注數據庫的表現。如果出現瓶頸,則根據具體情況,根據需要必須修改部分數據庫設計并修改相應程序;

    數據庫相關工具

    為需要寫SQL的開發人員提供方便的、圖形化的客戶端軟件,可以用來執行SQL,看到表結構、索引等等,如TOAD, PL/SQL Develop軟件。

    總結

    以上是生活随笔為你收集整理的oracle clob截取_Oracle数据库设计规范建议的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。