oracle大数据量。表分区提示查询效率

现在业务有一张usertrack 日志记录表。每天会产生30万条数据。数据量大查询效率会非常慢

所以我考虑通过表分区来提示效率  逻辑上是一张表。但是分区后会按照分区条件将数据分在不同的物理文件

优点:

1)   改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。

2)   增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;

3)   维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;

4)   均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。

缺点:

分区表相关,已经存在的表没有方法可以直接转化为分区表。

表分区主要分为 范围分区  列表分区  散列分区  组合范围散列分区  复合范围散列分区(这个大大的博客说的很详细:http://www.cnblogs.com/leiOOlei/archive/2012/06/08/2541306.html)

我的业务场景选择使用范围分区

因为分区表不能在已存在的表上创建 所以要备份数据删除原来的表 再重新创建这个表为分区表

--将数据备份到临时表
create table usertracktemp
as select * from  usertrack

 

--检查数据是否一致
select count(1) from usertracktemp
select count(1) from usertrack
--删除表
truncate table usertrack;
drop table usertrack
--创建表同时创建分区
create table usertrack
PARTITION BY RANGE(createtime)
(
 PARTITION  prot20151101 values LESS THAN (TO_DATE(‘2015-11-01 00:00:00‘,‘yyyy-mm-dd hh24:mi:ss‘)),
 PARTITION  prot20151201 values LESS THAN (TO_DATE(‘2015-12-01 00:00:00‘,‘yyyy-mm-dd hh24:mi:ss‘)),
 PARTITION  prot20160201 values LESS THAN (TO_DATE(‘2016-02-01 00:00:00‘,‘yyyy-mm-dd hh24:mi:ss‘)),
 PARTITION  prot20160301 values LESS THAN (TO_DATE(‘2016-03-01 00:00:00‘,‘yyyy-mm-dd hh24:mi:ss‘)),
 PARTITION  prot20160401 values LESS THAN (TO_DATE(‘2016-04-01 00:00:00‘,‘yyyy-mm-dd hh24:mi:ss‘)),
 PARTITION  prot20160501 values LESS THAN (TO_DATE(‘2016-05-01 00:00:00‘,‘yyyy-mm-dd hh24:mi:ss‘)),
 PARTITION  protmaxt values less  THAN (maxvalue)
)
as
select  *
  from usertracktemp 

我可以明确数据在这个范围区间。。按每月来分区 所以是直接写死了。不能明确的话先创建分区表。 写个存储过程 时间分组。然后通过指针遍历 再在分区表上建立新的分区

常用的几个命令

 --查询指定分区的数据
select createtime from usertrack PARTITION(protmaxt)
--查询指定表下面的所有分区
select * from user_segments where segment_type=‘TABLE PARTITION‘ and segment_name=‘USERTRACK‘;

segment_name为表名 记得统一大写

--有maxvalue分区条件的时候创建分区语法
ALTER TABLE usertrackTest SPLIT PARTITION protmaxt AT (TO_DATE(‘2016-06-06 16:00:15‘,‘yyyy-mm-dd hh24:mi:ss‘)) INTO (PARTITION  part20160606, PARTITION protmaxt) UPDATE GLOBAL INDEXES
--没有maxvalue分区条件的时候
ALTER TABLE SALES ADD PARTITION P3 VALUES LESS THAN(TO_DATE(‘2003-06-01‘,‘YYYY-MM-DD‘)); 

这个时候我还要新建一个工作 每个月执行一次 创建新的分区。然后当前月产生的数据就插入到这个心的分区里面

新建一个每月执行一次的存储过程

create or replace procedure CreatePartition

as
--声明变量
 partitionName varchar(20);
 createSqlText varchar(300);
 partitionDate date;
begin
  partitionDate:=ADD_MONTHS(sysdate,1);
 partitionName:=‘part‘||to_char(partitionDate,‘yyyymmdd‘);
 createSqlText:=‘ALTER TABLE usertrackTest SPLIT PARTITION protmaxt AT (TO_DATE(‘‘‘||to_char(partitionDate,‘yyyy-mm-dd hh24:mi:ss‘)||‘‘‘,‘‘yyyy-mm-dd hh24:mi:ss‘‘)) INTO (PARTITION  ‘|| partitionName||‘, PARTITION protmaxt) UPDATE GLOBAL INDEXES‘;
  dbms_output.put_line(createSqlText);
 execute immediate createSqlText;
end;

新建一个工作

 

--查询工作
select * from sys.user_jobs

常用的时间间隔指令

1:每分钟执行

Interval => TRUNC(sysdate,‘mi‘) + 1/ (24*60)

Interval => sysdate+1/1440

2:每天定时执行

例如:每天的凌晨1点执行

Interval => TRUNC(sysdate) + 1 +1/ (24)

3:每周定时执行

例如:每周一凌晨1点执行

Interval => TRUNC(next_day(sysdate,‘星期一‘))+1/24

4:每月定时执行

例如:每月1日凌晨1点执行

Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24

5:每季度定时执行

例如每季度的第一天凌晨1点执行

Interval => TRUNC(ADD_MONTHS(SYSDATE,3),‘Q‘) + 1/24

6:每半年定时执行

例如:每年7月1日和1月1日凌晨1点

Interval => ADD_MONTHS(trunc(sysdate,‘yyyy‘),6)+1/24

7:每年定时执行

例如:每年1月1日凌晨1点执行

Interval =>ADD_MONTHS(trunc(sysdate,‘yyyy‘),12)+1/24

性能测试

不加任何查询条件

使用了分区条件进行筛选

可以看出各项指标分区后的都优于没有分区的表

时间: 2024-10-29 00:54:41

oracle大数据量。表分区提示查询效率的相关文章

大数据量表的优化查询

1:索引,我们最先想到的就是创建索引,创建索引可以成倍的提升查询的效率,节省时间.但是如果数据量太过于巨大的时候,这个时候单纯的创建索引是无济于事的,我们知道假如特别是在大数据量中统计查询,就拿1000W数据来说吧,如果使用count函数的话,最少要50-100秒以上,当然如果你的服务器配置够高,处理够快,或许会少很多但是一样会超过10秒. 单纯的建立索引是无济于事的.我们可以在创建索引的时候给索引加个属性,compress,这个属性可以将所创建的索引进行一个良好的归类,这样的话,查询速度会提升

mysql大数据量表索引与非索引对比

1:不要在大数据量表中轻易改名字(做任何操作都是非常花费时间) 2个多亿数据量的表 改名操作  执行时间花费8分多钟 (如果是加索引等其他操作 那时间花费不可预估) 2:给大数据量的mysql表 添加索引 所花费的时间 如下 在日后生产环境 如果需要给表添加索引等操作 心里要有预估时间的花费范围 3: explain 解释 语句 type:ALL 进行完整的表扫描 .row:213284372  mysql预估需要扫描213284372 条记录来完成这个查询.可想而知 表数据量越大全表扫描越慢.

大数据量表结构设计案例

在处理大数据量的表时,会消耗数据库的大量性能,所以,在设计数据库表时,要考虑到此种现象,将数据库设计的合理合法,来提高数据库性能减小数据库压力. 当表记录太多,如产品.的订单.大量客户等,是数据库访问压力的主要来源,此时,从数据库拆分表的角度来减轻压力,可以采用如下两种方法: 1.对表进行水平分割 水平分割:以该表主键PK的某个值为界限,将该表的记录水平拆分为两个表 2.对表进行垂直分割 垂直分割:表字段太多,按照表字段拆分,将一个表垂直分解为两个表 例:有产品表,数据量为10w,数据量稳定:

怎么快速删除大数据量表

v一.前言 要清空表中数据,100w条数据以上的表,开始我们使用delete from t_user进行删除,这样操作太慢了,需要等好长时间,如果数据量更大,那么我们要等的时间无法想象. 可以用以下方法进行删除 假设要删除的原表为SOURCE_T v二.解决办法 第一步:生成中间表 1 create table SOURCE_T_M as select * from SOURCE_T where id = '111' --任意指定一条符合条件的数据即可 第二步:修改表名 1 rename SOU

大数据量下DataTable To List效率对比

使用反射和动态生成代码两种方式(Reflect和Emit) 反射将DataTable转为List方法 1 public static List<T> ToListByReflect<T>(this DataTable dt) where T : new() 2 { 3 List<T> ts = new List<T>(); 4 string tempName = string.Empty; 5 foreach (DataRow dr in dt.Rows)

.Net中EF针对大数据量查询超时的一种优化

旧代码: --receiptIds   id集合,每次查1000左右 var mappingList = new List<FinanceSettlementMapping>(); mappingList.AddRange(SettlementMappingRepository.Entities.Include(o => o.ReceiptsTo).Include(d => d.FinanceSettlement).Where(d => receiptIds.Contains

Oracle大数据常见优化查询

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select id from t where num=0 3.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使

提高MYSQL大数据量查询的速度

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select id from t where num=0 3.应尽量避免在 where 子句中使用!=或<>操作符,否则引擎将放弃使用

sql大数据量查询的优化技巧

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from xuehi.com where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from xuehi.com where num=0 3.应尽量避免在 where 子句中使用