ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: zhaogang1960

[讨论] SQL顺序连接多个工作簿速度的疑问,解释合理加技术分2分

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-3-11 23:19 | 显示全部楼层
HHAAMM 发表于 2014-3-11 22:53
循环前规规矩矩的写上
Set cnn = New ADODB.Connection
    Set rs = New ADODB.Recordset

Close方法需要时间较长,通常我们在循环内:
Set cnn = New ADODB.Connection
Set rs = New ADODB.Recordset
cnn.Open……连接

程序结束时再Close关闭连接

当然也可以在循环外Set cnn = New ADODB.Connection、Set rs = New ADODB.Recordset
循环内cnn.Open……连接,rs.Close、cnn.Close

后者速度慢

TA的精华主题

TA的得分主题

发表于 2014-3-12 07:53 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-3-12 08:23 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zhaogang1960 发表于 2014-3-11 22:03
同意“养成一个好的习惯很重要”,那么第三种情况——只连接,不查询也很慢,不好解释

只连接不查询也是因为没用到set啊。还是直接在硬盘对工作簿进行操作啊。

TA的精华主题

TA的得分主题

发表于 2014-3-12 08:28 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
zhaogang1960 发表于 2014-3-11 23:19
Close方法需要时间较长,通常我们在循环内:
Set cnn = New ADODB.Connection
Set rs = New ADODB.Reco ...

是的 我前面就发现了 同样set rs后如果加了set rs =npthing 速度就一样变慢了
所以关闭连接以及记录集是比较耗时的 写在循环外面 等于是系统最后一起收回  速度要快得多

TA的精华主题

TA的得分主题

发表于 2014-3-12 08:30 | 显示全部楼层
本帖最后由 百度不到去谷歌 于 2014-3-12 08:32 编辑
guojianlin1985 发表于 2014-3-12 08:23
只连接不查询也是因为没用到set啊。还是直接在硬盘对工作簿进行操作啊。

连接以后就和文件没关系了,我试过连接后改变文件内容 不重新连接的情况下 查询到的还是以前的内容我觉得是连接的时候 系统就自动建立了一个记录集 这个默认的记录集可能分配了默认rs对象最大的内存或者缓存,当set rs后 有了确定的大小 反而速度上来了 不set rs这个资源占用就下不来

TA的精华主题

TA的得分主题

发表于 2014-3-12 08:34 | 显示全部楼层
这个讨论估计只能到这了,最终还是如70楼所说的,最终解释权还得找微软。
只有他们才清楚软件的运行机制,磁盘、内存的读写、分配和回收,以及程序的工作流程。
就比如if len(str)=0 then 比if str=“” then 速度快的道理差不多。

TA的精华主题

TA的得分主题

发表于 2014-3-12 09:21 | 显示全部楼层
zhaogang1960 发表于 2014-3-11 23:19
Close方法需要时间较长,通常我们在循环内:
Set cnn = New ADODB.Connection
Set rs = New ADODB.Reco ...

回复了N条,回复不上来,不知道这次可以不可以。
情况不完全同赵版说的一样,当循环内只设置RS.CLOSE的时候(cnn.close设置在循环外),速度基本上没有明显变化。

TA的精华主题

TA的得分主题

发表于 2014-3-12 10:38 | 显示全部楼层
SQL顺序连接多个工作簿速度的疑问20072010.rar (458.8 KB, 下载次数: 12)
通过对创建对象,创建连接,关闭连接等用时的监控可以发现
时间差异主要出现在关闭连接上
ABW7FHBZ@D@7)6_87LU)EA9.jpg
如果对记录集进行实例化后,关闭连接会消耗同样的时间
如果打开连接后后不进行记录集的实例化,关闭连接也会消耗同样实际那
如果打开连接后进行记录集实例化,然后不关闭连接重新创建对象会耗时0基本可以忽略,说明没有关闭数据连接动作导致了节省时间
如果打开连接后不进行记录集实例化,然后重新创建对象,会先关闭原有的连接再重新创建对象。
由此推断打开连接后,如果已经存在对该连接的实例,如果重新初始化连接对象,会省略对连接的关闭过程,具体实际的内在机理,估计只要找到更深入的技术文档才能清楚。至于不关闭连接直接重新初始化会产生什么问题,只要试过才知道,我推测如果打开的是可更新记录集的,不知道会不会造成记录更新的丢失。
非常感谢版主细心发现这个问题,让我们在大数据操作时可以节省大量时间。

TA的精华主题

TA的得分主题

发表于 2014-3-12 11:17 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
如果打开的是access,不关闭行吗,可能就行不通了吧
哪位没事儿测试下  20个mdb文件,每个当中都有相同的表名字段名,随便来点数据

TA的精华主题

TA的得分主题

发表于 2014-3-12 11:44 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
百度不到去谷歌 发表于 2014-3-12 08:30
连接以后就和文件没关系了,我试过连接后改变文件内容 不重新连接的情况下 查询到的还是以前的内容我觉得是 ...

为什么我的机子打开后那个文件就成为只读状态了,应该是被连接占用了。

点评

是的  发表于 2014-3-12 11:52
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-16 04:23 , Processed in 0.053058 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表