1234

ExcelHome技术论坛

用户名  找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论] Excel SQL查询近期变慢的原因测试

[复制链接]

TA的精华主题

TA的得分主题

发表于 2025-4-10 16:02 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
两年前开始用ADO+SQL+VBA做多个Excel文件的数据汇总。一直相安无事,除了有些时候不知道因为什么,平时能运行的VBA会卡死,换一个电脑或者重启就好了,那个情况想再现可能再现不了,但不知道什么时候就冒出来,但过了那么一两个月以后几乎我就没遇到过了,怀疑是windows某次升级带入的某个bug?

昨天下午(2025-04-09)发现用了2年的查询突然很慢。因为查询的数据不多,所以正常情况下应该1秒内出结果,但实际上却花费了24秒。多次重复测试,同样的查询文件、同样的源文件、同样在Microsoft 365之下测试,都需要24秒,这很不正常。上个月底和这个月头使用的时候是正常的。为什么突然就抽风了呢???

win10系统上周没有升级过,Microsoft 365好像在这周初的时候打开Excel时被强制升级了一次。出现了不正常的24秒,我把win10和Microsoft 365都手动升级到最新版本,其中Microsoft 365没有用beta频道,现在的版本是Microsoft 365MSO (版本 2503 Build 16.0.18623.20178) 64 位。升级到了最新版本,问题依旧。

查询文件没改过脚本,源文件一再检查没有奇怪的错误结构,怎么突然就慢了这么多呢?虽然也能汇总出我想要的结果,但使用体验非常差。我翻出了去年的查询文件和源文件,发现以前的确1秒内出结果的东西现在同样需要24秒,再次验证了当前我正在使用的查询文件和源文件的确不是因为手贱更改了某些东西的原因而出现这个毛病。

那个之前一秒内出结果的汇总页面是多个查询汇总的结果。在不知道是谁出了问题的时候,我只好搭个脚手架,一个个测试,让我意外的是,让查询从1秒变成24秒的居然是一个把查询文件工作表里的一个超级表转化为SQL数据的操作。数据很少,只有1个字段,2条数据,相比于其它跨表数据,这实在太简单了。排除了这一条后,其它数据很多的跨表汇总全部都在1秒内出结果。

因为我日常使用的ADO+SQL+VBA都是跨表的,有些查询引用的Excel文件完全是外部的,但因为设计的时候图方便懒惰操作,一些日期表之类的索引我放在了查询文件xlsm里。当我把自己的xlsm查询都试了一圈之后发现,好像真的是只有在查询时用到了查询文件xlsm里超级表转化为SQL数据,才会让查询变慢。有个查询文件xlsm内部引用的超级表对应的SQL数据有4个字段,那个之前只需要0.5秒就能完成查询的东西现在变成需要97秒,约等于24*4,所以这个变慢的程度还和字段多少有关?

我隐隐觉得这个ADO+SQL+VBA变慢的问题和查询时使用了查询文件xlsm数据转换有关。

接下来,针对内部文件(查询文件xlsm)和外部文件(Excel文件,随便什么格式,这次我用来测试的文件后缀为xlsm,但里面没有VBA),我进行了个排列组合的ADO+SQL+VBA测试。

每个宏里面都引用了2个文件,第一个是只是用来建立cnn连接,第二个才是SQL查询及输出数据的主体。排列组合分别称呼为内内、内外、外外、外内。因为内内和外外两条引用实际上对应同一个东西,所以我进一步把测试细分为内内1、内内2、内外,外外1,外外2,外内共6种情况。

内内1

  1. strCnn = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName
  2. cnn.Open strCnn
  3. strPath_date = "[Excel 12.0;DATABASE=" & ThisWorkbook.FullName & "]." '日期表
复制代码


内内2

  1. strCnn = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName
  2. cnn.Open strCnn
复制代码


内外

  1. strCnn = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName
  2. cnn.Open strCnn
  3. strPath_date = "[Excel 12.0;DATABASE=" & ThisWorkbook.Path & "\测试B.xlsm]." '日期表
复制代码


外外1

  1. strCnn = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.Path & "\测试B.xlsm"
  2. cnn.Open strCnn
  3. strPath_date = "[Excel 12.0;DATABASE=" & ThisWorkbook.Path & "\测试B.xlsm]." '日期表
复制代码


外外2

  1. strCnn = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.Path & "\测试B.xlsm"
  2. cnn.Open strCnn
复制代码

   
外内

  1. strCnn = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.Path & "\测试B.xlsm"
  2. cnn.Open strCnn
  3. strPath_date = "[Excel 12.0;DATABASE=" & ThisWorkbook.FullName & "]." '日期表
复制代码


测试.png

