当前位置: 首页 > 面试题库 >

解决VB6中的ADO超时问题

宇文和同
2023-03-14
问题内容

在VB6中填充ADO记录集时遇到问题。当我使用SSMS运行查询时,查询(命中SQLServer
2008)只需要大约1秒钟即可运行。当结果集很小时,它可以很好地工作,但是当结果集变成几百个记录时,则需要花费很长时间。800条以上的记录需要大约5分钟的时间才能返回(在SSMS中查询仍然只需要1秒的时间),而6000条以上的记录则需要20分钟以上的时间。我已经通过增加命令超时来“修复”异常,但是我想知道是否有一种方法可以使它更快地工作,因为它似乎并不是真正需要大量时间的查询。诸如压缩结果之类的事情使它不需要那么长的时间。记录集打开如下:

myConnection.CommandTimeout = 2000
myConnection.ConnectionString = "Provider=SQLOLEDB;" & _
        "Initial Catalog=DB_NAME;" & _
        "Data Source=SERVER_NAME" & _
        "Network Library=DBMSSOCN;" & _
        "User ID=USER_NAME;" & _
        "Password=PASSWORD;" & _
        "Use Encryption for Data=True;"
myConnection.Open

myRecordSet.Open STORED_PROC_QUERY_STRING, myConnection, adOpenStatic, adLockReadOnly
Set myRecordSet.ActiveConnection = Nothing

myConnection.Close

数据返回3列用于填充组合框。

更新:我运行了SQL事件探查器,并且与SSMS中的两个指标相比,客户端计算机上的实例进行的读取次数更多,花费的时间也增加了100倍。根据探查器,对于SSMS和客户端计算机,查询的文本都是相同的,因此我认为它不应使用其他执行计划。网络库或提供商可能对此有任何影响吗?

探查器统计信息:

  • 从客户端应用程序:读取7041720,持续时间59458 ms,行计数3900
  • 来自SSMS:30802次读取,238 ms持续时间,3900行计数

看起来它正在使用不同的执行计划,但是查询是完全相同的,并且我不确定如何检查客户端可能使用的执行计划(如果它与SSMS中显示的内容不同)。


问题答案:

800+ records requires about 5 minutes =查询问题。

查看您的执行计划:

在SSMS中,运行:

SET SHOWPLAN_ALL ON

然后运行您的查询,它将不会产生预期的结果集,但是会针对数据库如何检索您的数据制定执行计划。大多数不良查询通常是表扫描(查看表中的每一行,速度很慢),因此请在该StmtText列中查找单词“
SCAN” 。尝试弄清楚为什么未在该表上使用索引(名称将由单词“
SCAN”出现在该表中)。如果您加入多个表并且有多个SCAN,则首先将注意力集中在最大的表上。

没有更多信息,这是您可以获得的最佳“通用”帮助。

编辑
从阅读您的问题开始,我不确定您的意思是无论行数多少,它从SSMS总是很快,但是随着行数的增加,它从VB总是慢。

可能类似于:参数嗅探或连接参数不一致(ANSI空值,arithabort等)

对于连接设置,请尝试从SSMS和VB6运行它们(将它们添加到结果集中),看看是否存在任何差异:

SELECT SESSIONPROPERTY ('ANSI_NULLS') --Specifies whether the SQL-92 compliant behavior of equals (=) and not equal to (<>) against null values is applied.
                                      --1 = ON 
                                      --0 = OFF

SELECT SESSIONPROPERTY ('ANSI_PADDING') --Controls the way the column stores values shorter than the defined size of the column, and the way the column stores values that have trailing blanks in character and binary data.
                                        --1 = ON 
                                        --0 = OFF

SELECT SESSIONPROPERTY ('ANSI_WARNINGS') --Specifies whether the SQL-92 standard behavior of raising error messages or warnings for certain conditions, including divide-by-zero and arithmetic overflow, is applied.
                                         --1 = ON 
                                         --0 = OFF

SELECT SESSIONPROPERTY ('ARITHABORT') -- Determines whether a query is ended when an overflow or a divide-by-zero error occurs during query execution.
                                      --1 = ON 
                                      --0 = OFF

SELECT SESSIONPROPERTY ('CONCAT_NULL_YIELDS_NULL') --Controls whether concatenation results are treated as null or empty string values.
                                                    --1 = ON 
                                                    --0 = OFF

SELECT SESSIONPROPERTY ('NUMERIC_ROUNDABORT') --Specifies whether error messages and warnings are generated when rounding in an expression causes a loss of precision.
                                              --1 = ON 
                                              --0 = OFF

SELECT SESSIONPROPERTY ('QUOTED_IDENTIFIER') --Specifies whether SQL-92 rules about how to use quotation marks to delimit identifiers and literal strings are to be followed.
                                             --1 = ON 
                                             --0 = OFF

使您的查询类似(这样您就可以在VB6中看到连接设置):

SELECT
    col1, col2
        ,SESSIONPROPERTY ('ARITHABORT') AS ARITHABORT
        ,SESSIONPROPERTY ('ANSI_WARNINGS') AS ANSI_WARNINGS
    FROM ...


 类似资料:
  • 本文向大家介绍PHP http请求超时问题解决方案,包括了PHP http请求超时问题解决方案的使用技巧和注意事项,需要的朋友参考一下 一,http请求超时时间 可能出现的场景: 1,curl进程运行了一个世纪还木结束,curl的时候设置了超时时间 --connect-timeout 1000 2,operation timed out after 1000 milliseconds with 0

  • 本文向大家介绍服务调用超时问题怎么解决?相关面试题,主要包含被问及服务调用超时问题怎么解决?时的应答技巧和注意事项,需要的朋友参考一下 dubbo在调用服务不成功时,默认是会重试两次的。  

  • 我正在尝试运行一个简单的play-scala示例,但是我在启动activator时遇到了一些问题,因为我有很多连接超时。我只使用activator创建了应用程序并尝试启动它。没有开发或自定义配置。我用的是Play2.4.2。 它试图解决的许多依赖项似乎并不存在:如果我试图在浏览器中打开url,我只得到“请求路径未找到”。例子如下: 这种行为浪费了很多时间,没有任何价值。是否可以避免不存在的路径或最

  • 本文向大家介绍MongoDB游标超时问题的4种解决方法,包括了MongoDB游标超时问题的4种解决方法的使用技巧和注意事项,需要的朋友参考一下 当我们使用Python从MongoDB里面读取数据时,可能会这样写代码: 短短4行代码,读取MongoDB里面的每一行数据,然后传入parse_data做处理。处理完成以后再读取下一行。逻辑清晰而简单,能有什么问题?只要parse_data(row)不报错

  • 本文向大家介绍Python使用urllib模块的urlopen超时问题解决方法,包括了Python使用urllib模块的urlopen超时问题解决方法的使用技巧和注意事项,需要的朋友参考一下 在新的公司开始上班,今天工作的主题内容是市场部门需要抓取一些论坛用户的邮箱,以便发送营销邮件。 于是用了一个python脚本来执行,前面抓了几个都没有什么问题,后来碰到一个论坛,在执行urlopen的地方总是

  • 问题内容: 我有以下设置: 在路线中,我有: 路线:: get(’articles’,’ArticlesController @ index’); 控制器中的index方法很简单: 并在视图中: 我试图更换: 与 这样我才能真正显示最新的文章。我得到了错误: 调用堆栈为: …等等 我已经将控制器方法恢复到原来的状态,但是错误仍然存​​在。 您能告诉我如何解决这个问题吗? 问题答案: 超过30秒 的