作者:李東龍
來北京工作已經1周,在這一週中乾的基本上都不是開發的事情。由於客戶的要求對數據庫的做了一些高級操作(起碼對我來說已經很高級了)。
由於之前對Oracle也沒有深入的學習。對很多操作都沒有聽說過,但在開發中我認爲還是比較重要的,作爲開發的基礎(數據庫)。還是非常值得學習的。
下面對錶空間、分區表、批量導入測試數據,等操作進行一下整理。
一、表空間
1、 創建表空間
Create tablespace表空間名稱 datafile'(數據文件地址和名稱—.dbf文件)' size 50m(文件大小);
一般服務器都用的是linux或者是unix的,對於表空間的地址就需要去裏面查看了。一般連接都用 cmd->telnet->然後是用戶名、密碼了。所以還是很有必要熟悉一下命令。
2、 刪除表空間
DROP TABLESPACE表空間名稱 INCLUDING CONTENTS AND DATAFILES CASCADECONSTRAINTS;
3、 查詢表空間使用量
alter database datafile'數據文件地址+名稱(如:/oracle10/data_file_name.dbf)' resize 500m(要改的大小)
4、 查詢表空間使用量
select a.tablespace_name,a.bytes/1024/1024"Sum MB", (a.bytes-b.bytes)/1024/1024 "usedMB",b.bytes/1024/1024"free MB" from
(select tablespace_name,sum(bytes)bytes from dba_data_files group by tablespace_name) a,
(selecttablespace_name,sum(bytes)bytes,max(bytes) largest from dba_free_space group bytablespace_name) b
where a.tablespace_name =b.tablespace_name
order by ((a.bytes-b.bytes)/a.bytes) desc
這個就不解釋了, 直接粘貼就可以。 這是查的是Oracle本身自己建的視圖。具體怎麼搞的我也不是很清楚。 對於表空間大概也就這麼些個操作,如果表空間出現問題的話基本有這些就足夠解決了。
二、分區表
先來說說爲什麼要建分區表吧!
1. 提高查詢效率
據分析如果數據量極大的話,都放到一個表空間的話,查詢沒有個一個隔離,查詢基數就特別大,查詢就會非常慢。像我們現在需求,大概每天都會產生10000000多萬的數據量,這樣查詢當然會非常慢了!
如果按照時間或者按照某個設備產生的數據劃分,那查詢基數就大大減小了。對於查詢那個分區表,這個在程序當中控制就可以了。當然Oracle也會通過你這個分區表的規則先處理一下。
2. 減小數據文件要求空間
數據存儲在數據庫中大小肯定是一定的。怎麼能減小數據文件的要求空間呢?
如果你都把數據都存入一個數據文件中,那麼這個文件在磁盤的可以擴展的空間就必須足夠,要麼數據就搞不進去了!如果是建分區表的話,我們可以把分區表對應的數據文件存放在不同的磁盤上。這樣對他的限制就很小了。
分區表存在這樣的優勢,當然也存在劣勢。
1、 全局查詢較慢
如果查詢的條件不能限制在幾個分區表中查詢話的,那查詢就會在每個分區表中都會查詢。那就慢多了!
2、 表空間管理繁瑣
分區表很可能越建越多,這個管理起來就有些麻煩了。
暫時我只有這些對分區表的感受。在隨後的開發中應該還會遇到這樣那樣的問題。下面咱們就進入分區的創建和維護階段
1、 創建分區表
CREATE TABLE表名
(
數據庫表字段
)
partition by range(CATALOG_TIME)
(
Partition 分區表名稱 values less than (TO_DATE('2013-04-18', 'yyyy-mm-dd')) tablespace表空間名稱,
Partition 分區表名稱 values less than (TO_DATE('2013-04-19', 'yyyy-mm-dd')) tablespace表空間名稱,
Partition 分區表名稱 values less than (TO_DATE('2013-04-20', 'yyyy-mm-dd')) tablespace表空間名稱
)
該分區表是按天建的。當然也可以按照其他的規則建立
2、 新增分區表
新建分區表之後,很可能分區建的少了,我們需要新增一下,當然不能刪了之前的所有表,重新執行上面的語句。如果表中有數據那就都沒有了。
alter table表名 addpartition分區表名 valuesless than (TO_DATE('2013-04-22', 'yyyy-mm-dd')) tablespace表空間名稱;
三、導入測試數據
基本上表建好了之後就要導入測試數據了,怎麼才能高效的導入測試數據,這是我一直很困擾我的問題。搞點測試數據實在是太困難了。
請看下列代碼,可能對你很有幫助。
由於我們用的是Oracle,Oracle又不支持主鍵自增。所以在導入數據之前先要新建一個序列來幫助你生成主鍵。
[1]創建序列
CREATE SEQUENCE SEQ_TEST MINVALUE 1 MAXVALUE 100000 START WITH 1 INCREMENT BY 1 NOCACHE ORDER;
語句很簡單,就不做解釋了。
[2]插入數據(循環)
declare
maxrecordsCONSTANT int:=100000;iint:=1;
begin
fori in 1..maxrecords loop
INSERT INTO表名(id,字段名稱……)
VALUES
(SEQ_TEST1.NEXTVAL,(字段值));
endloop;
commit;
end;