请教,往数据库中插入记录某张表速度很慢,而且越来越慢是何原因

时间:2022-02-07 21:46:44
请教,往数据库中插入记录某张表速度很慢,而且越来越慢是何原因?代码我检查过,很简单,应该不会出现什么内存泄露什么的问题。

17 个解决方案

#1


你所插入数据的那张表,是否索引过多?
如果数据量很大又有过多的索引很慢
大数据量可以把表按没个字段或几个字段分区

#2


最后一句话什么意思可否说的具体点。数据量也就10W条左右吧。要插入的这个表有一个主键还有一个unique。另外,我是从一个数据库导入到另一个数据库的,在代码中是先将记录取出放到记录集中的。我想是不是如果按分页的方法,一部分一部分的分批次取到记录集中,分批地导入到目的表中,这样会改善点。但是我感觉这个数据量也不大啊。代码部分看起也不大有问题的感觉

#3


要插入的这张表的各个表很多外键是互相关联的,我插入的时候由于一些表没有数据,仅仅是插了这张表,某些外键主键是用临时的数来填充的(当然这些数都是唯一的,记录是可以插入的),是不是这些表之间的关联会导致速度越来越慢。期待高手空降中。。。。

#4


另外,我用360的流量监控软件打开发现一个现象
程序名称   上传速度   下载速度
TNSLSNR    23K/S      8.4M/S
我的程序   8.4M/S     23k/S

这个流量速度正常不正常

#5


你通过这个SQL监控下该session占用的内存是不是超过了200MB
select * FROM v$sesstat a,v$statname b WHERE a.statistic#=b.statistic# AND NAME LIKE '%mem%' and sid=<sid>

然后检查v$sort_usage表看该session是不是使用到了临时段来存储中间数据。

如果都查出结果的话,表明那条SQL已经占用太多内存,所以改用磁盘空间来读写,速度将会变慢,这时可以考虑调整_pga_max_size参数或优化sql

#6


能否具体些楼上的,ORACLE不是太熟。另外,SID如何获取

#7


sid的定位不太容易讲清楚,你可以试着在那条SQL运行的时候执行下面语句,在得出的结果集里找一下:
select a.sid,a.sql_id,b.sql_text FROM v$session a,v$sqlarea b WHERE a.sql_id=b.sql_id


当然,更粗暴的办法是啥都不管,直接执行 alter system set "_pga_max_size"=400M,然后再运行SQL看速度有没有提高

#8


把你的代码扔了,改用db_link导入数据

或者直接用impdp/expdp

#9


我在PLSQL中的SESSION中看到了这个SESSION,ID好像是138,用你第一个SQL执行看了下,结果如下
1 138 20 301852 20 session uga memory 1 1856888586
2 138 21 301852 21 session uga memory max 1 3840343119
3 138 25 640728 25 session pga memory 1 4148600571
4 138 26 5359320 26 session pga memory max 1 507777907
5 138 164 0 164 redo k-bytes read (memory) 2 399143205
6 138 166 0 166 redo k-bytes read (memory) by LNS 2 3857180019
7 138 439 0 439 workarea memory allocated 64 2433935387
8 138 462 10 462 sorts (memory) 64 2091983730

#10


分批提交,不要等10W都查完了再提交,好比1000条提交一次

#11


alter system set "_pga_max_size"=1024M

我刚才执行了这个语句,貌似效果不大。

我现在在改用分页的方法来试验下。

#12


把sql弄出来帮你分析分析

#13


从oracle到oracle导入,还是数据泵吧。

#14


分批提交,试试看

#15


上代码,才知道

#16


分批提交了,效果好了很多。

#17


一次提交那么多,肯定有问题!

#1


你所插入数据的那张表,是否索引过多?
如果数据量很大又有过多的索引很慢
大数据量可以把表按没个字段或几个字段分区

#2


最后一句话什么意思可否说的具体点。数据量也就10W条左右吧。要插入的这个表有一个主键还有一个unique。另外,我是从一个数据库导入到另一个数据库的,在代码中是先将记录取出放到记录集中的。我想是不是如果按分页的方法,一部分一部分的分批次取到记录集中,分批地导入到目的表中,这样会改善点。但是我感觉这个数据量也不大啊。代码部分看起也不大有问题的感觉

#3


要插入的这张表的各个表很多外键是互相关联的,我插入的时候由于一些表没有数据,仅仅是插了这张表,某些外键主键是用临时的数来填充的(当然这些数都是唯一的,记录是可以插入的),是不是这些表之间的关联会导致速度越来越慢。期待高手空降中。。。。

#4


另外,我用360的流量监控软件打开发现一个现象
程序名称   上传速度   下载速度
TNSLSNR    23K/S      8.4M/S
我的程序   8.4M/S     23k/S

这个流量速度正常不正常

#5


你通过这个SQL监控下该session占用的内存是不是超过了200MB
select * FROM v$sesstat a,v$statname b WHERE a.statistic#=b.statistic# AND NAME LIKE '%mem%' and sid=<sid>

然后检查v$sort_usage表看该session是不是使用到了临时段来存储中间数据。

如果都查出结果的话,表明那条SQL已经占用太多内存,所以改用磁盘空间来读写,速度将会变慢,这时可以考虑调整_pga_max_size参数或优化sql

#6


能否具体些楼上的,ORACLE不是太熟。另外,SID如何获取

#7


sid的定位不太容易讲清楚,你可以试着在那条SQL运行的时候执行下面语句,在得出的结果集里找一下:
select a.sid,a.sql_id,b.sql_text FROM v$session a,v$sqlarea b WHERE a.sql_id=b.sql_id


当然,更粗暴的办法是啥都不管,直接执行 alter system set "_pga_max_size"=400M,然后再运行SQL看速度有没有提高

#8


把你的代码扔了,改用db_link导入数据

或者直接用impdp/expdp

#9


我在PLSQL中的SESSION中看到了这个SESSION,ID好像是138,用你第一个SQL执行看了下,结果如下
1 138 20 301852 20 session uga memory 1 1856888586
2 138 21 301852 21 session uga memory max 1 3840343119
3 138 25 640728 25 session pga memory 1 4148600571
4 138 26 5359320 26 session pga memory max 1 507777907
5 138 164 0 164 redo k-bytes read (memory) 2 399143205
6 138 166 0 166 redo k-bytes read (memory) by LNS 2 3857180019
7 138 439 0 439 workarea memory allocated 64 2433935387
8 138 462 10 462 sorts (memory) 64 2091983730

#10


分批提交,不要等10W都查完了再提交,好比1000条提交一次

#11


alter system set "_pga_max_size"=1024M

我刚才执行了这个语句,貌似效果不大。

我现在在改用分页的方法来试验下。

#12


把sql弄出来帮你分析分析

#13


从oracle到oracle导入,还是数据泵吧。

#14


分批提交,试试看

#15


上代码,才知道

#16


分批提交了,效果好了很多。

#17


一次提交那么多,肯定有问题!