ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2014-3-11 10:01 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
百度不到去谷歌 发表于 2014-3-11 09:52
重新测试了一下 想起rs对象 在1中声明他以后 在循环中每次都是赋值给他新的sql结果  这样每次rs都没有关闭, ...

创建的过程应该用不了0.03秒之久吧,你这个语句等于注销了RS,让它等同于第二个过程。我个人还是觉得是在隐形声明和显性声明中的存储方式或者如你所说的存储空间大小有关。

TA的精华主题

TA的得分主题

发表于 2014-3-11 10:03 | 显示全部楼层
百度不到去谷歌 发表于 2014-3-11 09:52
重新测试了一下 想起rs对象 在1中声明他以后 在循环中每次都是赋值给他新的sql结果  这样每次rs都没有关闭, ...

能解释 1 和 3 吗?
主要取决于 VBA 对 Connection 的管理,尤其是 未使用 Connection 。

TA的精华主题

TA的得分主题

发表于 2014-3-11 10:06 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
没名字了 发表于 2014-3-11 10:01
创建的过程应该用不了0.03秒之久吧,你这个语句等于注销了RS,让它等同于第二个过程。我个人还是觉得是在 ...

你说得对啊 注销了rs就等于2例 没注销那么就是说一直在用的是同一个对象 注销了也就是2例中,一直在使用新的rs对象,我觉得区别就在这里了

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-3-11 11:21 | 显示全部楼层
百度不到去谷歌 发表于 2014-3-11 10:06
你说得对啊 注销了rs就等于2例 没注销那么就是说一直在用的是同一个对象 注销了也就是2例中,一直在使用新 ...

程序3只有连接没有查询反而比有查询的程序1慢很多,只要加上一个:
Set rs = cnn.Execute(SQL)

rs.Open SQL, cnn, 1,3   '          adOpenKeyset, adLockOptimistic

Set rs = cnn.OpenSchema(20)       '             adSchemaTables
运行速度就快了,哪怕后面再使用arr = cnn.Execute(SQL).GetRows也没有关系,可见只有两种情况:
一、把某个查询赋值给变量rs
二、与一相反,没有把某个查询赋值给变量rs

TA的精华主题

TA的得分主题

发表于 2014-3-11 11:28 | 显示全部楼层
zhaogang1960 发表于 2014-3-11 11:21
程序3只有连接没有查询反而比有查询的程序1慢很多,只要加上一个:
Set rs = cnn.Execute(SQL)

倒没有测试赋值rs以后再直接隐式创建的效果 这样就真的不知道如何解释了
只要创建了rs对象能加速 太奇葩了

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-3-11 11:54 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
百度不到去谷歌 发表于 2014-3-11 11:28
倒没有测试赋值rs以后再直接隐式创建的效果 这样就真的不知道如何解释了
只要创建了rs对象能加速 太奇葩 ...

经测试,使用CopyFromRecordset 方法复制数据也存在同样的疑问:
Set rs = cnn.Execute(SQL)
Range("A2").CopyFromRecordset rs
速度明显优于:
Range("A2").CopyFromRecordset cnn.Execute(SQL)
使用52个个Access文件代替Excel文件测试得出的效果是相同的

TA的精华主题

TA的得分主题

发表于 2014-3-11 12:08 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
依然只是猜想:
这个可能和是否使用SQL无关,而是微软的存储方式有关,比如我们把一个文件修改多次以后,使用“快速保存”去掉“快速保存”“另存为”这三种方式保存的时候会得到三种内容相同,文件大小却各不相同。这至少可以说明,它采取的是文件信息记录的方式来实现存储。也就是写硬盘的方式。在有明确变量的时候,变量是通过内存存储。而且明确的变量也容易被击中。系统只要负责调用变量即可,而不需要去缓存里面搜寻。当然我也没有理论依据去支持我的看法。

点评

和我4楼的猜想差不多  发表于 2014-3-11 12:16

TA的精华主题

TA的得分主题

发表于 2014-3-11 12:27 | 显示全部楼层
zhaogang1960 发表于 2014-3-11 11:54
经测试,使用CopyFromRecordset 方法复制数据也存在同样的疑问:
Set rs = cnn.Execute(SQL)
Range("A2 ...

发现一个更奇葩的事情 如果只在第一次set rs速度可以更快
在这里加上 速度比单纯的set rs还要快 碉堡了!
            SQL = "select * from [Sheet1$a2:l] where 被拆迁人 is not null"
            If i <1 Then
                i = i + 1
                Set rs = cnn.Execute(SQL)
            End If

点评

经测试略微快一点  发表于 2014-3-11 12:38

TA的精华主题

TA的得分主题

发表于 2014-3-11 12:30 | 显示全部楼层
我把文件复制到两个文件夹里面对两个过程分别单独运行,然后清除更新内容,再保存,运行过程1的文件大小没有变化,因为它的存储是通过内存实现的,运行过程2的增加了2KB,这说明运行结果可能是通过本表缓存后调用输出。
也就是说,时间的差异可能是处于硬件运行速度的差异,而不是程序本身。如果还想深究的话,可以更换一个老式5400转左右的硬盘来运行,看看速度差是不是急剧扩大就应该可以得出结论。

TA的精华主题

TA的得分主题

发表于 2014-3-11 12:35 | 显示全部楼层
没名字了 发表于 2014-3-11 12:30
我把文件复制到两个文件夹里面对两个过程分别单独运行,然后清除更新内容,再保存,运行过程1的文件大小没有 ...

都是本机器测试 代码就一句不同 速度明显差异 这和硬件不应该有关系吧
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-19 01:31 , Processed in 0.037732 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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