急救!数据库高手,VB高手请进

susanlong 2001-11-13 08:10:32
现有一工业监控系统,上位机使用VB+ADO开发,数据库使用ACCESS.采集的数据存入数据库对应的表中.该系统数据量极大,经测试在一般数据量情况下存入一个月的数据,MDB数据库文件达到了1.8G,最大数据量可达4.5G.数据库已经过认真分析优化,已最大限度的减少了数据冗余.由于要对数据库表中的数据进行分析,所以在用SELECT语句进行筛选时,速度十分慢.(在某表一个月的记录(大概2340000条)中筛选,得到的结果大概有1000多条,时间要35秒)在筛选进行时如同死机一般,无法进行其他操作.

VB程序使用ADO对象编程实现,在数据量稍小时一切正常

如何才能使筛选过程时间变短!
或者是否能是筛选过程分段进行,比如首先显示一部分,然后点击绑定RecordSet的MSHFLEXGRID的滚动条,再选出下一部分并显示出来.但我不知道如何实现.

这一问题已使目前项目停滞不前,无从下手,望各位高手赐教!万分感谢

另:由于数据库需要备份,而同时该系统又要进行实时数据采集(该系统一般24小时运行,每2秒就有数据发送到上位机),不知如何才能即不影响数据采集,同时又能实现备份.而且好象ADO中没有数据库备份和压缩的方法.
...全文
789 点赞 收藏 28
写回复
28 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
baoxiang 2001-11-26
你的ADO连接把初始化的句子。

adodc1.connectionstring=""
adodc1.recordsource=""
这些放在程序里初始化。
不要在控件里初始化。
回复
susanlong 2001-11-26
我现在换数据库了,但速度还是很慢!
我想作成像SQLSERVER7.0那样,选出来后只显示少量数据,每点击滚动条滚动之后再显示一些.
谁能教教我!
回复
81083 2001-11-16
建议用SQL SERVER
回复
susanlong 2001-11-16
还请各位给我介绍几本好书?谢谢
回复
susanlong 2001-11-16
我改数据库,但不知道是用SQLSERVER2000好还是7.0好?我的开发平台是WIN98
回复
estrella 2001-11-15
用双数据库的方法,
设立一个结构一模一样的ACCESS数据库,里面的记录为空.
用代码将需要分析的部分数据转移到新数据库里,然后对新的部分进行分析.
回复
zzzwww 2001-11-15
将数据筛选过程做成一个查询储存在数据库中,在数据采集的同时实时进行筛选。
该查询本身就可看作一个表。
回复
cgb_prince 2001-11-15
用异步
回复
susanlong 2001-11-15
不知道,那位老兄在SQLSERVER中面对过如此大的数据量,我担心SQLSERVER仍不能胜任。
另外,我想请教一下如何实现分页功能。望各位帮忙!谢谢!
回复
lihonggen0 2001-11-14
建议用ACCESS 工具里的压缩和修复数据库,每天都进行.也可以写一段代码进行压缩。
我做过ACCESS单机板程序,由于计算量很大,进行计算之后,数据库容量达到2G,压缩后到100M,这样能提高速度.现在我用SQL SERVER,就不存在这样的问题了.
回复
susanlong 2001-11-14
LIUTAO2002(浪里摸鱼)老兄说的用查询,我知道如何在ACCESS中建立,但不知道如何在程序中调用,能否举例说明一下,先谢了!
回复
susanlong 2001-11-14
各位老兄,请恕小弟无知

LIUTAO2002(浪里摸鱼)老兄说的用查询,我知道怎样在ACCESS中建立,但不知如何在程序中调用,请举例说明赐教!谢谢!

Ganzl()老兄说的共享打开数据库,由于数据一直在实时采集并写入数据库中,所以可能不能以这种方式打开。

Wesely(无奈太多)老兄说的异步和分页我也不知道如何实现,能否举例说明,不胜感谢!
而且你说的绑定是说用ADO控件吗?我不太明白你的意思,请说详细一些。

isage2002(isage)老兄说的解决方案,由于采集本身的数据量已经很大了,所以我估计这样只能让数据库更大,但我会仔细考虑,谢谢你的建议。

各位老兄,由于事情很急,还请大家多多帮忙,要分不是问题。先谢了上面的几位!


 
回复
lonaerd 2001-11-14
你把数据结构大致讲一下行吗?一起帮你想个办法重新设计数据结构
回复
isage2002 2001-11-14
你可以这样
如果 数据进行分析 的条件固定的话
在上传数据的时候,就对数据进行处理 一个库保存所有原始数据
一个库同时保存处理后的数据
查看结果 只需查看结果数据库就可以了

