为什么会存储的过程返回表9列、89行使用这个代码需要60秒钟,以执行(.净1.1)当需要 < 1的第二个运行在SQL服务器的管理工作室吗?它正在运行的地方机使少/没有网络等待时间,快速开发机

Dim command As SqlCommand = New SqlCommand(procName, CreateConnection())
command.CommandType = CommandType.StoredProcedure
command.CommandTimeout = _commandTimeOut
Try
   Dim adapter As new SqlDataAdapter(command)
   Dim i as Integer
   For i=0 to parameters.Length-1
      command.Parameters.Add(parameters(i))
   Next
   adapter.Fill(tableToFill)
   adapter.Dispose()
Finally
   command.Dispose()
End Try

我放慢参数列类型(为此SQL它只有一个单一的参数)

parameters(0) = New SqlParameter("@UserID", SqlDbType.BigInt, 0, ParameterDirection.Input, True, 19, 0, "", DataRowVersion.Current, userID)

存储的过程只是个选择的发言,像这样:

ALTER PROC [dbo].[web_GetMyStuffFool]
   (@UserID BIGINT)
AS
SELECT Col1, Col2, Col3, Col3, Col3, Col3, Col3, Col3, Col3
FROM [Table]
有帮助吗?

解决方案

第一,确保分析的性能正常。例如,运行查询两次ADO.NET 看看如果第二次时间快得多的第一次。这消除了开销等应用程序汇编和调试的基础设施升。

接着,检查中的默认设置ADO.NET 和短程.例如,如果运行设置ARITHABORT在短程上,你可能会发现,它现在作为缓慢,如当使用ADO.NET.

我发现一旦被设ARITHABORT在短程导致储存proc要重新编译和/或不同的统计数据的使用。突然间这两个短程和ADO.NET 报告大致相同执行时间。

到检查,看看执行计划的每个运行,具体的syscacheobjects表。他们可能会是不同的。

运行'sp_recompile'在一个特定的存储的过程将下降相关的执行计划从高速缓存,然后让SQL服务器的一个机会来创建一个可能更为适当计划在下一个执行过程。

最后,你可以试试"核武器从轨道上"办法清理的整个过程和记忆缓存缓冲区的使用短程:

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

这样做之前,你测试你的查询,防止使用缓存的执行计划和以前的结果缓存。

其他提示

这里是我结束了这样做:

我执行以下SQL statement重建该指数在所有表格中的数据库:

EXEC <databasename>..sp_MSforeachtable @command1='DBCC DBREINDEX (''*'')', @replacechar='*'
-- Replace <databasename> with the name of your database

如果我想看到同样的行为在短程上,我跑了proc这样的:

SET ARITHABORT OFF
EXEC [dbo].[web_GetMyStuffFool] @UserID=1
SET ARITHABORT ON

另一个办法绕过这是加入这个代码:

MyConnection.Execute "SET ARITHABORT ON"

我遇到了同样的问题,但当我已经重建索引SQL表,它工作得很好,所以你也许想要考虑的重建指数就sql服务器侧

为什么不让它数据读取器,而不是起到桥梁作用,它看起来就像你有一个singel结果设定的,如果你不是要推动改变后在该数据库,并不需要施加的限制。净码你不应该使用的适配器。

编辑:

如果你需要它是一个数据表,你仍然可以拉动的数据,从数据库通过数据读取器然后在。净码使用的数据读取器来填充数据表。这仍然应该快于依靠的数据集,并起到桥梁作用

我不知道"为什么"它是如此缓慢本身,但作为马库斯是指出的比较管理工作室来填充数据集是苹果和桔子。数据集包含了很多的开销。我恨他们,也没有使用他们,如果我能帮助它。

你可能会有问题的不匹配的旧版本的SQL叠或一些这样的(esp给你显然陷。净1.1作)的框架内是可能试图做的数据库的效的"反射"来推断模式等等等等等等

一个要考虑的事情试试你的不幸的约束访问该数据库与数据读取器和建立自己的数据集。你应该能够找到的样本很容易地通过。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top