普通视图

发现新文章,点击刷新页面。
昨天以前首页

使用内部数据就会卡?

作者 xrspook
2025年4月12日 08:35

当年今日

昨天说到一个很简单的SQL语句引用的数据库就只有一个字段两行记录,居然需要24秒才能得出结果。这让我觉得非常不可思议。首先可以肯定的是数据量非常少,为什么会出现这种问题呢?那只能是连接方面是不是出了什么故障,也不能说,那是失效的,因为的确还能查询得到想要查询的东西。在我测试的那个宏里面。我引用了两个文件,一个是外部文件,一个是内部文件。外部文件是含有比较多的数据,而内部文件,也就是我一开始说的那个只有两条数据。我感觉如果我的SQL再厉害一些,我对VBA再熟悉一些的话,那个内部文件可能我就不需要引用了,我直接就在VBA里创建一个数据库,然后把两条数据给写进去,用完以后就删掉,但显然现在我还没有很大的把握,一定能完美地做这件事情。把我某个文件里面的数据转化为数据库的数据我又烂熟,所以我采取了现在使用的这种方式。

ADO+SQL的这种方式,因为我们是跨表引用,所以意味着数据肯定来源于多个文件。他们有可能是同一个工作簿的不同工作表,也有可能是在不同的工作簿里。对我来说,只要是在一个工作簿里,那么起码一开始设定指向的时候就得有一个数据源。最经典的方式引用的那个数据源在使用数据的时候,在from后面不需要进行进一步的引用,其它的就得麻烦一些。我的第一个反应是,是不是引用数据的那个语句出现了变动呢?比如说现在我用的是Excel12。在数据源引用方面,我又折腾了一番,发现好像还是那样,没什么进展。会拖慢查询的那个数据源,我甚至把它放到了主数据源里,结果发现还是很慢,于是这就排除了是数据源引用语句变动导致缓慢。

所以这到底是什么原因造成的呢?因为我有很多个跨表引用的查询。有些查询是内部数据外部数据都有,有些只有外部数据,经过测试后我发现好像只有引用了内部数据的查询才会变慢。

为了证明我这个想法,星期三的晚上我编造了一些数据做测试。主要原理就是研究是不是数据源的关系导致这种变慢。一开始我的设计就是一个排列组合的方式,因为我默认的数据引用是要跨表的,所以我把数据源根据内内、内外、外外和外内这4种方式测试,实际上内内和外外是一回事,也就不需要进行两个引用了,所以我又把那两个东西拿了出来,同样进行测试。结果让人有点吃惊,凡是有内部数据参与的查询都会变慢。我测试的数据就只有一个字段几条记录,内内和内外需要12秒,外外需要0.1秒,外内需要24秒。这就能解释为什么我的那些变慢的查询起码都要24秒才能出结果。因为我永远把内部数据放在后面。究其原因是因为我设计那些查询的时候,我后来才想到要在那个查询文件里面搭一个加脚手架,把一些基础的东西加上去,在这种情况下我加得最多的是日期表。

关于这个测试的来龙去脉以及最终的结果,我在ExcelHome里面做了一个详细的帖子,在这里就不再具体阐述了。

折腾了这么一番以后,我发现这个锅还真不是我整出来的。造锅的是微软,不知道更新出了什么状况导致了。

Excel用多了,不知不觉我也居然能挑出微软的毛病。

查询突然变慢

作者 xrspook
2025年4月11日 08:14

当年今日

周三的下午跟往常一样,我点一下自己写的ADO+SQL+VBA的跨表查询文件,结果发现之前一秒就能出结果的东西等了好久,鼠标在那里转圈,我都甚至怀疑是Excel不知道因为什么原因卡死了,但我又有理由相信这不是卡死,因为当VBA要运行很长时间的时候,就会出现那种假死的状态。以前我遇到过这种情况,当我要查询一整年的平均库存的时候,就会这样,如果只是查询一个月的,没有问题。之所以一整年会出状况,是因为需要处理的数据的确有点多,如果我用的不是Excel的VBA的SQL,如果我要做的那个平均库存是在数据库里,用正儿八经规范标准的SQL做,我感觉不需要那么长时间。要长时间运行,无可避免会出现假死状态。周三下午,我就经历了一次,但我觉得那个查询不应该会假死。那个查询文件我用了接近两年,一直以来都没什么问题,因为数据不多,很简单,所以正常情况下,一秒之内出结果。其它查询可能需要的时间长一点,因为涉及的数据量比较大,但是这一次让我卡死的那个,一直以来,当我测试成功通过以后,就没有卡死过。