我作股票处理软件时 就这么做得
回复
susanlong 2001-11-14
各位老兄,我准备再次建议老板更改数据库,不过我对SQL SERVER不太了解,不知如此大的数据量,SQLSERVER是否能较好的提升效率
回复
Wesely 2001-11-14
你这种数据量是不应该用Access的啦!
可以用异步和分页显示的方法提高速度,
最好用绑定,不要自己填数据到网栅去,相信显示速度会比较快。
回复
alinker 2001-11-14
代码有问题!
IF ... ENDIF就有问题了
回复
baoxiang 2001-11-14
在VB中压缩ACCESS 数据库
--------------------------------------------------------------------------------
http://www.tongyi.net 作者:石运伟 出处:赛迪网 点击:2184
  如果您在 Access 数据库、Access 项目中删除数据或对象,可能会产生碎片并导致磁盘空间使用效率的降低。同时,数据库文件的大小并未减小,而是不断的增大,直至您的硬盘没有空间。有没有好的处理方法呢?其实,在Access中可以对数据库进行压缩优化以提升Access 数据库和 Access 项目的性能,这样的压缩处理的实质是复制该文件,并重新组织文件在磁盘上的存储方式。但是,在 Access 项目中进行这样的压缩不会影响到数据库对象(例如表或视图),因为它们是存储在 Microsoft SQL Server 数据库中而不是在 Access 项目本身中。同样,这样的压缩也不会影响到 Access 项目中的自动编号。在 Access 数据库中,如果已经从表的末尾删除了记录,压缩该数据库是就会重新设置自动编号值。添加的下一个记录的自动编号值将会比表中没有删除的最后记录的自动编号值大一。

  下面介绍如何在VB中用一个CompactJetDatabase过程实现对Access数据库文件的压缩处理,在这个过程中有一个可选参数,就是在压缩前你是否需要把原有的数据库文件备份到临时目录(True或 False)。我用此办法使21.6MB的数据库压缩到仅仅300KB。

  ' 这些代码可放在模块中,在其他窗体也使用

  Public Declare Function GetTempPath Lib "kernel32" Alias _

    "GetTempPathA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long

  Public Const MAX_PATH = 260

  Public Sub CompactJetDatabase(Location As String, Optional BackupOriginal As Boolean = True)

  On Error GoTo CompactErr

  Dim strBackupFile As String

  Dim strTempFile As String

  '检查数据库文件是否存在

  If Len(Dir(Location)) Then

   ' 如果需要备份就执行备份

   If BackupOriginal = True Then

   strBackupFile = GetTemporaryPath & "backup.mdb"

   If Len(Dir(strBackupFile)) Then Kill strBackupFile

   FileCopy Location, strBackupFile

   End If

   ' 创建临时文件名

   strTempFile = GetTemporaryPath & "temp.mdb"

   If Len(Dir(strTempFile)) Then Kill strTempFile

   '通过DBEngine 压缩数据库文件

   DBEngine.CompactDatabase Location, strTempFile

   ' 删除原来的数据库文件

   Kill Location

   ' 拷贝刚刚压缩过临时数据库文件至原来位置

   FileCopy strTempFile, Location

  

   ' 删除临时文件

   Kill strTempFile

  Else

  End If

  CompactErr:

      Exit Sub

  End Sub

  Public Function GetTemporaryPath()

  Dim strFolder As String

  Dim lngResult As Long

  strFolder = String(MAX_PATH, 0)

  lngResult = GetTempPath(MAX_PATH, strFolder)

  If lngResult <> 0 Then

   GetTemporaryPath = Left(strFolder, InStr(strFolder, Chr(0)) - 1)

  Else

   GetTemporaryPath = ""

  End If

  End Function

  以后您在使用Access数据库时可以尝试进行这样的压缩,您应该会发现我说的没有错。


虽然不一定有用,不过我想你也可以试试
回复
susanlong 2001-11-14
hh
回复
susanlong 2001-11-14
各位老兄,请恕小弟无知

LIUTAO2002(浪里摸鱼)老兄说的用查询,我知道怎样在ACCESS中建立,但不知如何在程序中调用,请举例说明赐教!谢谢!

Ganzl()老兄说的共享打开数据库,由于数据一直在实时采集并写入数据库中,所以可能不能以这种方式打开。

Wesely(无奈太多)老兄说的异步和分页我也不知道如何实现,能否举例说明,不胜感谢!
而且你说的绑定是说用ADO控件吗?我不太明白你的意思,请说详细一些。

isage2002(isage)老兄说的解决方案,由于采集本身的数据量已经很大了,所以我估计这样只能让数据库更大,但我会仔细考虑,谢谢你的建议。

各位老兄,由于事情很急,还请大家多多帮忙,要分不是问题。先谢了上面的几位!
回复
加载更多回复
相关推荐
发帖

1187

社区成员

VB 数据库(包含打印,安装,报表)
申请成为版主
帖子事件
创建了帖子
2001-11-13 08:10
社区公告
暂无公告