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

首頁 > 開發 > 綜合 > 正文

可以提高數據庫查詢性能的反規范設計

2024-07-21 02:42:46
字體:
來源:轉載
供稿:網友
數據的反規范

◆反規范的好處

是否規范化的程度越高越好?這要根據需要來決定,因為“分離”越深,產生的關系越多,關系過多,連接操作越頻繁,而連接操作是最費時間的,特別對以查詢為主的數據庫應用來說,頻繁的連接會影響查詢速度。所以,關系有時故意保留成非規范化的,或者規范化以后又反規范了,這樣做通常是為了改進性能。例如賬戶系統中的“賬戶”表B-TB01,它的列busi-balance(企業賬戶的總余額)就違反規范,其中的值可以通過下面的查詢獲得:

 

select busi-code,sum(acc-balance)   from B-TB06    group by busi-code

如果B-TB01中沒有該列,若想獲得busi-name(企業名稱)和企業賬戶的總余額,則需要做連接操作:

select busi-name,sum(acc-balance)    from B-TB01,B-TB06    where B-TB01.busi-code=B-TB06.busi-code    group by busi-code

  

如果經常做這種查詢,則就有必要在B-TB01中加入列busi-balance,相應的代價則是必須在表B-TB06上創建增、刪、改的觸發器來維護B-TB01表上busi-balance列的值。類似的情況在決策支持系統中經常發生。  

反規范的好處是降低連接操作的需求、降低外碼和索引的數目,還可能減少表的數目,相應帶來的問題是可能出現數據的完整性問題。加快查詢速度,但會降低修改速度。因此決定做反規范時,一定要權衡利弊,仔細分析應用的數據存取需求和實際的性能特點,好的索引和其它方法經常能夠解決性能問題,而不必采用反規范這種方法。  

◆常用的反規范技術

在進行反規范操作之前,要充分考慮數據的存取需求、常用表的大小、一些特殊的計算(例如合計)、數據的物理存儲位置等。常用的反規范技術有增加冗余列、增加派生列、重新組表和分割表。

◆增加冗余列

增加冗余列是指在多個表中具有相同的列,它常用來在查詢時避免連接操作。例如前面例子中,如果經常檢索一門課的任課教師姓名,則需要做class和teacher表的連接查詢:

select class-name,teacher-name    from class,teacher    where class.teacher-no=teacher.teacher-no

  

這樣的話就可以在class表中增加一列teacher-name就不需要連接操作了。

增加冗余列可以在查詢時避免連接操作,但它需要更多的磁盤空間,同時增加表維護的工作量。

◆增加派生列

增加派生列指增加的列來自其它表中的數據,由它們計算生成。它的作用是在查詢時減少連接操作,避免使用集函數。例如前面所講的賬戶系統中的表B-TB01的列busi-balance就是派生列。派生列也具有與冗余列同樣的缺點。

◆重新組表

重新組表指如果許多用戶需要查看兩個表連接出來的結果數據,則把這兩個表重新組成一個表來減少連接而提高性能。例如,用戶經常需要同時查看課程號,課程名稱,任課教師號,任課教師姓名,則可把表class(class-no,class-name,teacher-no)和表teacher(teacher-no,teacher-name)合并成一個表class(class-no,class-name,teacher-no,teacher-name)。這樣可提高性能,但需要更多的磁盤空間,同時也損失了數據在概念上的獨立性。  

◆分割表

有時對表做分割可以提高性能。表分割有兩種方式: 

1水平分割:根據一列或多列數據的值把數據行放到兩個獨立的表中。

水平分割通常在下面的情況下使用:A 表很大,分割后可以降低在查詢時需要讀的數據和索引的頁數,同時也降低了索引的層數,提高查詢速度。B 表中的數據本來就有獨立性,例如表中分別記錄各個地區的數據或不同時期的數據,特別是有些數據常用,而另外一些數據不常用。C需要把數據存放到多個介質上。

例如法規表law就可以分成兩個表active-law和inactive-law。activea-authors表中的內容是正生效的法規,是經常使用的,而inactive-law表則使已經作廢的法規,不常被查詢。水平分割會給應用增加復雜度,它通常在查詢時需要多個表名,查詢所有數據需要union操作。在許多數據庫應用中,這種復雜性會超過它帶來的優點,因為只要索引關鍵字不大,則在索引用于查詢時,表中增加兩到三倍數據量,查詢時也就增加讀一個索引層的磁盤次數。

2垂直分割:把主碼和一些列放到一個表,然后把主碼和另外的列放到另一個表中。如果一個表中某些列常用,而另外一些列不常用,則可以采用垂直分割,另外垂直分割可以使得數據行變小,一個數據頁就能存放更多的數據,在查詢時就會減少I/O次數。其缺點是需要管理冗余列,查詢所有數據需要join操作。  

反規范技術需要維護數據的完整性

無論使用何種反規范技術,都需要一定的管理來維護數據的完整性,常用的方法是批處理維護、應用邏輯和觸發器。批處理維護是指對復制列或派生列的修改積累一定的時間后,運行一批處理作業或存儲過程對復制或派生列進行修改,這只能在對實時性要求不高的情況下使用。數據的完整性也可由應用邏輯來實現,這就要求必須在同一事務中對所有涉及的表進行增、刪、改操作。用應用邏輯來實現數據的完整性風險較大,因為同一邏輯必須在所有的應用中使用和維護,容易遺漏,特別是在需求變化時,不易于維護。另一種方式就是使用觸發器,對數據的任何修改立即觸發對復制列或派生列的相應修改。觸發器是實時的,而且相應的處理邏輯只在一個地方出現,易于維護。一般來說,是解決這類問題的最好的辦法。  

結束語

數據庫的反規范設計可以提高查詢性能。常用的反規范技術有增加冗余列、增加派生列、重新組表和分割表。但反規范技術需要維護數據的完整性。因此在做反規范時,一定要權衡利弊,仔細分析應用的數據存取需求和實際的性能特點。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平和县| 伊川县| 永州市| 永清县| 建水县| 宁国市| 达日县| 新建县| 三台县| 弥勒县| 夏津县| 夏邑县| 宝丰县| 茂名市| 江陵县| 河曲县| 太保市| 龙陵县| 年辖:市辖区| 肇州县| 河间市| 石棉县| 孝义市| 云霄县| 河源市| 若羌县| 临安市| 榕江县| 乐山市| 苍溪县| 布拖县| 色达县| 沂源县| 平舆县| 滕州市| 两当县| 红桥区| 沾化县| 永川市| 宁明县| 靖边县|