国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

Oracle 9i 數據庫設計指引全集(3)

2024-08-29 13:40:16
字體:
來源:轉載
供稿:網友

  2.4.2 表設計
  
  2.4.2.1 邏輯段設計原則
  
  2.4.2.1.1 Tablespace
  
  每個表在創建時候,必須指定所在的表空間,不要采用默認表空間以防止表建立在系統表空間上導致性能問題。對于事務比較繁忙的數據表,必須存放在該表的專用表空間中。
  
  2.4.2.1.2 Pctused
  
  默認pctused導致數據庫物理空間利用率非常低40%左右;對于update比較少或update不導致行增大的表,pctused可設置在60—85之間;對于update能夠導致行增大的表,update設置在40—70之間
  
  2.4.2.1.3 Initrans
  
  對于需要并行查詢或者在RAC數據庫中需要并行處理的表,initrans設置為2的倍數,否則,不設該值。
  
  2.4.2.1.4 Storage
  
  2.4.2.1.4.1 Initial
  
  盡量減少表數據段的extents數量,initial的大小盡量接近數據段的大小64K,128K,… ,1M,2M,4M,8M,16M ,…,等按2的倍數進行圓整。例如表或分區數據段大小為28M,則initial取32M。
  
  2.4.2.1.4.2 Next
  
  表或分區擴展extents的大小,按上述方法進行圓整。當表或分區數據段無法按Initial接近值進行圓整的情況下,其大小可以按 Initial+Next進行圓整。此時,必須設置Minextents=2。例如:表或分區數據段大小為150M,則Initial=128M;Next=32M,Minextents=2。
  
  2.4.2.1.4.3 Minextents
  
  該參數表示表創建時候Extents的初始數量,一般取1—2。
  
  2.4.2.1.4.4 Pctincrease
  
  表示每個擴展Extents的增長率,設置pctincrease=0能夠獲得較好的存儲性能。
  
  2.4.2.2 非凡表設計原則
  
  2.4.2.2.1 分區表
  
  對于數據量比較大的表,根據表數據的屬性進行分區,以得到較好的性能。假如表按某些字段進行增長,則采用按字段值范圍進行范圍分區;假如表按某個字段的幾個要害值進行分布,則采用列表分區;對于靜態表,則采用hash分區或列表分區;在范圍分區中,假如數據按某要害字段均衡分布,則采用子分區的復合分區方法。
  
  2.4.2.2.2 聚蔟表
  
  假如某幾個靜態表關系比較密切,則可以采用聚蔟表的方法。
  
  2.4.2.3 完整性設計原則
  
  2.4.2.3.1 主鍵約束
  
  關聯表的父表要求有主健,主健字段或組合字段必須滿足非空屬性和唯一性要求。對于數據量比較大的父表,要求指定索引段。
  
  2.4.2.3.2 外鍵關聯
  
  對于關聯兩個表的字段,一般應該分別建立主鍵、外鍵。實際是否建立外鍵,根據對數據完整性的要求決定。為了提高性能,對于數據量比較大的標要求對外健建立索引。對于有要求級聯刪除屬性的外鍵,必須指定on delete cascade 。
  
  2.4.2.3.3 NULL值
  
  對于字段能否null,應該在sql建表腳本中明確指明,不應使用缺省。由于NULL值在參加任何運算中,結果均為NULL。所以在應用程序中必須利用nvl()函數把可能為NULL值得字段或變量轉換為非NULL的默認值。例如:NVL(sale,0)。
  
  2.4.2.3.4 Check條件
  
  對于字段有檢查性約束,要求指定check規則。
  
  2.4.2.3.5 觸發器
  
  觸發器是一種非凡的存儲過程,通過數據表的DML操作而觸發執行,起作用是為確保數據的完整性和一致性不被破壞而創建,實現數據的完整約束。
  
  觸發器的before或after事務屬性的選擇時候,對表操作的事務屬性必須與應用程序事務屬性保持一致,以避免死鎖發生。在大型導入表中,盡量避免使用觸發器。
  
  2.4.2.4 注釋
  
  表、字段等應該有中文名稱注釋,以及需要說明的內容。
  
  2.4.3 索引設計
  
  對于查詢中需要作為查詢條件的字段,可以考慮建立索引。最終根據性能的需要決定是否建立索引。對于復合索引,索引字段順序比較要害,把查詢頻率比較高的字段排在索引組合的最前面。在分區表中,盡量采用local分區索引以方便分區維護。
  
  除非時分區local索引,否則在創建索引段時候必須指定指定索引段的tablespace、storage屬性,具體參考4.4.2.1內容。
  
  2.4.4 視圖設計
  
  視圖是虛擬的數據庫表,在使用時要遵循以下原則:
  
  從一個或多個庫表中查詢部分數據項;
  
  為簡化查詢,將復雜的檢索或字查詢通過視圖實現;
  
  提高數據的安全性,只將需要查看的數據信息顯示給權限有限的人員;
  
  視圖中假如嵌套使用視圖,級數不得超過3級;
  
  由于視圖中只能固定條件或沒有條件,所以對于數據量較大或隨時間的推移逐漸增多的庫表,不宜使用視圖;可以采用實體化視圖代替。
  
  除非凡需要,避免類似Select * from [TableName] 而沒有檢索條件的視圖;
  
  視圖中盡量避免出現數據排序的SQL語句。

  
  2.4.5 包設計
  
  存儲過程、函數、外部游標必須在指定的數據包對象PACKAGE中實現。存儲過程、函數的建立如同其它語言形式的編程過程,適合采用模塊化設計方法;當具體算法改變時,只需要修改需要存儲過程即可,不需要修改其它語言的源程序。當和數據庫頻繁交換數據是通過存儲過程可以提高運行速度,由于只有被授權的用戶才能執行存儲過程,所以存儲過程有利于提高系統的安全性。
  
  存儲過程、函數必須檢索數據庫表記錄或數據庫其他對象,甚至修改(執行Insert、Delete、Update、Drop、Create等操作)數據庫信息。假如某項功能不需要和數據庫打交道,則不得通過數據庫存儲過程或函數的方式實現。在函數中避免采用DML或DDL語句。
  
  在數據包采用存儲過程、函數重載的方法,簡化數據包設計,提高代碼效率。存儲過程、函數必須有相應的出錯處理功能。
  
  2.4.6 安全性設計
  
  4.4.6.1 治理默認用戶
  
  在生產環境中,必須嚴格治理sys和system用戶,必須修改其默認密碼,禁止用該用戶建立數據庫應用對象。刪除或鎖定數據庫測試用戶scott 。
  
  2.4.6.2 數據庫級用戶權限設計
  
  必須按照應用需求,設計不同的用戶訪問權限。包括應用系統治理用戶,普通用戶等,按照業務需求建立不同的應用角色。
  
  用戶訪問另外的用戶對象時,應該通過創建同義詞對象synonym進行訪問。
  
  2.4.6.3 角色與權限
  
  確定每個角色對數據庫表的操作權限,如創建、檢索、更新、刪除等。每個角色擁有剛好能夠完成任務的權限,不多也不少。在應用時再為用戶分配角色,則每個用戶的權限等于他所兼角色的權限之和。
  
  2.4.6.4 應用級用戶設計
  
  應用級的用戶帳號密碼不能與數據庫相同,防止用戶直接操作數據庫。用戶只能用帳號登陸到應用軟件,通過應用軟件訪問數據庫,而沒有其它途徑操作數據庫。
  
  2.4.6.5 用戶密碼治理
  
  用戶帳號的密碼必須進行加密處理,確保在任何地方的查詢都不會出現密碼的明文。
  
  2.5 SQL編寫
  2.5.1 字符類型數據
  
  SQL中的字符類型數據應該統一使用單引號。非凡對純數字的字串,必須用單引號,否則會導致內部轉換而引起性能問題或索引失效問題。利用trim(),lower()等函數格式化匹配條件。
  
  2.5.2 復雜sql
  
  對于非常復雜的sql(非凡是有多層嵌套,帶子句或相關查詢的),應該先考慮是否設計不當引起的。對于一些復雜SQL可以考慮使用程序實現。
  
  USER_TAB_COMMENTS 數據字典
  
  Comment on 可加注解
  
  2.5.3 高效性
  
  2.5.3.1 避免In子句
  
  使用In 或 not In子句時,非凡是當子句中有多個值時,且查詢數據表數據較多時,速度會明顯下降。可以采用連接查詢或外連接查詢來提高性能。
  
  Char 比 varchar 查詢時高詢
  
  在進行查詢及建立索引時,char比varchar的效率要高,當然varchar在存儲上比char要好
  
  2.5.3.2 避免嵌套的Select子句
  
  這個實際上是In子句的特例。
  
  2.5.3.3 避免使用Select * 語句
  
  假如不是必要取出所有數據,不要用*來代替,應給出字段列表,注:不含select count(*)。
  
  2.5.3.4 避免不必要的排序
  
  不必要的數據排序大大的降低系統性能。
  
  2.5.4 健壯性
  
  2.5.4.1 Insert語句
  
  使用Insert語句一定要給出要插入值的字段列表,這樣即使更改了表結構加了字段也不會影響現有系統的運行。
  
  2.5.4.2 Count(*)、Count(*)、count(distinct id)的區別
  
  Select count(*) from testtab
  
  得到表testtab的記錄數
  
  select count(id) from testtab
  
  得到表testtab id字段非空記錄數
  
  select count(distinct id) from testtab
  
  得到表testtab id字段值非相同記錄數
  
  2.5.4.3 Not null 為字段類型性質的約束
  
  本約束功能在后期無語法使期失效,可使用修改字段類型方式
  
  alter table modify 字段名 類型 not null
  
  alter table modify 字段名 類型

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 双柏县| 抚顺县| 七台河市| 馆陶县| 洮南市| 百色市| 平和县| 威宁| 云梦县| 平舆县| 日土县| 玉田县| 永康市| 上饶县| 安陆市| 宁远县| 嵊泗县| 中宁县| 宾阳县| 淄博市| 景洪市| 上犹县| 呼伦贝尔市| 湖州市| 乐都县| 娄底市| 玉林市| 隆昌县| 英吉沙县| 循化| 新竹市| 永清县| 含山县| 东辽县| 遂川县| 大荔县| 大同市| 无棣县| 富源县| 尚义县| 金乡县|