数据在红框展示,蓝框点击进行各种测试。

测试环境:Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz,内存8GB,64位win10系统,Microsoft 365
附件说明(4个文件须放在同一文件夹内测试):
1、测试A.xlsm,主测试文件
2、测试B.xlsm,配合测试文件的外部文件
3、测试A_只读.xlsm,主测试文件的只读版本
4、测试A.xls,主测试文件的另存为xls版本

试验结果:主测试文件测试A.xlsm所有涉及“内”的,都很久。
内内1、内内2、内外需要12秒
外外1、外外2需要0.1秒
外内需要24秒

在出现这个很慢的状况之前,我感觉所有这6种情况用时是几乎一致的,都是0.1秒左右,主测试文件的变体测试A_只读.xlsm和测试A.xls的确在6种情况下真的只需要0.1秒。

为什么我要考虑做主测试文件的变体文件测试呢?因为 [求助] excel的SQL查询最近出大问题了,有谁知道原因吗? 这个帖子里有人也遇到了和我一样的烦恼。我没有用WPS测试过,这次顺便把楼主提到的“改成XLS格式”和“改只读模式”测试了,试验证明的确这两种情况不会出现卡顿。帖子回复里有网友说他依然查询得很顺畅,没有一点问题,是不是因为他的查询文件里没有涉及“内”的东西呢?

综上所述,基本确定这一波ADO+SQL+VBA源于查询时用到了查询文件xlsm里的某些部分,但为什么之前没事?是windows系统的问题还是office软件的问题,这个估计得问为微软了。

针对这个“内”问题,在微软不给我们解决方案之前,我们可以尝试以下方法:
1、把查询文件xlsm里的内元素全部放到外部文件中(我自己就是这么干的,虽然麻烦,但也不会非常麻烦)
2、把查询文件xlsm另存为xls,高级格式会丢失一些
3、先设定查询参数,保存,把查询文件xlsm改成只读模式,然后再开始查询,下次查询前去掉只读,重复之前的步骤(操作有点麻烦,但暂时来说最不需要改动的方式)

不足之处请指正,希望大家帮忙测试。

补充内容 (2025-4-14 16:25):
PS:2025-04-14,发现一个弱智兼神经的事实。如果有“内”的问题,如果在你查询文件的时候外部文件处在打开状态,那么也会被认为是“内”,查询也会变慢。

测试.zip

105.08 KB, 下载次数: 23

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2025-4-10 16:58 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
产品2021,未更新,模拟器,测试A.xlsm。i3-4160,16g内存

image.png
image.png
image.png
image.png
image.png



TA的精华主题

TA的得分主题

 楼主| 发表于 2025-4-10 17:17 | 显示全部楼层
shiruiqiang 发表于 2025-4-10 16:58
产品2021,未更新,模拟器,测试A.xlsm。i3-4160,16g内存

所以这个问题跟升级貌似有很大关系

TA的精华主题

TA的得分主题

发表于 2025-4-10 20:26 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
阿珍!你来真的啊!
c3076584f2ae1ac475882fe5d17d8a7.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2025-4-10 20:41 | 显示全部楼层
limonet 发表于 2025-4-10 20:26
阿珍!你来真的啊!

今天19点多我的Microsoft 365家庭版就登陆不了了!一直说未授权!!!!!

TA的精华主题

TA的得分主题

发表于 2025-4-10 20:49 | 显示全部楼层
xrspook 发表于 2025-4-10 20:41
今天19点多我的Microsoft 365家庭版就登陆不了了!一直说未授权!!!!!

看来阿普是来真的了。

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2025-4-11 10:36 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2025-4-11 11:26 | 显示全部楼层
morpheus126 发表于 2025-4-11 10:36
那就是内和外的原理是不同的?

不知道微软的某个更新为什么制造了这种不同。据说Office 2019升级到最新版本就没有这个问题了。

TA的精华主题

TA的得分主题

发表于 2025-4-11 11:39 | 显示全部楼层
楼主的问题,我也遇到了,我的工具使用了vba+sql+access的形式,6种模式,我这里都有,确实,涉及内的都有问题,开始以为是access的问题,后来压缩,修复,新建了都不解决问题,只要链接字符串里,是xlsm的就很卡

TA的精华主题

TA的得分主题

 楼主| 发表于 2025-4-11 15:09 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
WANT-T 发表于 2025-4-11 11:39
楼主的问题,我也遇到了,我的工具使用了vba+sql+access的形式,6种模式,我这里都有,确实,涉及内的都有 ...

如果是2019,据说升级到最新就好了,但如果是365,我这边就还没好。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

1234

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

GMT+8, 2025-4-25 08:32 , Processed in 0.029703 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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