解决VB6中的ADO超时问题

Bry*_*man 5 sql vb6 timeout ado

我在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
Run Code Online (Sandbox Code Playgroud)

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

更新:我运行SQL事件探查器,来自客户端计算机的实例进行更多读取,并且比SSMS中的查询的两个度量标准花费更多时间100倍.根据探查器,SSMS和客户端计算机的查询文本是相同的,因此我认为它不应该使用不同的执行计划.网络图书馆或提供商可能会对此产生任何影响吗?

Profiler统计:

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

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

KM.*_*KM. 3

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

看看你的执行计划:

在 SSMS 中,运行:

SET SHOWPLAN_ALL ON

然后运行您的查询,它不会产生预期的结果集,而是产生有关数据库如何检索数据的执行计划。大多数错误查询通常是表扫描(查看表中的每一行,这很慢),因此在列中查找单词“SCAN” StmtText。尝试找出为什么该表上没有使用索引(名称将在其中包含单词“SCAN”)。如果您加入多个表并且有多个 SCAN,则首先关注最大的表。

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

编辑
通过阅读你的问题,我不确定你的意思是否意味着无论行数如何,SSMS 总是很快,但随着行的增加,VB 会变慢。如果是这种情况,请检查以下内容:http://www.google.com/search?q=sql +server+fast+from+ssms+slow+from+application&hl=en&num=100&lr=&ft=i&cr=&safe=images

可能是这样的:参数嗅探或不一致的连接参数(ANSI null、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
Run Code Online (Sandbox Code Playgroud)

让你的查询像这样(这样你就可以在VB6中看到连接设置):

SELECT
    col1, col2
        ,SESSIONPROPERTY ('ARITHABORT') AS ARITHABORT
        ,SESSIONPROPERTY ('ANSI_WARNINGS') AS ANSI_WARNINGS
    FROM ...
Run Code Online (Sandbox Code Playgroud)