創建表分區的總結


最近接手一個需求,需要展示主機的性能值(指主機的CPU利用率)主機60台,每台10分鍾產生條記錄。每天數據量60*6*24=8640 一年300W條記錄 結合一些業務要求 展示數據時間大概要10秒左右。不符合顧客需要,所以就需要進行優化改造。方法肯定很多,自己想到的就是一個用java開源的分布式框架來做,但是有點大材小用的感覺。於是就考慮對表進行分區來提高查詢速度。以下就是本人對表分區過程的介紹及其遇到的各種問題的解決方式,希望對大家有所幫助!

對於表分區可以通過重建表,交換分區和在線重定義的方式來實現

具體參考http://blog.itpub.net/post/468/13091

我采用最保守的重建表的方式來實現

首先是創建表空間

 1 /*1.創建表空間*/ --autoextend on
 2 CREATE TABLESPACE CPU_201112 
 3        DATAFILE 'F:\ORACLE\ORADATA\NGNMC\CPU_201112.DBF ' SIZE 100M REUSE;
 4 /*CREATE TABLESPACE CPU_201201 
 5        DATAFILE 'F:\ORACLE\ORADATA\NGNMC\CPU_201201.DBF ' SIZE 100M REUSE;  */
 6 CREATE TABLESPACE CPU_201202 
 7        DATAFILE 'F:\ORACLE\ORADATA\NGNMC\CPU_201202.DBF ' SIZE 100M REUSE;  
 8 CREATE TABLESPACE CPU_201203 
 9        DATAFILE 'F:\ORACLE\ORADATA\NGNMC\CPU_201203.DBF ' SIZE 100M REUSE;  
10 CREATE TABLESPACE CPU_201204 
11        DATAFILE 'F:\ORACLE\ORADATA\NGNMC\CPU_201204.DBF ' SIZE 100M REUSE;        
12 CREATE TABLESPACE CPU_201205 
13        DATAFILE 'F:\ORACLE\ORADATA\NGNMC\CPU_201205.DBF ' SIZE 100M REUSE; 

  查詢創建的表空間

select * from user_tablespaces

Ps:
這里可能會遇到ora-01119的錯誤
原因是表空間創建的路徑必須要正確

 

/*2.刪除表空間*/

--DROP TABLESPACE tablespace_name INCLUDING CONTENTS AND DATAFILES;--推薦刪除contents 然后在手動刪除datafiles

刪除表空間不是都可以的哦 親,

造成這種原因基本是這個分區的數據包含了別的分區的數據

 3.創建表分區           

 1 create  table   host_cpu_new  partition by range(intime)
 2 
 3  (partition p1 values less than(to_date('2011-12-30','yyyy-MM-dd')) TABLESPACE CPU_201112,
 4 
 5 -- partition p2 values less than(to_date('2012-01-1','yyyy-MM-dd')) TABLESPACE CPU_201201,
 6 
 7  partition p3 values less than(to_date('2012-02-1','yyyy-MM-dd')) TABLESPACE CPU_201202,
 8 
 9  partition p4 values less than(to_date('2012-03-1','yyyy-MM-dd')) TABLESPACE CPU_201203,
10 
11  partition p5 values less than(to_date('2012-04-1','yyyy-MM-dd')) TABLESPACE CPU_201204,
12 
13   partition p6 values less than(to_date('2012-05-1','yyyy-MM-dd')) TABLESPACE CPU_201205
14 
15  )as select * from host_cpu

由於目前數據只到4四月份 且11年的數據不多

所以分區創建的思路就是將11年的數據全放到一個分區 基本也不會用到

12的數據按月來分區

可是因為一時的疏忽 注意12月份可是有31的天 親

而p2的分區是我后面加的

結果悲催的事情來了 這也是我為什么要寫這篇文章主要的原因

當界面查詢1月份的數據的時候 發現出現了12月份的數據

親 你知道為什么嗎?單獨查詢sql發現是不會有問題的

Select * from host_cpu_new where intime>=to_date(‘2012-01-01 00:00:00’,’yyyy-MM-dd HH24:mi:ss’)

And intime<                            to_date(‘2012-02-01 00:00:00’,’yyyy-MM-dd HH24:mi:ss’)

Java程序調用的時候結果出現了12月份的數據 想來

Java查詢的時候查詢了兩個分區也就是p2和p3的數據了

后悔呀 只能把P2的分區給刪除了 發現暴ora-14404的錯誤

也就是這個分區包含了其他分區的數據

沒辦法 只能重新重建一次了 當然也可以選擇合並分區啦 

最后的一點操作

Truncate table host_cpu

drop table host_cpu

 alter table host_cpu_new rename to host_cpu;

完成操作

Ps 在去查詢的時候 發現展示的時間縮短了大概2/3 嘻嘻。

由於期間遇到誤刪除表數據的情況 悲啊 什么情況

http://soft.chinabyte.com/database/161/12309661.shtml

如果是10g還可以這么做

select timestamp_to_scn(to_timestamp('表刪除的時間','YYYY-MM-DD HH24:MI:SS')) from dual; --return scn

create table tablename as select * from tablename AS OF SCN  scn(第一條SQL執行返回的scn結果)

 

關於更多表分區的知識

Oracle 分區表的新增、修改、刪除、合並。普通表轉分區表方法 ;

http://adamxgl.blog.163.com/blog/static/29094652011117111221690/

刪除表空間失敗

http://topic.csdn.net/u/20100714/16/b9beb58e-0dd0-4653-9784-7fb7a71eb260.html

快速刪除表空間

http://apps.hi.baidu.com/share/detail/15357973

表空間操作的簡單介紹

http://blog.sina.com.cn/s/blog_53d1a7710100072u.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM