佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > Oracle數(shù)據(jù)表分區(qū)的策略

Oracle數(shù)據(jù)表分區(qū)的策略

熱門標(biāo)簽:AI電銷 服務(wù)外包 地方門戶網(wǎng)站 呼叫中心市場(chǎng)需求 Linux服務(wù)器 百度競(jìng)價(jià)排名 網(wǎng)站排名優(yōu)化 鐵路電話系統(tǒng)
正在看的ORACLE教程是:Oracle數(shù)據(jù)表分區(qū)的策略。本文描述通過(guò)統(tǒng)計(jì)分析出醫(yī)院信息系統(tǒng)需分區(qū)的表,對(duì)需分區(qū)的表選擇分區(qū)鍵,即找出包括在你的分區(qū)鍵中的列(表的屬性),對(duì)大型數(shù)據(jù)的管理比較有意義, 本文的工作在Oracle8.1.6下實(shí)現(xiàn)。

  Oracle雖然是一個(gè)大型的DBMS,但如果不對(duì)記錄比較多的表進(jìn)行處理,仍然發(fā)揮不了Oracle管理大型數(shù)據(jù)的強(qiáng)大功能,因此對(duì)某些表進(jìn)行分區(qū),具有如下優(yōu)點(diǎn):

  分區(qū)表中每個(gè)分區(qū)可以在邏輯上認(rèn)為是一個(gè)獨(dú)立的對(duì)象;

  可以在一個(gè)表中的一個(gè)或多個(gè)分區(qū)上進(jìn)行如刪除、移動(dòng)、析分等維護(hù)操作,而不會(huì)影響其它分區(qū),具有分區(qū)獨(dú)立性;

  如果選擇合適的分區(qū)策略,會(huì)大大的加快數(shù)據(jù)的查詢速度。

  一 找出需分區(qū)的表

  本節(jié)描述通過(guò)統(tǒng)計(jì)分析出醫(yī)院His系統(tǒng)需分區(qū)的表,對(duì)需分區(qū)的表找出包括在你的分區(qū)鍵中的列(表的屬性),即選擇分區(qū)鍵。

  1、基于訪問(wèn)頻度找出需分區(qū)的表

  Oracle8i允許訪問(wèn)數(shù)據(jù)庫(kù)中的審核信息,借助于收集的審核信息,設(shè)計(jì)者能夠確定哪些表的數(shù)據(jù)是真正最頻繁訪問(wèn)的,即找出那些表,需要進(jìn)行分區(qū)。

  打開(kāi)審核:在作為SYS或SYSSTEM登錄到數(shù)據(jù)庫(kù)后,動(dòng)行如下腳本,打開(kāi)對(duì)象的審核功能。

set echo off feed off ver off pages 0
spool audon.sql
select 'audit select on '||owner||'.'||object_name||' by
access;'
from dba_objects
where object_type in ('VIEW','TABLE') and owner in
('ORDADM');
spool off
set echo on feed on ver on
  這些代碼的運(yùn)行將產(chǎn)生“audon.sql”的輸出文件,它包含下面清單中所示格式的語(yǔ)句

audit select on ORDADM.DOCTOR_ORDERS by access;
audit select on ORDADM.GROUP_ORDER_ITEMS by access;
audit select on ORDADM.GROUP_ORDER_MASTER by access;
audit select on ORDADM.ORDERS by access;
audit select on ORDADM.ORDERS_COSTS by access;
audit select on ORDADM.ORDERS_SHEET_IMAGE by access;
audit select on ORDADM.VITAL_SIGNS_REC by access;
  使用命令@audon.sql激活上述代碼以打開(kāi)審核功能收集收集審核信息,建立一個(gè)表以保存概要信息:

create table aud_summary (
obj_name varchar2(30),
owner varchar2(30),
hits number);
  將審核信息從dba_audit_object表中取出并裝入概要表中:

