我用了ADO进行操作,但是对记录集操作的时候,发现将30万条记录放入结构数组中需要消耗7-10分钟的时间。
能有办法进行优化吗?将数据取出并且保存到结构数组中的消耗时间在1分钟左右呢??
请各位大哥们指点下!
23 个解决方案
#1
为什么非要放到结构数组中呢?想点变通的方法
#2
你是什么数据库。。用到多线程了么
#3
问题是:是本地还是远程?
分析出速度瓶颈,再对症下药
30万条数据的读取,问题不在记录的条数,而是数据的字节大小
如果是普通的记录,读取时间应该在一分钟之类属正常
如果是“基本信息”,可以把数据保存为本地文件,需要时检查更新标记,没有更新的话就从本地文件读取
分析出速度瓶颈,再对症下药
30万条数据的读取,问题不在记录的条数,而是数据的字节大小
如果是普通的记录,读取时间应该在一分钟之类属正常
如果是“基本信息”,可以把数据保存为本地文件,需要时检查更新标记,没有更新的话就从本地文件读取
#4
是通过网络访问数据库吗??这个会比访问本地数据库慢。。另外,一定30万条记录都要过来吗?要不可以先在服务器端过滤一下,再传到这边来。。
#5
时间很难提高,不过可以放到后台处理(多线程)..........效果可能会好些.......
#6
需要的时候直接取哪条记录不行吗?
#7
30w条记录一下子出来肯定是慢了
而且,你查询的时候,通过ado把数据库里的记录集保存到你的recordset我估计都需要很长的时间了
这还不是查询的时候慢,查询慢还能通过优化sql语句来解决这个问题
我比较同意6楼的意见
另外三十万条全部存到结构体里??你不怕内存耗太多?
而且,你查询的时候,通过ado把数据库里的记录集保存到你的recordset我估计都需要很长的时间了
这还不是查询的时候慢,查询慢还能通过优化sql语句来解决这个问题
我比较同意6楼的意见
另外三十万条全部存到结构体里??你不怕内存耗太多?
#8
先回答楼上各位高手的问题,再把你的代码贴出来
优化可能是有的,但是如果缩短到1分钟,还比较困难
优化可能是有的,但是如果缩短到1分钟,还比较困难
#9
pcwe2002: 设计如此!
VsirSoft: SQL 2005 单线程
scq2099yt: 因为不能时时去操作数据库,所以就不能时时去取数据.
handsomerun 和 shakaqrj:因为白天有时候不能上网,所以晚上在给大家贴代码!
谢谢各位!
还真心希望能找到好的方法!
VsirSoft: SQL 2005 单线程
scq2099yt: 因为不能时时去操作数据库,所以就不能时时去取数据.
handsomerun 和 shakaqrj:因为白天有时候不能上网,所以晚上在给大家贴代码!
谢谢各位!
还真心希望能找到好的方法!
#10
付:内存消耗可以先不考虑!
#11
我还是想不明白为什么不能在需要的时候去访问数据库呢~
你在数据库中读一条记录,比你访问数组中的一组数据虽然慢几倍~
问题是用户察觉不出来~那几十毫秒的问题可以忽略啊~
再说了,如果你把那30万条的数据都读到你的程序里,万一数据库被更新了怎么办呢~
你在数据库中读一条记录,比你访问数组中的一组数据虽然慢几倍~
问题是用户察觉不出来~那几十毫秒的问题可以忽略啊~
再说了,如果你把那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();
}
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: 数据库是在别的电脑上.本地没有数据库.
时间的消耗基本是取数据上消耗了.
shakaqrj: 数据库是在别的电脑上.本地没有数据库.
#19
自己判断一下你那长哒7-10分钟的时间都耗在哪了??
#20
up
#21
为什么要放到数组中去?既然记录集已经取到了,如果你只是为了在List上显示的话,你可以用虚表的方式,显示哪行哪列时才从记录集中提取相应的数据就行了.
#22
jason_wentzel :不是MFC编程.取到的数据只能后台处理.
tabby: 是后面的循环取数据比较忙.将SQL语句修改了下.不取几个表的所有信息,将自己需要的信息取出即可.但是时间只减少了1分多钟.还是比较慢!
各位大哥:对于数据集向结构数组进行保存数据,有什么办法可以优化!提高效率!
由于白天公司不是很好上网!希望各位给出好的思维方法!谢谢了!
tabby: 是后面的循环取数据比较忙.将SQL语句修改了下.不取几个表的所有信息,将自己需要的信息取出即可.但是时间只减少了1分多钟.还是比较慢!
各位大哥:对于数据集向结构数组进行保存数据,有什么办法可以优化!提高效率!
由于白天公司不是很好上网!希望各位给出好的思维方法!谢谢了!
#23
即便是后台处理,直接用记录集不行吗?
为什么一定要保存如数组??
你用stl容器好了,或许快一点
为什么一定要保存如数组??
你用stl容器好了,或许快一点
#1
为什么非要放到结构数组中呢?想点变通的方法
#2
你是什么数据库。。用到多线程了么
#3
问题是:是本地还是远程?
分析出速度瓶颈,再对症下药
30万条数据的读取,问题不在记录的条数,而是数据的字节大小
如果是普通的记录,读取时间应该在一分钟之类属正常
如果是“基本信息”,可以把数据保存为本地文件,需要时检查更新标记,没有更新的话就从本地文件读取
分析出速度瓶颈,再对症下药
30万条数据的读取,问题不在记录的条数,而是数据的字节大小
如果是普通的记录,读取时间应该在一分钟之类属正常
如果是“基本信息”,可以把数据保存为本地文件,需要时检查更新标记,没有更新的话就从本地文件读取
#4
是通过网络访问数据库吗??这个会比访问本地数据库慢。。另外,一定30万条记录都要过来吗?要不可以先在服务器端过滤一下,再传到这边来。。
#5
时间很难提高,不过可以放到后台处理(多线程)..........效果可能会好些.......
#6
需要的时候直接取哪条记录不行吗?
#7
30w条记录一下子出来肯定是慢了
而且,你查询的时候,通过ado把数据库里的记录集保存到你的recordset我估计都需要很长的时间了
这还不是查询的时候慢,查询慢还能通过优化sql语句来解决这个问题
我比较同意6楼的意见
另外三十万条全部存到结构体里??你不怕内存耗太多?
而且,你查询的时候,通过ado把数据库里的记录集保存到你的recordset我估计都需要很长的时间了
这还不是查询的时候慢,查询慢还能通过优化sql语句来解决这个问题
我比较同意6楼的意见
另外三十万条全部存到结构体里??你不怕内存耗太多?
#8
先回答楼上各位高手的问题,再把你的代码贴出来
优化可能是有的,但是如果缩短到1分钟,还比较困难
优化可能是有的,但是如果缩短到1分钟,还比较困难
#9
pcwe2002: 设计如此!
VsirSoft: SQL 2005 单线程
scq2099yt: 因为不能时时去操作数据库,所以就不能时时去取数据.
handsomerun 和 shakaqrj:因为白天有时候不能上网,所以晚上在给大家贴代码!
谢谢各位!
还真心希望能找到好的方法!
VsirSoft: SQL 2005 单线程
scq2099yt: 因为不能时时去操作数据库,所以就不能时时去取数据.
handsomerun 和 shakaqrj:因为白天有时候不能上网,所以晚上在给大家贴代码!
谢谢各位!
还真心希望能找到好的方法!
#10
付:内存消耗可以先不考虑!
#11
我还是想不明白为什么不能在需要的时候去访问数据库呢~
你在数据库中读一条记录,比你访问数组中的一组数据虽然慢几倍~
问题是用户察觉不出来~那几十毫秒的问题可以忽略啊~
再说了,如果你把那30万条的数据都读到你的程序里,万一数据库被更新了怎么办呢~
你在数据库中读一条记录,比你访问数组中的一组数据虽然慢几倍~
问题是用户察觉不出来~那几十毫秒的问题可以忽略啊~
再说了,如果你把那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();
}
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: 数据库是在别的电脑上.本地没有数据库.
时间的消耗基本是取数据上消耗了.
shakaqrj: 数据库是在别的电脑上.本地没有数据库.
#19
自己判断一下你那长哒7-10分钟的时间都耗在哪了??
#20
up
#21
为什么要放到数组中去?既然记录集已经取到了,如果你只是为了在List上显示的话,你可以用虚表的方式,显示哪行哪列时才从记录集中提取相应的数据就行了.
#22
jason_wentzel :不是MFC编程.取到的数据只能后台处理.
tabby: 是后面的循环取数据比较忙.将SQL语句修改了下.不取几个表的所有信息,将自己需要的信息取出即可.但是时间只减少了1分多钟.还是比较慢!
各位大哥:对于数据集向结构数组进行保存数据,有什么办法可以优化!提高效率!
由于白天公司不是很好上网!希望各位给出好的思维方法!谢谢了!
tabby: 是后面的循环取数据比较忙.将SQL语句修改了下.不取几个表的所有信息,将自己需要的信息取出即可.但是时间只减少了1分多钟.还是比较慢!
各位大哥:对于数据集向结构数组进行保存数据,有什么办法可以优化!提高效率!
由于白天公司不是很好上网!希望各位给出好的思维方法!谢谢了!
#23
即便是后台处理,直接用记录集不行吗?
为什么一定要保存如数组??
你用stl容器好了,或许快一点
为什么一定要保存如数组??
你用stl容器好了,或许快一点