【发布时间】:2010-05-05 22:30:16
【问题描述】:
这是我尝试过的。我还有什么遗漏或应该尝试的?
我的情况:
- SQL/Server 在另一个国家 - 直接互联网连接 不可靠,专线 成本高昂,线路状况不断变化(ping 180 到 500+)
- 通过 VPN 连接访问 SQL/Server - 非常慢但干净/可靠
- 在美国访问 ACCDB (ace) 数据库 - 容量小,工作正常
- 需要“插入select * from”
我已经尝试了以下所有方法:
DAO - (currentdb.execute) 运行 Access SQL,OLEDB 通过 VPN 连接到远程 SQL/Server - 可以使用“插入”非常慢。
使用 Access SQL 的 ADO - 更慢。
仅OLEDB,向远程SQL/Server发出的SQL命令看不到本地ACCDB文件,所以你必须循环遍历记录集,为每条记录建立一条SQL语句。非常慢。大量额外的编码。
OLEDB 访问 SQL/Server 的链接表。读取数据快,插入记录很慢。
SQL/Server 两端。本地 SQL/Server 将表链接到 ACCDB 和远程服务器。工作,但不提高速度。插入 1000 条相当小的记录需要 5 分钟以上。
批量插入。不能那样做,源数据不是文本文件,是ACCDB。这不是一次性转换,而是每天更新/更改的记录。
SSIS -- 看起来很快,因为我能够快速迁移整个数据库,但对于日常使用普通的插入和删除操作来说似乎不太合适或不方便。
尚未尝试:SQL/Server 订阅者-发布者镜像/复制以将远程表“虚拟”保持在本地。
因此,令人惊讶的是,我发现远程 ACCDB(无 SQL/Server)的 DAO 的工作速度比通过 VPN 的 SQL/Server 快 20 倍。但是,我更愿意使用 SQL/Server。
我还有什么遗漏或应该尝试的?
【问题讨论】:
-
我不做这种事情,但是有一种方法可以在使用批处理模式的 ADO 中执行 DML。使用 ODBC 的问题在于它将每条记录作为独立的插入发送,因此您需要将其强制为批处理模式插入,据我所知,ADO 方法是唯一的方法。但是我没有将此作为答案发布,因为我的建议涉及过多的挥手! :)
-
感谢您的想法——我开始使用 SqlBulkCopy 类进行查找。有谁知道如何在 T-SQL 中执行此操作,还是只有 ADO.NET?我会单独发一篇文章。
标签: sql-server ms-access ms-access-2007