30万条数据的记录集该如何处理???

时间:2022-07-16 23:21:26
基本信息表内有30万条不同的记录,现在需要将这30万条记录查询出来,并且保存到结构数组中。
我用了ADO进行操作,但是对记录集操作的时候,发现将30万条记录放入结构数组中需要消耗7-10分钟的时间。
能有办法进行优化吗?将数据取出并且保存到结构数组中的消耗时间在1分钟左右呢??
请各位大哥们指点下!

23 个解决方案

#1


为什么非要放到结构数组中呢?想点变通的方法

#2


你是什么数据库。。用到多线程了么

#3


问题是:是本地还是远程?
分析出速度瓶颈,再对症下药
30万条数据的读取,问题不在记录的条数,而是数据的字节大小
如果是普通的记录,读取时间应该在一分钟之类属正常

如果是“基本信息”,可以把数据保存为本地文件,需要时检查更新标记,没有更新的话就从本地文件读取

#4


是通过网络访问数据库吗??这个会比访问本地数据库慢。。另外,一定30万条记录都要过来吗?要不可以先在服务器端过滤一下,再传到这边来。。

#5


时间很难提高,不过可以放到后台处理(多线程)..........效果可能会好些.......

#6


需要的时候直接取哪条记录不行吗?

#7


30w条记录一下子出来肯定是慢了

而且,你查询的时候,通过ado把数据库里的记录集保存到你的recordset我估计都需要很长的时间了

这还不是查询的时候慢,查询慢还能通过优化sql语句来解决这个问题

我比较同意6楼的意见

另外三十万条全部存到结构体里??你不怕内存耗太多?

#8


先回答楼上各位高手的问题,再把你的代码贴出来
优化可能是有的,但是如果缩短到1分钟,还比较困难

#9


pcwe2002: 设计如此!
VsirSoft: SQL 2005 单线程
scq2099yt: 因为不能时时去操作数据库,所以就不能时时去取数据.
handsomerun 和 shakaqrj:因为白天有时候不能上网,所以晚上在给大家贴代码!

谢谢各位!
还真心希望能找到好的方法!

#10


付:内存消耗可以先不考虑!

#11


我还是想不明白为什么不能在需要的时候去访问数据库呢~

你在数据库中读一条记录,比你访问数组中的一组数据虽然慢几倍~
问题是用户察觉不出来~那几十毫秒的问题可以忽略啊~

再说了,如果你把那30万条的数据都读到你的程序里,万一数据库被更新了怎么办呢~

#12


为什么要一次处理呢
不能分开处理嘛?

#13


我的SQL语句如下:
str_sql.Format(_T("select a.*,b.*,b.type as DECType ")
_T(" from DECName a left join DEC b ")
_T(" on a.decname=b.decname left join VTServer c ")
_T(" on a.VTServerName=c.name where c.ip='%s'"),str_DECIP);

m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)str_sql);

//统计查找出来的数据
g_DvrNum = m_pRecordset->GetRecordCount();

//ADO读取所有数据
while(!m_pRecordset->GetEndOfFile())
{
             //将信息放入结构数组中
              ....
              ....
            m_pRecordset->MoveNext();
         }

#14


dch4890164 : 分开处理,这么弄!能举例吗?或者操作上面说详细点! 谢谢!!

#15


Sandrer:因为基本信息是别人的系统数据,不会经常变的。我的程序中会每小时做一次数据对比,将新的数据在次放入结构数组中。为什么我不能时时访问30W数据呢,因为基本是每2秒就要对一条数据操作一次。所以放入内存中比较好,可以减少对数据库的操作。否则30W条数据,那对数据库来说是很大压力的,也有可能被死锁。

#16



m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)str_sql); 


这句话用了多少时间,

这句话前后你可以加trace,把时间记录下来,
你可以把跑之前的的时间记录一下,把跑完之后的时间记一下,然后看看花了多少时间

这是一部分,如果这个不是很长的话,那么就是

下面那个循环花的时间长了,代码应该没问题,你的数据实在太多了,跑个1x分钟不夸张

#17


数据库是在别的电脑上吗?
你不如干脆导入到本地上好了
但还是尽量不要存在数组里
两秒钟一次操作,我想数据库访问速度应该够了

#18


handsomerun: m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)str_sql); 需要消耗4秒左右.
           时间的消耗基本是取数据上消耗了.
shakaqrj: 数据库是在别的电脑上.本地没有数据库.

#19


引用 18 楼 tiantianxuexi_vc 的回复:
handsomerun: m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)str_sql); 需要消耗4秒左右. 
          时间的消耗基本是取数据上消耗了. 
shakaqrj: 数据库是在别的电脑上.本地没有数据库.


自己判断一下你那长哒7-10分钟的时间都耗在哪了??

#20


up

#21


为什么要放到数组中去?既然记录集已经取到了,如果你只是为了在List上显示的话,你可以用虚表的方式,显示哪行哪列时才从记录集中提取相应的数据就行了.

#22


jason_wentzel :不是MFC编程.取到的数据只能后台处理.

tabby: 是后面的循环取数据比较忙.将SQL语句修改了下.不取几个表的所有信息,将自己需要的信息取出即可.但是时间只减少了1分多钟.还是比较慢!

各位大哥:对于数据集向结构数组进行保存数据,有什么办法可以优化!提高效率!

