oracle 9i的分區 比11G少了一個自動分區的功能 因此分區表只能本身先手動指定sql
以下表示日誌表 按照字段logtime range分區 每月建立一個分區數據庫
-- Range分區: oracle
-- Range分區是應用範圍比較廣的表分區方式,它是以列的值的範圍來作爲分區的劃分條件,將記錄存放到列值所在的range分區中。less
-- 如按照時間劃分,2010年1月的數據放到a分區,2月的數據放到b分區,在建立的時候,須要指定基於的列,以及分區的範圍值。測試
-- 在按時間分區時,若是某些記錄暫沒法預測範圍,能夠建立maxvalue分區,全部不在指定範圍內的記錄都會被存儲到maxvalue所在分區中。spa
create table sys_log_fq ( pid NUMBER not null,
yhdm VARCHAR2(60),
bmdm VARCHAR2(24),
pdaid VARCHAR2(1024),
simid VARCHAR2(100),
logmodule VARCHAR2(2),
logtype VARCHAR2(8),
operatetype CHAR(2),
methodname VARCHAR2(200),
methodinfo VARCHAR2(4000),
execstatus VARCHAR2(2),
execerrorinfo VARCHAR2(2000),
alltimespent NUMBER,
proxytimespent NUMBER,
logcontent VARCHAR2(4000),
logtime DATE,
memo VARCHAR2(400),
returnflag CHAR(2),
returninfo VARCHAR2(2000),
gpsx VARCHAR2(40),
gpsy VARCHAR2(40))tablespace test_DATA
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
) partition by range (logtime)日誌
(
partition p1 values less than (to_date('2012-04-1', 'yyyy-mm-dd')), --時間範圍小於'2012-04-1'的數據放索引
-- 一個分區
partition p2 values less than (to_date('2012-05-1', 'yyyy-mm-dd')),
partition p3 values less than (to_date('2012-06-1', 'yyyy-mm-dd')),
partition p4 values less than (to_date('2012-07-1', 'yyyy-mm-dd')),
partition p5 values less than (to_date('2012-08-1', 'yyyy-mm-dd')),
partition p6 values less than (to_date('2012-09-1', 'yyyy-mm-dd')),
partition p7 values less than (to_date('2012-10-1', 'yyyy-mm-dd')),
partition p8 values less than (to_date('2012-11-1', 'yyyy-mm-dd')),
partition p9 values less than (to_date('2012-12-1', 'yyyy-mm-dd')),it
partition p10 values less than (maxvalue) --若是某些記錄暫沒法預測範圍,能夠建立maxvalue分區,所----有不在指定範圍內的記錄都會被存儲到maxvalue所在分區中。
) io
若是是已經存在的普通表則能夠新建一個分區表進行中轉
把原先普通表的數據導入到分區表 而後renme下表名
導表經過 insert into sys_log_fq (select * from sys_log),
數據太大 9I下數據庫容導入易報錯 建議分時間範圍 數據分批導入。
分區後 實驗測試得出比不分區的表一個月內查詢速度快20秒(具體根據您的表數據狀況)
若是要對分區後的表字段logtime值就行修改若是修改後的值不是該分區的範圍 則會報錯
爲了解決這個問題,可使用以下命令更改分區表的屬性:
SQL> alter table 表名 enable row movement;
若是新插入的數據logtime是2013年的 對比上面的分區不在p1-p9分區範圍 那麼它會默認放進p10分區
這時候2013這個logtime值的數據只有在p10分區內才能查詢到
時間一長p10 分區內的數據將會愈來愈多,固然須要維護,就須要新增分區
--在有maxvalue的狀況下添加分區要用split語法
alter table sys_log split partition p10 at (to_date('2013-12-1', 'yyyy-mm-dd'))
into (partition p11, partition p10);
執行完這句 p10分區內已經查詢不到2013年的數據了,只能在p11分區內查詢到(實驗得出,絕非理論推斷)
若是不想每次都手動寫新增分區語句去數據庫執行 那麼久能夠寫一個定時job
能夠每月 月麼生成一個下個月的分區,(哎,用過oracle 11G的分區後就以爲9I 的分區好麻煩- -!)
下面是經常使用的分區表sql
--查詢當前用戶下分區表的分區信息:
SELECT * FROM USER_TAB_PARTITIONS T WHERE T.TABLE_NAME='SYS_LOG';
--查詢某分區下的數據量:
SELECT COUNT(*) FROM sys_log PARTITION(P2);
--查詢索引、表上在那些列上建立了分區:
SELECT * FROM USER_PART_KEY_COLUMNS;
--添加分區 – 在最後一個分區以後添加新分區
ALTER TABLE SALES ADD PARTITION P4 VALUES LESS THAN (4000);
--拆分分區 - 將一個大分區中的記錄拆分到兩個分區中
[sql]
ALTER TABLE SALES SPLIT PARTITION P2 AT (1500) INTO (PARTITION P21, PARTITION P22);
--查詢每一個分區表的分區的大小以及分區表的索引等 SELECT * FROM dba_segments t WHERE t.segment_name ='表名' and owner='用戶名';