百万记录级的数据库,如何提高读写效率?

Summer006 2005-10-26 05:26:27
oracle的数据库。服务器在远端。其数据量极其庞大,最大的表的记录有几百上千万。
本地通过建立odbc进行访问,本地需要和服务器的数据保持一致(远程仅读)。
需要做的是,读取服务器所有的记录,然后保存在本地。
本地数据库可能要转换成其他,比如sql,不过这个不重要。

本地用toad,sql语句select * from 表,读出数据,然后把数据“另存为”在本地其他数据库格式。
这样的方式,总共用时要几个小时!!!
现在要用vb来写个程序,自动完成这一工作。希望能大幅度提高效率。

请问,
1,原来的方法,速度瓶颈在哪里?
2,vb访问数据库,怎样才能达到最大的效率?
...全文
332 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyg0 2005-11-08
  • 打赏
  • 举报
回复
可不可以这样,用记录集读取或者调用存储过程读取成一个文本文件,压缩传送到本地(文本不压缩也不大),然后用数据源再将这个文本导入到sql中
只是思路
我觉得这样只调用一次远程数据库,本地数据库操作也不是很复杂,用程序导入的方法就行
sql的sql语句作本地导入
Summer006 2005-11-01
  • 打赏
  • 举报
回复
lsftest() : 假设有权限,那应该怎么弄呢。请教各位高手!谢谢!!
Summer006 2005-10-31
  • 打赏
  • 举报
回复
leborety(那只螃蟹): 表的确比较多。百多张。 用什么都不要紧了,速度瓶颈在网络传输上了。
Tiwen818() : 谢谢,不过我的意思不是分页显示,你那个是全部select后,分部分显示出来而已。 我意思是,select到rs的时候,分部分选择。要在sql语句里面实现。
lsftest() ,我明白你的意思了, 但是要在传输前压缩数据,在vb里面如何实现??而且这个程序是在客户端运行,并不是在服务器端运行。恐怕不好弄啊
shiningxing(潇雨),在本地sql 上面设置那个,对vb程序用odbc连接远端服务器的速度有影响吗?
lsftest 2005-10-31
  • 打赏
  • 举报
回复
lsftest() ,我明白你的意思了, 但是要在传输前压缩数据,在vb里面如何实现??而且这个程序是在客户端运行,并不是在服务器端运行。恐怕不好弄啊
============================
都不是大问题。。。关键是看你在服务器端有多少权限,例如是否有足够的权限可以远程调用服务器端数据库的系统存储过程进行备份之类。。。。
蔡健常熟 2005-10-30
  • 打赏
  • 举报
回复
oracle有存储过程吗?
lsftest 2005-10-30
  • 打赏
  • 举报
回复
恩。证实了。传输的确要不少时间,本地保存也要很久,后者可以提高机器性能来提高速度。
但是前者就没有啥办法了。谢谢大家啦
==========================
我以前用的是sql server,一个月备份一次,楼主可能忽略了一个步骤:传输之前可以对传输的数据先进行压缩。。。。根据我以前的使用经验,sqlserver的数据备份文件(好像是.mdf和.log文件)经过用winrar最大压缩后,体积缩小为原来的十分之一。。。这样对网络传输来说可以节省很多时间,备份储存也省很多空间。。。。
shiningxing 2005-10-30
  • 打赏
  • 举报
回复
1:服务器端做好数据优化:
大量数据采取建立索引并分区存储的方法。
2:客户端简化数据读取过程
1、本地使用使用sql server数据库,并在企业管理起立建立远程连接服务器,连接到远程的Oracle数据库服务器上面。
2、在sql server环境下面使用:OPENQUERYf访问远程服务器的数据。
3、在提取远程数据的时候尽量将索引字段作为条件附加到where条件里面。
Tiwen 2005-10-29
  • 打赏
  • 举报
回复
可以实现。
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
leborety 2005-10-28
  • 打赏
  • 举报
回复
不好意思,错字太多了;

所以无比确认你的库是什么-------------所以务必。。。。



别vb那是一定强的--------比vb 。。。
leborety 2005-10-28
  • 打赏
  • 举报
回复
我先想知道你在用什么库?
如果都是oracle就好办了。
用rman做增量备份就行了,用vb写,表少还好,如果300张表呢?

-----------
select top XXX from table 的语法通过不了,不知道为啥。

如果是oracle,不支持top,top是sql server的语法。

所以无比确认你的库是什么

楼上说的关于用存储过程,我也觉得不一定合理,还是那个问题,表多怎么办?

------------------

不同的数据库,可以用透明网关。

另外,用etl做应该也行吧。datastage就好。做个job执行,别vb那是一定强的
Summer006 2005-10-28
  • 打赏
  • 举报
回复
当然不是即时的,要即时那还了得。
就是每周或者每月更新一次。这些就无所谓了。

对了,这是添加记录代码
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
zyg0 2005-10-28
  • 打赏
  • 举报
回复
不明白你的意思,是即时的吗?
Summer006 2005-10-28
  • 打赏
  • 举报
回复
恩。证实了。传输的确要不少时间,本地保存也要很久,后者可以提高机器性能来提高速度。
但是前者就没有啥办法了。谢谢大家啦

还想请教下大家:
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
Summer006 2005-10-28
  • 打赏
  • 举报
回复
顶上去
faysky2 2005-10-27
  • 打赏
  • 举报
回复
需要做的是,读取服务器所有的记录,然后保存在本地。
----------------------------------
基本上没有什么好的方法,因为数据要传输,肯定得要时间
lxgmag 2005-10-27
  • 打赏
  • 举报
回复
直接在数据库中用存储过程和触发器来实现,我想效率应该是比较高的!
province_ 2005-10-26
  • 打赏
  • 举报
回复
这么大量的数据单网络传输就要不少时间,怎么快得了?
fishmans 2005-10-26
  • 打赏
  • 举报
回复
这么大的数据用什么编程工具都快不了~~

还是所有数据,看看用数据订阅或复制发布能快点不?

bilujun 2005-10-26
  • 打赏
  • 举报
回复
你用vb写也提高不了速度。可以改进的地方。
1:我觉得就是读出尽量少的数据。如业务数据,你可能只要读出当天的或当天的数据,不用把几千万条数据都导过来。
2:尽量调用存储过程来完成。
winehero 2005-10-26
  • 打赏
  • 举报
回复
分批读不行吗?

1,216

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