由于白天公司不是很好上网!希望各位给出好的思维方法!谢谢了!

#23


即便是后台处理,直接用记录集不行吗?
为什么一定要保存如数组??
你用stl容器好了,或许快一点

#1


为什么非要放到结构数组中呢?想点变通的方法

#2


你是什么数据库。。用到多线程了么

#3


问题是:是本地还是远程?
分析出速度瓶颈,再对症下药
30万条数据的读取,问题不在记录的条数,而是数据的字节大小
如果是普通的记录,读取时间应该在一分钟之类属正常

如果是“基本信息”,可以把数据保存为本地文件,需要时检查更新标记,没有更新的话就从本地文件读取

#4


是通过网络访问数据库吗??这个会比访问本地数据库慢。。另外,一定30万条记录都要过来吗?要不可以先在服务器端过滤一下,再传到这边来。。

#5


时间很难提高,不过可以放到后台处理(多线程)..........效果可能会好些.......

#6


需要的时候直接取哪条记录不行吗?

#7


30w条记录一下子出来肯定是慢了

而且,你查询的时候,通过ado把数据库里的记录集保存到你的recordset我估计都需要很长的时间了

这还不是查询的时候慢,查询慢还能通过优化sql语句来解决这个问题

我比较同意6楼的意见

另外三十万条全部存到结构体里??你不怕内存耗太多?

#8


先回答楼上各位高手的问题,再把你的代码贴出来
优化可能是有的,但是如果缩短到1分钟,还比较困难

#9


pcwe2002: 设计如此!
VsirSoft: SQL 2005 单线程
scq2099yt: 因为不能时时去操作数据库,所以就不能时时去取数据.
handsomerun 和 shakaqrj:因为白天有时候不能上网,所以晚上在给大家贴代码!

谢谢各位!
还真心希望能找到好的方法!

#10


付:内存消耗可以先不考虑!

#11


我还是想不明白为什么不能在需要的时候去访问数据库呢~

你在数据库中读一条记录,比你访问数组中的一组数据虽然慢几倍~
问题是用户察觉不出来~那几十毫秒的问题可以忽略啊~

再说了,如果你把那30万条的数据都读到你的程序里,万一数据库被更新了怎么办呢~

#12


为什么要一次处理呢
不能分开处理嘛?

#13


我的SQL语句如下:
str_sql.Format(_T("select a.*,b.*,b.type as DECType ")
_T(" from DECName a left join DEC b ")
_T(" on a.decname=b.decname left join VTServer c ")
_T(" on a.VTServerName=c.name where c.ip='%s'"),str_DECIP);

m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)str_sql);

//统计查找出来的数据
g_DvrNum = m_pRecordset->GetRecordCount();

//ADO读取所有数据
while(!m_pRecordset->GetEndOfFile())
{
             //将信息放入结构数组中
              ....
              ....
            m_pRecordset->MoveNext();
         }

#14


dch4890164 : 分开处理,这么弄!能举例吗?或者操作上面说详细点! 谢谢!!

#15


Sandrer:因为基本信息是别人的系统数据,不会经常变的。我的程序中会每小时做一次数据对比,将新的数据在次放入结构数组中。为什么我不能时时访问30W数据呢,因为基本是每2秒就要对一条数据操作一次。所以放入内存中比较好,可以减少对数据库的操作。否则30W条数据,那对数据库来说是很大压力的,也有可能被死锁。

#16



m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)str_sql); 


这句话用了多少时间,

这句话前后你可以加trace,把时间记录下来,
你可以把跑之前的的时间记录一下,把跑完之后的时间记一下,然后看看花了多少时间

这是一部分,如果这个不是很长的话,那么就是

下面那个循环花的时间长了,代码应该没问题,你的数据实在太多了,跑个1x分钟不夸张

#17


数据库是在别的电脑上吗?
你不如干脆导入到本地上好了
但还是尽量不要存在数组里
两秒钟一次操作,我想数据库访问速度应该够了

#18


handsomerun: m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)str_sql); 需要消耗4秒左右.
           时间的消耗基本是取数据上消耗了.
shakaqrj: 数据库是在别的电脑上.本地没有数据库.

#19


引用 18 楼 tiantianxuexi_vc 的回复:
handsomerun: m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)str_sql); 需要消耗4秒左右. 
          时间的消耗基本是取数据上消耗了. 
shakaqrj: 数据库是在别的电脑上.本地没有数据库.


自己判断一下你那长哒7-10分钟的时间都耗在哪了??

#20


up

#21


为什么要放到数组中去?既然记录集已经取到了,如果你只是为了在List上显示的话,你可以用虚表的方式,显示哪行哪列时才从记录集中提取相应的数据就行了.

#22


jason_wentzel :不是MFC编程.取到的数据只能后台处理.

tabby: 是后面的循环取数据比较忙.将SQL语句修改了下.不取几个表的所有信息,将自己需要的信息取出即可.但是时间只减少了1分多钟.还是比较慢!

各位大哥:对于数据集向结构数组进行保存数据,有什么办法可以优化!提高效率!

由于白天公司不是很好上网!希望各位给出好的思维方法!谢谢了!

#23


即便是后台处理,直接用记录集不行吗?
为什么一定要保存如数组??
你用stl容器好了,或许快一点