`
gaoyuntao2005
  • 浏览: 311089 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

有这样的一类需求,快速复制一张表,而这张表的数据量又非常的大。比方说本来是分区表,要把它重新变成非分区表,怎么能够快速的完成这样的操作呢?有下面几种方法: 第

 
阅读更多

有这样的一类需求,快速复制一张表,而这张表的数据量又非常的大。比方说本来是分区表,要把它重新变成非分区表,怎么能够快速的完成这样的操作呢?有下面几种方法:

第一,就是利用CTAS方式来创建一张新表,当然要想加快速度,在数据库不是force logging的前提下,可以使用nologging方式来创建表:

SQL> select force_logging from v$database;
FOR
---
NO

SQL> create table tab_test_bak tablespace ts_test nologging as select * from tab_test;

Table created.

在建立完成表以后,要注意将表的属性重新变成logging:

SQL> select logging from tabs where table_name = 'TAB_TEST_BAK';

LOG
---
NO

SQL> alter table tab_test_bak logging;

Table altered.

CTAS的时候应该可以加PARALLEL参数的,或许会能提升点速度。如果表超大,则导成带分隔符的文本文件,用SQLLOAD,以DIRECT, PARALLEL 方式导入,我试过,这个速度是最快的。

如:

SQL> create table tab_test_bak parallel (n) nologging as select * from tab_test;

第二,就是利用CTAS方式来创建一张无数据新表:CREATE TABLE … AS SELECT .. WHERE 1=2; 然后使用 INSERT /*+ APPEND */ INTO .. SELECT …。最后将表名更改过来,建立一下新的索引,然后就可以了。

SQL> create table tab_test_bak2 tablespace ts_test nologging as select * from tab_test where 1=2;

Table created.

SQL> insert /* +append */ into tab_test_bak2 select * from tab_test;

12612000 rows created.

SQL> commit;

Commit complete.

SQL> drop table tab_test;

Table dropped.

SQL> rename tab_test_bak2 to tab_test;

Table renamed.

在force logging的情况下,sqlldr中的direct=y也是这起作用的。insert /*+ append */ 的时候如果采用并行的话,注意前面加上:alter session enable parallel dml;

第三,在原理上,它其实和第一种方式差不多,就是阻止数据库记录日志来加快速度,大概过程如下:

1、exp出原表(建议compress=n)
2、以nologging的方式,新建表结构和原表一样的空表
3、drop 原表,并rename新表为原表名
4、imp原表至空表中,注意要把ignore设置为y
5、更改新表的属性为logging

如:

D:\>exp 'sys/iamwangnc as sysdba' compress=n tables=tab_test file=d:\tab_test.dmp buffer=1024000

Export: Release 10.2.0.1.0 - Production on Sat Jun 7 20:30:09 2008

Copyright (c) 1982, 2005, Oracle. All rights reserved.


Connected to: Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
Export done in WE8ISO8859P1 character set and AL16UTF16 NCHAR character set
server uses AL32UTF8 character set (possible charset conversion)

About to export specified tables via Conventional Path ...
. . exporting table                       TAB_TEST      12612000 rows exported
Export terminated successfully without warnings.

D:\>

SQL> create table tab_test_bak3 tablespace ts_test nologging as select * from tab_test where 1=2;

Table created.

SQL> drop table tab_test;

Table dropped.

SQL> rename tab_test_bak3 to tab_test;

Table renamed.

D:\>imp 'sys/iamwangnc as sysdba' ignore=y tables=tab_test file=d:\tab_test.dmp buffer=1024000

Import: Release 10.2.0.1.0 - Production on Sat Jun 7 20:37:25 2008

Copyright (c) 1982, 2005, Oracle. All rights reserved.


Connected to: Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production

Export file created by EXPORT:V10.02.01 via conventional path
import done in WE8ISO8859P1 character set and AL16UTF16 NCHAR character set
import server uses AL32UTF8 character set (possible charset conversion)
. importing SYS's objects into SYS
. importing SYS's objects into SYS
. . importing table                     "TAB_TEST"      12612000 rows imported
Import terminated successfully without warnings.

D:\>

SQL> alter table tab_test logging;

Table altered.

做了测试,第三种方式远远快于前两种方式,大概是其10倍的速度。注意以上三种方式都是在数据库没有force logging的前提下完成的。

如 果是10g的话,可以考虑用一下expdp和impdp。我最开始听说10g下的data pump的时候,就无数次的听到这样的观点:“data pump是用专用的api来实现,目的就是为了在10g中提供快的多的数据导入与导出,导出性能比在9i的direct模式下提到10-15倍,导入性能 能提到5倍”。

第四,用批量绑定结合分布commit的方式写存储过程转移,这么做有个好处就是可以降低对现有系统的影响,并且可以实时的知道转移的进度。

分享到:
评论

相关推荐

    模拟动态分区存储管理中地址转换

    1. **空闲分区表维护**:系统维护一张空闲分区表,记录了所有未被分配的内存块的信息,包括起始地址、大小和状态等。当进程请求内存时,系统会在这张表中寻找合适的分区进行分配。 2. **内存分配**:根据进程的需求...

    guiliVideo.zip谷粒影音项目视频表、用户表

    同时,如此大规模的数据量也意味着我们需要高效的数据存储和查询工具,Hive便能满足这一需求。 Video表则是谷粒影音项目的核心,涵盖了多张表,每张表大约有几百条数据。这些数据可能涉及视频的ID、标题、时长、...

    大数据分析的案例、方法与挑战

    在案例中,数据表使用时间分区设计,最初采用按小时分区的方式,但随着数据量的增长,不得不调整为更细粒度的15分钟分区。物理存储上采用了自动化存储管理(ASM),甚至在极端情况下,每分钟就需要切换一个分区。为了...

    mysql批量清空表工具shell

    这对于那些需要定期清理测试数据或者处理大数据量的环境来说非常有用,可以显著提高工作效率。 2. **安全警告**: 需要注意的是,"只是把数据清空了,未做自增重置"意味着工具不会修改任何表的自动增长ID。这意味...

    商城数据库最终表88张

    "商城数据库最终表88张"这个标题暗示了一个大型的电子商务系统,其数据库结构已经经过了多次迭代和优化,最终稳定在88个表格,每个表格可能对应着系统中的不同业务模块或数据类型。 数据库的设计通常遵循一些基本...

    三级联动数据库

    在IT领域,数据库设计是构建高效、稳定应用的基础。这里我们关注的是"三级联动数据库"的概念,这通常指的是在一个系统中,数据按照省...此外,对于大数据量的场景,可能需要引入更复杂的分区、分表策略来提高查询效率。

    山东大学 17 or 18 年 大数据期末考试题

    - **视图**: 视图不存储数据,而是指向一张或多张表的查询结果。 ### 朴素贝叶斯分类法的应用 朴素贝叶斯分类法是一种简单的概率分类方法,假设特征之间相互独立。 #### 训练数据 ``` Id Age Income Student Buys...

    SQL数据库设计实例.doc

    2. 分区策略:根据时间或其他属性对数据进行分区,以便于并行处理和减少单个查询的数据量。 3. 缓存策略:使用缓存(如Redis)来存储热门或近期的帖子和用户信息,减少数据库的读取压力。 4. 数据库优化:选择适合的...

    Hive - A Warehousing Solution Over a Map-Reduce.pdf

    面对如此庞大的数据量,传统的数据仓库解决方案因成本过高而难以满足需求。为了解决这一问题,Hadoop作为一种开源的Map-Reduce实现框架被广泛应用于存储与处理大规模数据集。然而,Map-Reduce编程模型本身较为底层,...

    数据库操作语句大全(sql)

    因为这样可以避免 top的字段如果是逻辑索引的,查询的结果后实际表中的不一致(逻辑索引中的数据有可能和数据表中的不一致,而查询时如果处在索引则首先查询索引) 14、说明:前10条记录 select top 10 * form ...

    mySQL 延迟 查询主表

    在处理大数据量的关联时,延迟加载关联数据能显著减少一次性加载大量数据的压力,提高应用的响应速度。 深入理解MySQL主从复制延迟问题,不仅需要了解复制的工作原理,还要熟悉MySQL的各种复制选项和配置,如半同步...

    经典SQL语句大全

    因为这样可以避免 top的字段如果是逻辑索引的,查询的结果后实际表中的不一致(逻辑索引中的数据有可能和数据表中的不一致,而查询时如果处在索引则首先查询索引) 14、说明:前10条记录 select top 10 * form table...

    python入门到高级全栈工程师培训 第3期 附课件代码

    04 ORM多表操作之一对多查询之双下划线查询 05 ORM多表操作之多对多添加记录 06 ORM多表操作之多对多查询 07 ORM多表操作之F查询与Q查询 08 ORM的querySet集合对象的特性 第53章 01 admin介绍 02 alex首秀失败 03 ...

Global site tag (gtag.js) - Google Analytics