【问题标题】:Resolving an ADO timeout issue in VB6解决 VB6 中的 ADO 超时问题
【发布时间】:2011-05-18 16:13:39
【问题描述】:

在 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 和客户端计算机的查询文本是相同的,所以我认为它不应该使用不同的执行计划。网络库或Provider会不会对此有影响?

分析器统计数据:

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

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

【问题讨论】:

  • 您是否尝试删除“对数据使用加密”?
  • 否,但这并不是一个真正可用的选项。这是一个客户端应用程序。
  • 您是否尝试过分析调用和looking at the execution plans 以验证这绝对不是参数嗅探问题?
  • 您正在用 6000 条记录填充组合框?
  • 如果您要填充一个包含 6000 行的组合框,那么您需要提供一个更好的用户界面(将它们过滤到可管理的数量)

标签: sql vb6 timeout ado


【解决方案1】:

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 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

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

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

【讨论】:

  • 根据原始帖子,查询在 SSMS 中运行不到一秒钟。查询的文本完全相同(通过 SQL Profiler 确认)。我看过执行计划,看起来不错。所有索引都在使用中。
  • 确实值得比较上面的会话属性,因为它们会影响性能,至少在发出 SET ARITHABORT ON 后尝试 ADO 查询
  • 这是 arithabort 属性。感谢您的帮助。
  • 我更改了数据库级别的设置。我认为它可能在几天前​​被重置,这突然导致了这个问题。我最好的猜测是当我们重新启动服务器时它被重置了。
猜你喜欢
  • 1970-01-01
  • 2013-05-18
  • 2010-12-06
  • 2021-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-20
相关资源
最近更新 更多