怎么解决关于数据库insert问题

发布时间:2021-11-04 09:27:08 作者:iii
来源:亿速云 阅读:199

本篇内容主要讲解“怎么解决关于数据库insert问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决关于数据库insert问题”吧!

早上对几个10几G,上亿的大表进行分区改造,一切都正常。到中午吃饭前对一个10万数据的小表进行插入时出问题了,很简单的插入语句,跑了1个小时没跑完。

插入语句如下,由于保密缘故,相关信息已做修改:

insert into SGS.PROD_NEW
  select *
    from SGS.PROD
   where CREATE_TIME >= to_date('2019-01-01', 'yyyy-mm-dd')
     and CREATE_TIME < to_date('2020-07-01', 'yyyy-mm-dd');

这张表大概10万行数据,没有主键,没有索引。

set linesize 200;
col owner for a20;
col table_name for a40;
col tablespace_name for a20;
select owner, table_name, num_rows,TABLESPACE_NAME
  from dba_tables
 where table_name = 'PROD';
 
OWNER                TABLE_NAME                                 NUM_ROWS TABLESPACE_NAME
-------------------- ---------------------------------------- ---------- --------------------
SGS                  PROD                                     107220      GC_TS

表的大小60M左右:

SQL> select bytes/1024/1024 MB from dba_segments where segment_name='PROD';
        MB
----------
        59

第一次表插入时,跑了1个小时没跑完,看了下等待事件,一直都是direct path read,也没有阻塞,为什么那么慢,看了下执行计划是走的全表扫描,执行计划没有问题:

------------------------------------------------------------------------------------------------------
| Id  | Operation                | Name                      | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------------
|   0 | INSERT STATEMENT         |                           |       |       |  2027 (100)|          |
|   1 |  LOAD TABLE CONVENTIONAL | PRODNEW                   |       |       |            |          |
|*  2 |   TABLE ACCESS FULL      | PROD                      |   106K|    67M|  2027   (1)| 00:00:01 |
------------------------------------------------------------------------------------------------------

干脆停掉,开并行跑。开了16个并行跑插入,跑了半个小时还是卡在那,同样的等待事件。百思不得其解,想到了是不是统计信息过期了,但是这个表没有索引,统计信息过不过期都是走全表扫描。想到了buffer cache太小,但是我前面上亿的数据也能插进去,按理说不可能。想到了是不是temp表空间太小的缘故,查了下,32G,使用率0.01%。

浑水摸鱼1个小时后,想到了有没可能是大字段导致的呢?查了下,果然,MMP,有一个CLOB类型字段100G的大小。

SQL> select bytes/1024/1024/1024 GB from dba_segments where segment_name in (select segment_name from dba_lobs where table_name='PROD');  
        GB
----------
.000061035
104.680664

最后的解决办法:

开16并行,将时间段拆分为1个月一个月插。最后有点注意的是,表空间要足够大。

到此,相信大家对“怎么解决关于数据库insert问题”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

推荐阅读:
  1. 聊聊关于数据库表记录删除都有哪些解决方式
  2. 解决mongodb中insert出错的方法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

数据库

上一篇:网站访问速度可做哪些优化

下一篇:oracle中对于复杂的SQL语句怎么进行优化

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》