insert into aud_summary
select obj_name,owner,count(*)
from dba_audit_object
group by obj_name,owner;
  關(guān)閉審核:

set echo off feed off ver off pages 0
spool audoff.sql
select 'noaudit select on '||owner||'.'||object_name|| '
by access;'
from dba_objects
where object_type in ('VIEW','TABLE') and owner in
('ORDADM');
spool off
set echo on feed on ver on
  這些代碼的運(yùn)行將產(chǎn)生“audoff.sql”的輸出文件。

  使用命令@ audoff.sql激活上述代碼以關(guān)閉上述對(duì)象的審核功能。

  清除審核信息:

delete sys.aud$
  分析審核信息

col obj_name form a30
col owner form a20
col hits form 99,990
selec obj_name,owner,hits from aud_summary;
OBJ_NAME OWNER COUNT(*)
----------- ------------- ----------
DOCTOR_ORDERS ORDADM 30309
DRUG_STOCK PHARMACY 11094
GROUP_ORDER_ITEMS ORDADM 1030
GROUP_ORDER_MASTER ORDADM 1196
ORDERS ORDADM 40421
ORDERS_COSTS ORDADM 10109
  以上是HIS系統(tǒng)臨床醫(yī)囑部分24小時(shí)內(nèi)對(duì)表的訪問(wèn)情況,從上面的查詢得表1-1。

  表1-1

表 行數(shù) 命中率 doctor_orders 2052709 30309 drug_stock 2511 11094 group_order_item 3800 1030 group_order_master 186 1196 orders 1633010 40421 orders_costs 2403214 10109
  group_order_master( 醫(yī)囑套攴主記錄) 、group_order_item(醫(yī)囑套攴明細(xì)), 表的行數(shù)比較少,不適合分區(qū);drug_stock(藥品庫(kù)存)雖然存取頻率比較高,但表的行數(shù)比較少,因此也不適合分區(qū)。我們選擇表的行數(shù)比較多、存取頻率比較高的表作分區(qū)處理,如 doctor_orders、orders、orders_costs,考慮到doctor_orders是醫(yī)生工作站上醫(yī)生開(kāi)的醫(yī)囑,orders是由doctor_orders生成、護(hù)士工作站上執(zhí)行的醫(yī)囑,兩個(gè)表結(jié)構(gòu)類似,而醫(yī)囑與藥品、衛(wèi)生材料、計(jì)費(fèi)聯(lián)系比較密切的是Orders,因此重點(diǎn)介紹對(duì)表orders的處理。

  2、基于列值選擇分區(qū)鍵

  使用Sql*plus下用命令A(yù)nalyze收集末分區(qū)表的統(tǒng)計(jì)信息,按照Oracle推薦的取樣20%進(jìn)行分析,并將統(tǒng)計(jì)結(jié)果保存在數(shù)據(jù)字典中。

Analyze table ORDADM.ORDERS estimate statistics
sample 20 percent;


  對(duì)DBA_TAB_COLUMNS數(shù)據(jù)字典視圖進(jìn)行查詢

[NextPage]

產(chǎn)生表1-2

select table_name,column_name,num_distinct
from DBA_TAB_COLUMNS
where owner like 'ORDADM';
  表1-2

列 不同的值 PATIENT_ID 28720 VISIT_ID 2 ORDER_NO 395 ORDER_SUB_NO 10 ORDER_CLASS 9 ORDER_CODE 825 ORDER_TEXT 1551 ORDERING_DEPT 15 START_DATE_TIME 1194176 STOP_DATE_TIME 636798    


  從表1-2中,我們可以看到欲分區(qū)表的各個(gè)候選分區(qū)鍵的

[1] [2] 下一頁(yè)

