创建表分区的总结
最近接手一個需求,需要展示主機的性能值(指主機的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_tablespacesPs:
這里可能會遇到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
轉載于:https://www.cnblogs.com/draem0507/archive/2012/04/26/2471737.html
總結
- 上一篇: mysql多启动与日志调优
- 下一篇: 利润分配年末有余额吗