怎么解决关于数据库insert问题
本篇内容主要讲解“怎么解决关于数据库insert问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决关于数据库insert问题”吧!
早上对几个10几G,上亿的大表进行分区改造,一切都正常。到中午吃饭前对一个10万数据的小表进行插入时出问题了,很简单的插入语句,跑了1个小时没跑完。
插入语句如下,由于保密缘故,相关信息已做修改:
insertintoSGS.PROD_NEWselect*fromSGS.PRODwhereCREATE_TIME>=to_date('2019-01-01','yyyy-mm-dd')andCREATE_TIME<to_date('2020-07-01','yyyy-mm-dd');
这张表大概10万行数据,没有主键,没有索引。
setlinesize200;colownerfora20;coltable_namefora40;coltablespace_namefora20;selectowner,table_name,num_rows,TABLESPACE_NAMEfromdba_tableswheretable_name='PROD';OWNERTABLE_NAMENUM_ROWSTABLESPACE_NAME------------------------------------------------------------------------------------------SGSPROD107220GC_TS
表的大小60M左右:
SQL>selectbytes/1024/1024MBfromdba_segmentswheresegment_name='PROD';MB----------59
第一次表插入时,跑了1个小时没跑完,看了下等待事件,一直都是direct path read,也没有阻塞,为什么那么慢,看了下执行计划是走的全表扫描,执行计划没有问题:
------------------------------------------------------------------------------------------------------|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|Time|------------------------------------------------------------------------------------------------------|0|INSERTSTATEMENT||||2027(100)|||1|LOADTABLECONVENTIONAL|PRODNEW||||||*2|TABLEACCESSFULL|PROD|106K|67M|2027(1)|00:00:01|------------------------------------------------------------------------------------------------------
干脆停掉,开并行跑。开了16个并行跑插入,跑了半个小时还是卡在那,同样的等待事件。百思不得其解,想到了是不是统计信息过期了,但是这个表没有索引,统计信息过不过期都是走全表扫描。想到了buffer cache太小,但是我前面上亿的数据也能插进去,按理说不可能。想到了是不是temp表空间太小的缘故,查了下,32G,使用率0.01%。
浑水摸鱼1个小时后,想到了有没可能是大字段导致的呢?查了下,果然,MMP,有一个CLOB类型字段100G的大小。
SQL>selectbytes/1024/1024/1024GBfromdba_segmentswheresegment_namein(selectsegment_namefromdba_lobswheretable_name='PROD');GB----------.000061035104.680664
最后的解决办法:
开16并行,将时间段拆分为1个月一个月插。最后有点注意的是,表空间要足够大。
到此,相信大家对“怎么解决关于数据库insert问题”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。