正在看的ORACLE教程是:Oracle數(shù)據(jù)表分區(qū)的策略。分布頻譜,ORDER_CODE(醫(yī)囑代碼)鍵值沒(méi)有出現(xiàn)一種均勻分布,用它作分區(qū)鍵,明顯不合適;

  ORDER_CLASS(醫(yī)囑類別代碼)、ORDERING_DEPT(開(kāi)醫(yī)囑科室代碼),鍵值出現(xiàn)均勻分布,如用它的各個(gè)鍵值作基于范圍的分區(qū),每個(gè)分區(qū)具有的記錄數(shù)比較均勻,但這種方法對(duì)于每天增加上萬(wàn)條記錄的表來(lái)看,顯然不是最優(yōu)的。如果選用START_DATE_TIME(醫(yī)囑開(kāi)始時(shí)間)建立范圍分區(qū),每月的數(shù)據(jù)建立一個(gè)分區(qū),在每個(gè)分區(qū)內(nèi)基于ORDERING_DEPT建立散列子分區(qū),每月的數(shù)據(jù)形成一個(gè)組合分區(qū),會(huì)使每個(gè)分區(qū)的記錄數(shù)分布均勻、查詢速度提高、易于備份和刪除。因?yàn)榇蠖鄶?shù)的統(tǒng)計(jì)和查詢是在一個(gè)月的范圍內(nèi),而且從實(shí)際的查詢效果看,跨月和跨年數(shù)據(jù)的統(tǒng)計(jì)和查詢速度,也比未分區(qū)的時(shí)候大大縮短,效果非常明顯。

    二 分區(qū)表的定義