为什么会这样呢?我把自己写的所有查询文件全部都点了一遍。我觉得既然最简单的那个都要卡24秒,那些之前需要更长运行时间,会让人疯掉。测试结果让我有点意外。我猜想会更疯狂的那些居然没事,跟以前一样,运行时间没什么区别,但有些我感觉没有难度的东西,反倒卡住了。最卡的那个卡了97秒,实际上那个查询平时只需要0.5秒。

遇到这种情况,首先我不觉得是因为我的查询文件出了状况,因为这几天它没改动过,除非有人动了我的电脑,但这个几率太低。我觉得出状况最大的可能性是那个源文件的结构发生了某些变化,因为我引用的是Excel文件。用的那个范围是一个超级表,而如果在那个超级表以外的某个地方出现了一些奇怪的数据,比如说在纯日期的列里面出现了文本,那么就会导致在SQL转化数据的过程之中出现一些意想不到的事情。为了避免这种事情,我把源数据的那些空白行和列全部都删除处理。这就保证了我的原始数据是符合规定的,和以前的格式是一致的。接下来我觉得这会不会是更新的问题,所以我对windows系统以及Microsoft 365都进行了手动的更新。这两个东西的确都是需要安装更新的。更新完成了以后,问题依旧。

接下来我有两个选择,一个是就这样等死,反正现在的情况也不是出不了查询结果,只是用时很长而已。万一这真的是微软升级的bug,说不定哪一天他们就会解决掉,但也说不准他们永远都不解决这个我认为是bug的问题。第二个选择是我主动出击,逐个测试VBA查询里的语句。找出那条让我运行时间很长的语句,然后判定到底是什么原因。

那个理论上一秒就应该结束的查询,实际上是Excel工作表里面汇集了多个汇总查询。我只是把结果都在一个页面展示而已,所以首先,我要找出导致最终结果很慢的是哪个查询。这是一个反推的过程。让我有点意外的是,那些涉及很多数据的查询居然都没有问题,一个我觉得根本不会出问题的问东西里居然出问题了。出问题的那个查询实际上只涉及了一个字段两条数据。这简直让我震惊了,怎么居然这样呢?

这个问题是我之前没有遇到过的,但从发现这个奇葩之后,我觉得自己有点跟那杠上了。

如何利用 Legado 上使用 Azure TTS 进行听书?

作者 佐仔
2023年6月12日 16:19

Legado 应该是安卓手机最好的第三方电子书阅读APP之一,我之所以喜欢它,除了它支持各种格式与书源之外,更重要的是它支持 Azure TTS 文字转语音--听书。Azure TTS在文字转语音方面,是我现时听到最好的文字转语音引擎,没有之一。

本教程不需要安装任务第三方文字转语音引擎,纯代码设置。

Legado 是开源软件,下载地址:https://github.com/gedoor/legado ,大家前往下载安装既可。至于 Azure TTS 申请,网上有很多教程,大家自行搜索,实在不会,那就看看知道这篇大神分享的文章吧--在微软云平台Azure上创建个性化的语音(TTS)服务

以下为在 Legado 上设置Azure TTS的详细教程。我知道大家都难,所以尽量使用图片形式给大家展示。

1、在 legado 打开任一电子书,然后点击屏幕中间,显示阅读设置菜单。
2、点击朗读按钮,进入朗读界面。
3、在朗读界面,点击右下角按钮,进入朗读设置界面。
4、在朗读设置设面,点击“朗读引擎”选项。

5、在朗读引擎界面,点击右上角+号,进行新增引擎。
6、点击右上角三个点的菜单选项。
7、把以下代码修改成你自已的,然后粘贴源既可。
{ "concurrentRate": "0", "contentType": "audio/mpeg", "enabledCookieJar": false, "header": "{\n \"Ocp-Apim-Subscription-Key\": \"改为你自已的AzureTTS钥匙\",\n \"Content-Type\": \"application/ssml+xml\",\n \"X-Microsoft-OutputFormat\": \"audio-16khz-128kbitrate-mono-mp3\",\n \"User-Agent\": \"legado\"\n}", "id": 1685895171535, "lastUpdateTime": 1686557728110, "loginCheckJs": "", "loginUi": "", "loginUrl": "", "name": "Azure--TTS", "url": "https://eastasia.tts.speech.microsoft.com/cognitiveservices/v1,{\n \"method\": \"POST\",\n \"body\": \"{{speakText}}\"\n}" }
8、返回到5步的界面,选择好语音引擎后,点击全局既可。

你可以在这里选择你喜欢的音色替换概可。https://learn.microsoft.com/zh-cn/azure/cognitive-services/speech-service/language-support?tabs=tts ,我默认的是 zh-CN-XiaochenNeural -- 晓辰。

本文完毕,这样的设置好处,就是不需要安装任务第三方的文字转语音引擎和app,这对于我来说是最好的方案。如果大家可以根据自已的需求,选好相应的语音样式既可。

❌
❌