从昨天开始,我遇到了一个问题:当我从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
答案 0 :(得分:1)
您可能正在通过网络传输大量数据。这需要时间。
而不是返回article
,请尝试返回LEFT(article, 50)
以查看其是否存在数据量问题。
需要注意的一点是,SSMS会立即开始填充结果,而C#应用程序可能不会。
答案 1 :(得分:-1)
在SSMS中,请转到以下内容:工具 - >选项
然后转到查询执行 - > SQL Server - >先进
从这里开始,查看检查了哪些复选框,以及是否检查了某些内容,SSMS将在您从内部执行sproc时自动使用它,但是当您从C#(或任何客户端)执行它时使用)它将不会被使用。
我有同样的问题,发现我需要在我的sproc顶部包含以下行,并且它完美地运行:
设置ARITHABORT ON;