解决VB6中的ADO超时问题

时间:2010-12-01 18:15:50

标签: 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

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

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

Profiler统计信息:

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

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

1 个答案:

答案 0 :(得分:3)

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

查看执行计划:

在SSMS中,运行:

SET SHOWPLAN_ALL ON

然后运行您的查询,它不会产生预期的结果集,而是一个关于数据库如何检索数据的计划。大多数错误的查询通常是表扫描(查看表中的每一行,这很慢),因此在StmtText列中查找单词“SCAN”。试着找出为什么没有在该表上使用索引(名称将在那里用“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 nulls,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 ...