oracle中随机取1条或N条(据说效率更高)
select * from table1 sample(10) where rownum <= 10
--其中sample(10) 含义为检索表中的10%数据
一、数据冗余
**
**
关系数据库中的数据冗余主要是指关系数据库中同一信息数据的重复存贮。
关系数据库的数据冗余形成的原因:表的重复、属性的重复、元组的重复、属性值的重复。有的数据冗余用于数据间建立联系、数据安全或为了数据使用的便利,是必需的数据冗余,而其余的数据冗余为非必需的数据冗余应尽量予以消除。
数据冗余容易产生数据的不一致性,同时浪费了宝贵的资源,应尽量减少。但关系数据库中为实现一些功能有些数据冗余是必需的。必需的数据冗余主要用于以下用途:
(1)数据间建立联系,如两表间通过共同属性建立联系;
(2)数据恢复,如建立备份文件以备正式文件被破坏时恢复;
(3)数据核查,如设立数据校验位可以检查数据在存贮、传输等过程中的改变;
(4)数据使用的便利,如为了查看数据的直观,使用数据的方便、高效。
二、分区表
**
**
(1) 表空间及分区表的概念:
表空间是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表, 所以称作表空间。
分区表: 当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个“表空间”(物理文件上),这样查询数据时,不至于每次都扫描整张表,而只是从当前的分区查到所要的数据大大提高了数据查询的速度。
(2) 表分区有以下优点:
1、改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。
2、增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;
3、维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;
4、均衡I/O:可以把不同的分区映射到不同磁盘以平衡I/O,改善整个系统性能。
对应的缺点:
已经存在的表没有方法可以直接转化为分区表,不过 Oracle11g 提供了在线重定义表的功能。
(3) 如何创建表分区?
- 1、 创建范围(range)分区
即根据分区键值的范围进行划分,创建一个标准的range分区表:
> create table t_partition_range (id number,name varchar2(50))
partition by range(id)(
partition t_range_p1 values less than (10) tablespace tbspart01,
partition t_range_p2 values less than (20) tablespace tbspart02,
partition t_range_p3 values less than (30) tablespace tbspart03,
partition t_range_pmax values less than (maxvalue) tablespace tbspart04 );
- 2、Hash分区:
对于那些在列的值无法有效划分范围的表,可以使用hash分区,这样对于提高性能还是会有一定的帮助,hash分区会将表中的数据平均分配到你指定的几个分区中,但无法控制数据被放入哪个分区。
> create table t_partition_range (id number,name varchar2(50))
partition by hash(id)(
partition t_range_p1 values less than (10) tablespace tbspart01,
partition t_range_p2 values less than (20) tablespace tbspart02,
partition t_range_p3 values less than (30) tablespace tbspart03,
partition t_range_pmax values less than (maxvalue) tablespace tbspart04 );
- 3、列表(list)分区:
如果表的某个列的值可以枚举,则可以考虑对表进行列表分区,比如客户表可以按照客户所在的省份进行分区,同样只用将partition by 后关键词换为list即可。
(4) 表分区策略
对表进行分区设计时,首先要考虑和分析分区表中每个分区的数据量,
确定哪些表属于大表。
关于分区的表空间的规划,要对每个表空间大小进行估算,比如每个季度数据为100MB,那么最好创建120MB的表空间,同时还要考虑数据量的增长。
(5) 管理分区表
对已经存在表分区的表,进行的操作有:添加表分区、删除分区、合并分区等。
- 1、添加表分区
1、范围分区表(range partitioned table)
ALTER TABLE range_example ADD PARTITION part04 VALUES LESS THAN (TO_DATE('2008-10-1 00:00:00','yyyy-mm-ddhh24:mi:ss'));
2、哈希分区表(hash partitioned table)
ALTER TABLE hash_example ADD PARTITION part03;
3、列分区表(list partitioned table)
ALTER TABLE list_example ADD PARTITION part04 VALUES ('TE');
ALTER TABLE list_example MODIFY PARTITION part04 ADD VALUES('MIS');
ALTER TABLE list_example MODIFY PARTITION part04 DROP VALUES('MIS');
- 2、删除表分区
ALTER TABLE ... DROP PARTITION part_name;
- 3、合并表分区
ALTER TABLE range_example MERGE PARTITIONS part01_1, part01_2 INTO PARTITION part01 UPDATE INDEXES;
--将part01_1和part01_2分区合并成part01分区,如果省略update indexes子句的话,必须重建受影响的分区的index;
网友评论