【发布时间】: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 行的组合框,那么您需要提供一个更好的用户界面(将它们过滤到可管理的数量)