nvarchar(max)减慢存储过程

时间:2011-03-28 16:47:10

标签: c# tsql sql-server-2008 stored-procedures

从昨天开始,我遇到了一个问题:当我从c#调用存储过程时,它会持续> 5英寸,但是当我直接从SSMS(在服务器机器中)执行它时,它持续不到30秒。

我在论坛中进行了搜索,并通过这篇精彩的文章http://www.sommarskog.se/query-plan-mysteries.html,但没有结果。

我的proc中包含的脚本正在检索10列中一列名为“article”的列,类型为nvarchar(max)。

当我从Select中删除文章列时,我的proc会快速执行。

为了进一步说明我的逻辑,我创建了一个新的存储过程,只检索主键列和nvarchar(max)列。

我正在复制相同的行为。这是我的新proc = MyNewProc(从c#调用时持续> 5分钟,从SSMS调用服务器中的0 Secondes)

  CREATE PROCEDURE Student.GetStudents
  AS
  BEGIN
 SET NOCOUNT ON
 -----------------
 SELECT StudentId,Article
 FROM Students
 WHERE Degree=1

 END 

MyNewProc只返回2500行。

这是正常的吗?我该如何改进呢。

SELECT SUM(DATALENGTH(Article))FROM学生WHERE Degree = 1  结果是13885838

2 个答案:

答案 0 :(得分:1)

您可能正在通过网络传输大量数据。这需要时间。

而不是返回article,请尝试返回LEFT(article, 50)以查看其是否存在数据量问题。

需要注意的一点是,SSMS会立即开始填充结果,而C#应用程序可能不会。

答案 1 :(得分:-1)

在SSMS中,请转到以下内容:工具 - >选项

然后转到查询执行 - > SQL Server - >先进

从这里开始,查看检查了哪些复选框,以及是否检查了某些内容,SSMS将在您从内部执行sproc时自动使用它,但是当您从C#(或任何客户端)执行它时使用)它将不会被使用。

我有同样的问题,发现我需要在我的sproc顶部包含以下行,并且它完美地运行:

设置ARITHABORT ON;