由于单表数据量太大,达到千万级别,所以考虑采用oracle的存储过程实施分表操作。
说明:schema表中存储指标信息
store表中存放schema中指标指定的存储信息
dic_info是字典表
按照schema的id号建相同表结构的表,更新字典项,把原始的大表里的数据分摊到新建的小表中,实现分表。
create or replace procedure PROC_CREATE_TABLE_INSERT_DATA
(
--用以输出的信息
on_flag out number, --SQL错误码
out_reason out varchar2 --错误原因
)
is
v_table_name varchar2(50); --新生成的数据表表名
v_table_num integer; --数据表的数据量
v_create_sql varchar2(768); --建表语句
v_data_insert varchar2(256); --数据插入语句
v_old_table varchar2(50); --原始表表名
v_dic_sql varchar2(128); --字典项查询语句
v_dic_count integer; --字典项记数
v_data_count_sql varchar2(128); --数据统计语句
v_data_count integer; --数据记数
begin
--schema表中的数据存储信息放在store表中,而store表中的表id号是存储在字典表dic_info中的,现在将schema id作为新的表名,原始存储表名作为旧的表名
--oracle循环查询的结果集到v_schemas变量中
for v_schemas in (select a.id as newTable, c.code as oldTable
from schema a, store b, dic_info c
where b.tablenameid =
c.id and a.storeid = b.id) loop
v_table_name :=
v_schemas.newTable; --oracle数据复制给变量
v_old_table :=
v_schemas.oldTable;
--检测是否已存在要建的表
select count(*) into v_table_num from user_tables where table_name = upper(v_table_name);
if (v_table_num < 1) then
v_create_sql := 'create table '|| v_table_name || '(
id VARCHAR2(50) primary key,
schemaid VARCHAR2(50),
columnvalue1 VARCHAR2(128),
columnvalue2 VARCHAR2(128),
columnvalue3
VARCHAR2(128)
)';
--建表
execute immediate v_create_sql;
commit;
dbms_output.put_line('新建表:' || v_table_name || ' 成功。'); --输出记录
--更新dic_info中的表信息
v_dic_sql := 'select count(*)
from dic_info where code = ' || chr(39) || v_table_name ||
chr(39);
execute immediate v_dic_sql into v_dic_count;
if (v_dic_count < 1) then
insert into dic_info
-- select sys_guid() from dual 是oracle中新建GUID的方式
values ((select sys_guid() from dual), v_table_name, v_table_name,
'48484a2730b1703c0130b5651e9a001e', null, 0, null, null);
commit;
end if;
--将原始数据表中的采集数据导入新建表
--oracle中chr(39)表示单引号
v_data_insert := 'insert into ' || v_table_name || ' (select * from ' || v_old_table || ' where schemaid = ' || chr(39)|| v_table_name ||
chr(39) || ')';
v_data_count_sql := 'select count(*)
from ' ||
v_table_name;
--由于v_table_name是动态生成的,所以需要用execute去执行
execute immediate v_data_count_sql into v_data_count;
if (v_data_count < 1) then
execute immediate v_data_insert;
commit;
execute immediate v_data_count_sql into v_data_count;
dbms_output.put_line('向表' || v_table_name || '中存入数据' || v_data_count || '条');
end if;
--更新存储定义
update store a set a.tablenameid = (select id from dic_info where name = v_table_name)
where id = (select storedeid from schema where id = v_table_name);
commit;
else
dbms_output.put_line('指定表:' || v_table_name || ' 已存在。');
end if;
end loop;
--处理异常
EXCEPTION
WHEN OTHERS THEN
on_flag := SQLCODE;
out_reason := SUBSTR (SQLERRM, 1, 255);
ROLLBACK;
end;
PS:在存储过程执行过程中抛出
ORA-20000: buffer overflow, limit of 10000 bytes异常,
是因为有dbms_output.put_line语句,在pl/sql脚本中执行
SQL> set serveroutput 100000;
也不行。后来改为Test时手动修改 Buffer si的容量后才没有报错。
- 大小: 6.8 KB
分享到:
相关推荐
总的来说,这个存储过程展示了如何在MySQL中动态创建表和进行数据分表的操作,它对于处理大量数据的系统非常有用,可以显著提高查询效率和系统响应速度。同时,这种方法也使得数据库的扩展性和可维护性得到了提升,...
例如,当插入一条新订单时,通过当前日期计算出应该存储的表名,然后执行SQL语句。 4. **SQL解析与改写**:Sharding-JDBC内部集成了SQL解析引擎,能够识别并改写SQL语句,使其适应分片环境。对于按月分表的场景,...
- **存储过程**:预编译的SQL语句集合,可封装复杂的业务逻辑,提高性能并减少网络传输。 - **权限管理**:根据用户角色分配不同的访问权限,保障数据安全。 在“十次方建表语句”的场景中,可能涵盖各种不同领域...
本篇文章将详细介绍如何利用MySQL的存储过程按月创建表的方法步骤,这对于数据管理、分表存储以及历史数据归档等场景非常有用。 首先,我们看到代码中定义了一个名为`create_table_by_month`的存储过程。存储过程的...
例如,使用Merge存储引擎进行分表,会创建一个总表(如alluser)作为接口,实际数据存储在各个分表(如user1和user2)中。总表并不存储数据,只是一个逻辑上的容器,用于合并查询和管理分表。 **二、分区** 分区则...
DRDS(分布式关系型数据库服务)是阿里巴巴云服务中提供的关系数据库云服务,它能够帮助用户进行水平扩容,具体是指通过分库分表技术,使得数据库能够处理更多的数据量和更频繁的查询。该技术是针对大规模数据处理...
- **推荐做法**:根据字段的热度、冷度、静态性、大小等因素进行垂直分表,将热点数据和冷数据分开存储,以优化查询性能。 **3.2 水平分表** - **推荐做法**:当单表数据量过大时,可以采用水平分表策略,通过哈希...
在分库分表环境下,需统一分配各表中的主键值以避免整个逻辑表中主键重复。 - **字符集**:必须使用utf8mb4字符集,这是真正的“UTF-8”字符集。 - **注释**:数据库表、表字段必须加入中文注释。 - **命名...
这里需要注意的是实际的分表规则并没有给出,通常会涉及到根据某字段(如`id`)的值进行哈希计算,从而确定记录存储的位置。 #### 四、总结 本文通过对“多数据源的分表分库6-13”文档内容的分析,详细介绍了如何...
然后,设置变量,来存储最大分区的信息。最后,建立作业,调度交换,以自动创建新的分区。 在Kettle中,获取最大分区的SQL语句如下: ``` select to_date(to_char(sysdate,'yyyymmdd'),'yyyymmdd')-to_date...
关系型数据库采用关系模型来组织数据,这种模型以行和列的形式存储数据,便于用户理解和操作。每个数据表都有预定义的表结构,数据按照最小关系表的形式存储,以避免数据冗余和提高数据的一致性。关系型数据库的主要...
简单的数据库存储框架,适合简单的单机游戏服务器/应用服务器使用,省去开发人员自己建表/分表,让开发人员更专注于业务逻辑 限制: 暂时只实现了单服,没有实现高可用,后续有时间可以考虑将数据先同步到redis集群...
MySQL 建表的优化策略是数据库设计的关键环节,它直接影响到数据存储的效率和查询性能。以下是对各个知识点的详细解析: 1. **字符集的选择**:在确定数据仅包含中文并且不需要处理其他语言字符时,GBK字符集是优选...
内存表使用Memory引擎,数据存储在内存中,系统重启后数据丢失,而临时表则可以使用多种引擎,包括InnoDB和MyISAM,其数据存储在磁盘上,但生命周期仅限于创建它的会话(session)。 临时表的特性如下: 1. **创建...
4. 负载均衡:通过分库分表,可以将请求分散到多个数据库,降低单个数据库的压力。 二、Java多数据源实现方式 1. 动态切换数据源:在运行时根据业务需求动态选择合适的数据源,常见的实现方式是使用AOP(面向切面...
分区是根据数据的某些列值来组织的,可以理解为传统数据库中的分表。分区可以基于时间、范围或者散列函数来实现。分区的数据在磁盘上是有序存储的,且无须维护额外的索引结构。 在表结构设计方面,ClickHouse允许...
MySQL集群配置是一个复杂的过程,特别是在大数据量和高并发的场景下,为了提升数据库的性能和可用性,我们通常会采用分布式数据库系统,如mycat。mycat是一个开源的分布式数据库系统,它作为数据库中间件,能够实现...
MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的...
- **分库分表、分区表**:根据业务需求,当数据量过大时,考虑水平分库分表或垂直分区,提高查询效率。 - **字符集**:选择合适的字符集,如`utf8mb4`支持四字节Unicode字符,确保数据的兼容性。 - **DAO层设计**:...
- 使用整型来存储IP地址,这样可以减少存储空间并提高查询效率。 2. **建表索引** - 不是所有的字段都需要建立索引,应该根据查询需求来针对性地创建。考虑在`WHERE`和`ORDER BY`子句中涉及的列上建立索引。 - ...