oracle的数据库。服务器在远端。其数据量极其庞大,最大的表的记录有几百上千万。
本地通过建立odbc进行访问,本地需要和服务器的数据保持一致(远程仅读)。
需要做的是,读取服务器所有的记录,然后保存在本地。
本地数据库可能要转换成其他,比如sql,不过这个不重要。本地用toad,sql语句select * from 表,读出数据,然后把数据“另存为”在本地其他数据库格式。
这样的方式,总共用时要几个小时!!!
现在要用vb来写个程序,自动完成这一工作。希望能大幅度提高效率。请问,
1,原来的方法,速度瓶颈在哪里?
2,vb访问数据库,怎样才能达到最大的效率?

解决方案 »

  1.   

    恩。证实了。传输的确要不少时间,本地保存也要很久,后者可以提高机器性能来提高速度。
    但是前者就没有啥办法了。谢谢大家啦还想请教下大家:
    1,比如select * from table 选出来一次传回来,有10000条记录; 
       我想分批传,比如分10次传回来,每次1000条记录,具体的sql语言怎么写?
       ps:   select top XXX from table 的语法通过不了,不知道为啥。
    2,以下的数据库连接,记录添加的方式,算是存储过程吗,ado吗?效率高吗?还有提升的空间么?
       ConType=0时用odbc, 1时用连接字串连sql数据库    Public Conn As ADODB.Connection '用于全局的数据连接
        ...
        Set Conn = New ADODB.Connection
        With Conn
            .CursorLocation = adUseClient
            .CommandTimeout = 10
            
            Select Case ConType
            Case 0
                .Open ODBCName, UserName, PassWord  '这里连接odbc用
            Case 1
                '连接到SQL Server数据库
                Dim DBName As String
                DBName = "Test"
                .ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=True;" & _
                            "User ID=" & UserName & ";Initial Catalog=" & DBName & _
                            ";Data Source=" & ServerName & ";pwd=" & PassWord
                .Open
            End Select
        End With
      

  2.   

    当然不是即时的,要即时那还了得。
    就是每周或者每月更新一次。这些就无所谓了。对了,这是添加记录代码
        strSQL = "SELECT top 1 * FROM table"
        rsObj.Open strSQL, Conn, 3, 2
            rsObj.AddNew
            rsObj("name") = "XXXX"
            rsObj("phone") = "1393474545"
            rsObj("money") = "123.54"
            rsObj("rechargedate") = "2005-1-1"
            rsObj.Update
        rsObj.Close
      

  3.   

    我先想知道你在用什么库?
    如果都是oracle就好办了。
    用rman做增量备份就行了,用vb写,表少还好,如果300张表呢?-----------
     select top XXX from table 的语法通过不了,不知道为啥。如果是oracle,不支持top,top是sql server的语法。所以无比确认你的库是什么楼上说的关于用存储过程,我也觉得不一定合理,还是那个问题,表多怎么办?------------------不同的数据库,可以用透明网关。另外,用etl做应该也行吧。datastage就好。做个job执行,别vb那是一定强的
      

  4.   

    不好意思,错字太多了;所以无比确认你的库是什么-------------所以务必。别vb那是一定强的--------比vb 
      

  5.   

    可以实现。
    Dim Rst as new Adodc.recordset
    Dim Conn as new Adodc.connection
    Public Function Filldata(Recordsetname As ADODB.Recordset, MSFlexGridName As MSHFlexGrid, Currentpage As Integer)
      Dim Rowdata As String
            MSFlexGridName.Rows = 1
            Recordsetname.PageSize=1000
            Recordsetname.AbsolutePage = Currentpage        For j = 1 To Recordsetname.PageSize
              If Recordsetname.EOF = True Then Exit For
              Rowdata = ""
               For T = 1 To Recordsetname.Fields.Count
                MSFlexGridName.Col = T - 1
                Rowdata = Rowdata & Recordsetname.Fields(T - 1) & vbTab
               Next T
                Rowdata = Left(Rowdata, Len(Rowdata) - 1)
                MSFlexGridName.AddItem Rowdata
                Recordsetname.MoveNext
            Next j
            Recordsetname.Close
            Set Recordsetname = Nothing
    End Function
      

  6.   

    1:服务器端做好数据优化:
       大量数据采取建立索引并分区存储的方法。
    2:客户端简化数据读取过程
    1、本地使用使用sql server数据库,并在企业管理起立建立远程连接服务器,连接到远程的Oracle数据库服务器上面。
    2、在sql server环境下面使用:OPENQUERYf访问远程服务器的数据。
    3、在提取远程数据的时候尽量将索引字段作为条件附加到where条件里面。
      

  7.   

    恩。证实了。传输的确要不少时间,本地保存也要很久,后者可以提高机器性能来提高速度。
    但是前者就没有啥办法了。谢谢大家啦
    ==========================
    我以前用的是sql server,一个月备份一次,楼主可能忽略了一个步骤:传输之前可以对传输的数据先进行压缩。根据我以前的使用经验,sqlserver的数据备份文件(好像是.mdf和.log文件)经过用winrar最大压缩后,体积缩小为原来的十分之一这样对网络传输来说可以节省很多时间,备份储存也省很多空间。
      

  8.   

    leborety(那只螃蟹): 表的确比较多。百多张。 用什么都不要紧了,速度瓶颈在网络传输上了。
    Tiwen818() : 谢谢,不过我的意思不是分页显示,你那个是全部select后,分部分显示出来而已。 我意思是,select到rs的时候,分部分选择。要在sql语句里面实现。
     lsftest() ,我明白你的意思了, 但是要在传输前压缩数据,在vb里面如何实现??而且这个程序是在客户端运行,并不是在服务器端运行。恐怕不好弄啊
    shiningxing(潇雨),在本地sql 上面设置那个,对vb程序用odbc连接远端服务器的速度有影响吗?
      

  9.   

    lsftest() ,我明白你的意思了, 但是要在传输前压缩数据,在vb里面如何实现??而且这个程序是在客户端运行,并不是在服务器端运行。恐怕不好弄啊
    ============================
    都不是大问题关键是看你在服务器端有多少权限,例如是否有足够的权限可以远程调用服务器端数据库的系统存储过程进行备份之类。
      

  10.   

    lsftest() : 假设有权限,那应该怎么弄呢。请教各位高手!谢谢!!
      

  11.   

    可不可以这样,用记录集读取或者调用存储过程读取成一个文本文件,压缩传送到本地(文本不压缩也不大),然后用数据源再将这个文本导入到sql中
    只是思路
    我觉得这样只调用一次远程数据库,本地数据库操作也不是很复杂,用程序导入的方法就行 
    sql的sql语句作本地导入