Create Table orders (
 PATIENT_ID varchar2(10) not null, ORDER_NO number(4), ORDER_SUB_NO number(2),
 ..............
 ORDER_CLASS char(1),
 ORDER_TEXT varchar2(80),
 ORDER_CODE varchar2(10),
 .............
 START_DATE_TIME date
 STOP_DATE_TIME date
 .................
 ORDERING_DEPT varchar2(8)
 storage (initial 100M next 1M)
 PARTITION BY RANGE(START_DATE_TIME)
 SUBPARTITION BY HASH(ORDER_CODE)
 SUBPARTITIONS 3 STORE IN (ordersub1, ordersub 2, ordersub 3)
 (PARTITION orders200212 VALUES LESS THAN (to_date('2003-01-01 00:00: 00','yyyy-mm-dd hh24:mi:ss'))
 tablespace Tsp_Orders,
 PARTITION orders200301
 VALUES LESS THAN (to_date('2003-02-01 00:00: 00','yyyy-mm-dd hh24:mi:ss'))
 tablespace Tsp_Orders,,
 PARTITION orders 200302
 VALUES LESS THAN (to_date('2003-03-01 00:00: 00','yyyy-mm-dd hh24:mi:ss'))
 tablespace Tsp_Orders,,
 .....................
 PARTITION orders200402
 VALUES LESS THAN (to_date('2004-03-01 00:00: 00','yyyy-mm-dd hh24:mi:ss'))
 tablespace Tsp_Orders
 (SUBPARTITION ordersub1 TABLESPACE Tsp_Orders, SUBPARTITION ordersub 2 TABLESPACE Tsp_Orders,
SUBPARTITION ordersub3 TABLESPACE Tsp_Orders));
  在建立的Orders表中,按每月一個(gè)分區(qū),從2002年12月開(kāi)始,2004年02月止,共15個(gè)分區(qū), PARTITION BY RANGE(START_DATE_TIME) 子句,表示用表的START_DATE_TIME屬性建立范圍分區(qū),具體的每個(gè)分區(qū)名、時(shí)間范圍,在PARTITION子句定義;SUBPARTITION BY HASH(ORDER_CODE)子句,表示用表的ORDER_CODE 屬性,在每個(gè)分區(qū)下建立散列子分區(qū),具體的每個(gè)子分區(qū)名、所在表空間,在UBPARTITION子句定義。

  用下面ALTER TABLE數(shù)據(jù)定義語(yǔ)句為Orders建立約束和索引。

ALTER TABLE Orders ADD CONSTRAINT Pk_Orders KEY (Patient_id,
Visit_id,Order_no,Order_sub_no) USING INDEX PCTFREE 5 TABLESPACE Tsp_Orders;
  表1-3是用select count(*) from orders partition (分區(qū)名)語(yǔ)句,查詢出的名分區(qū)的記錄數(shù)。

  表1-3

分區(qū)名 記錄數(shù) orders200301 87311 orders2200302 87553 orders2200303 107533 ............   orders200401 124812
  三 分區(qū)表的維護(hù)操作

  增添分區(qū):

Alter Table orders Add partition orders200403
Aalues less (to_date('2004-04-01 00:00:00','yyyy-mm-dd hh24: mi:ss'))
Tablespace Tsp_Orders;
  刪除分區(qū):

Alter Table table_name Drop Partition partition_name;
  裁斷分區(qū):

Alter Table table_name Truncate Partition partition_name Storage;
  Oracle數(shù)據(jù)表分區(qū)小知識(shí):

  為了簡(jiǎn)化數(shù)據(jù)庫(kù)大表的管理,O r a c l e 8 及以后版本推出了分區(qū)選項(xiàng)。分區(qū)將表分離在若干不同的表空間上,用分而治之的方法來(lái)支撐無(wú)限膨脹的大表,給大表在物理一級(jí)的可管理性。將大表分割成較小的分區(qū)可以改善表的維護(hù)、備份、恢復(fù)、事務(wù)及查詢性能。針對(duì)當(dāng)前社保及電信行業(yè)的大量日常業(yè)務(wù)數(shù)據(jù), 可以推薦使用ORACLE8 的該選項(xiàng)。

  分區(qū)的優(yōu)點(diǎn):

  1 、增強(qiáng)可用性:如果表的一個(gè)分區(qū)由于系統(tǒng)故障而不能使用,表的其余好的分區(qū)仍然可以使用;

  2 、減少關(guān)閉時(shí)間:如果系統(tǒng)故障只影響表的一部分分區(qū),那么只有這部分分區(qū)需要修復(fù),故能比整個(gè)大表修復(fù)花的時(shí)間更少;

  3 、維護(hù)輕松:如果需要重建表,獨(dú)立管理每個(gè)分區(qū)比管理單個(gè)大表要輕松得多;

  4 、均衡I / O : 可以把表的不同分區(qū)分配到不同的磁盤來(lái)平衡I / O 改善性能;

  5 、改善性能:對(duì)大表的查詢、增加、修改等操作可以分解到表的不同分區(qū)來(lái)并行執(zhí)行,可使運(yùn)行速度更快;

  6 、分區(qū)對(duì)用戶透明,最終用戶感覺(jué)不到分區(qū)的存在。

上一頁(yè)    

上一頁(yè)  [1] [2] 

您可能感興趣的文章:
  • 詳解oracle的分表之表分區(qū)的具體使用和示例
  • oracle表空間表分區(qū)詳解及oracle表分區(qū)查詢使用方法
  • oracle存儲(chǔ)過(guò)程創(chuàng)建表分區(qū)實(shí)例
  • Oracle 數(shù)據(jù)表分區(qū)的策略
  • oracle表分區(qū)的概念及操作

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

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Oracle數(shù)據(jù)表分區(qū)的策略》,本文關(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
    安龙县| 老河口市| 绥滨县| 万载县| 萨嘎县| 龙陵县| 宾阳县| 百色市| 宿州市| 高淳县| 隆子县| 扎囊县| 博客| 浪卡子县| 德化县| 辽阳市| 新乐市| 定南县| 和平县| 夏津县| 康平县| 永胜县| 龙泉市| 特克斯县| 兴宁市| 镇康县| 临高县| 确山县| 嘉鱼县| 汉沽区| 沙湾县| 子洲县| 浦县| 大同市| 永昌县| 大埔县| 塘沽区| 徐州市| 慈溪市| 惠州市| 成都市|