搜狐首页 科技 无心法师

手机搜狐

SOHU.COM

海量数据切分抽取的实践场景(r11笔记第43天)

如果一个大表要抽取数据导出成csv文件,我们有什么策略,如何改进。

一、问题背景

今天开发的同学找到我,他们需要做一个数据统计分析,需要我提供一些支持,把一个统计库中的大表数据导出成文本提供给他们。

这个表有多大呢,数据量有4亿+,而且使用了分库分表的策略,所以看起来这不是一个简单的问题。

简单来说就是下面的架构方式,在右侧的目标端存在的都是物化视图,存在12个子集,也就意味着有12个物化视图存在。

如何抽取出这12个物化视图的数据呢,一边和BI的同学确认格式,而另一边需要对抽取的文件进行切分,意味着一个物化视图如果数据量太大,导出的csv文件会很大,希望提供给BI同学的是一些大小均匀的csv文件。

这里就有两个重要的内容需要说一下:

1)大表如何平均切分,而不单单考虑是否为分区表。

2)如何规范化,标准化的抽取数据。

二、大表如何切分

大表的切分一直以来是数据迁移中的重头戏,我在以前的时间积累中也为此困扰。一个表如果不是分区表,存在1000万的数据,如果我们希望以数据条数为基准进行切分,能否实现。

比如1000万数据的表,100万为单位,那就生成10个csv文件,每个文件包含100万数据。

当然这个工作是可以做成的,实现的基础就是ROWID切分。直接上脚本。

#### $1 dba conn details

#### $2 table owner

#### $3 table_name

#### $4 subobject_name

#### $5 parallel_no

function normal_split

{

sqlplus -s $1 EOF

set linesize 200

set pages 0

set feedback off

spool rowid_range_$3_x.lst

select rownum || ', ' ||' rowid between '||

chr(39)||dbms_rowid.rowid_create( 1, DOI, lo_fno, lo_block, 0 ) ||chr(39)|| ' and ' ||

chr(39)||dbms_rowid.rowid_create( 1, DOI, hi_fno, hi_block, 1000000 )||chr(39) data

精选