Oracle操作技巧
由于客户的要求对数据库的做了一些高级操作(起码对我来说已经很高级了)。
由于之前对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;