Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 非常慢的ExecuteOnQuery(存储过程)与使用SQL Server Management Studio的快速执行_C#_Sql Server_Stored Procedures - Fatal编程技术网

C# 非常慢的ExecuteOnQuery(存储过程)与使用SQL Server Management Studio的快速执行

C# 非常慢的ExecuteOnQuery(存储过程)与使用SQL Server Management Studio的快速执行,c#,sql-server,stored-procedures,C#,Sql Server,Stored Procedures,尽管围绕这个话题有很多问题,但这些建议似乎都不管用。 我有几个应该每天运行的存储过程——其中一些存储过程非常简单,另一些更复杂。但是,当使用SqlClient从C程序控制台调用时,即使是最简单的过程也会无限期地运行。 此客户端正在服务器上运行,实际运行时应升级为windows服务 到目前为止我都试过了 将ARITHABORT ON或OFF添加为连接初始化后的第一个执行。 将ARITHABORT ON或OFF添加为存储过程中的第一个命令 与重新编译一起使用 将ARITHABORT添加为全局配置。

尽管围绕这个话题有很多问题,但这些建议似乎都不管用。 我有几个应该每天运行的存储过程——其中一些存储过程非常简单,另一些更复杂。但是,当使用SqlClient从C程序控制台调用时,即使是最简单的过程也会无限期地运行。 此客户端正在服务器上运行,实际运行时应升级为windows服务

到目前为止我都试过了

将ARITHABORT ON或OFF添加为连接初始化后的第一个执行。 将ARITHABORT ON或OFF添加为存储过程中的第一个命令 与重新编译一起使用 将ARITHABORT添加为全局配置。 EXEC sys.sp_配置N'user options',N'64' 去 使用覆盖重新配置 去

所有存储过程都没有输入参数,我目前使用的最简单的存储过程是:

CREATE PROCEDURE [dbo].[_clean_messageLog]
WITH RECOMPILE
AS
BEGIN
    SET NOCOUNT ON;
    set arithabort on;

    DELETE FROM MessageLog WHERE Moment < GETDATE() - 60;

    DELETE FROM MessageLog WHERE Moment < GETDATE() - 30 AND [Status] = 200;
END
有人有什么建议吗

编辑 sqlHelper只是一个非常简单的基本包装器。但即使我将上述代码更改为:

foreach (var command in commands.Where(command => !string.IsNullOrWhiteSpace(command)))
            {
                var start = DateTime.Now;
                WriteEvent(string.Format("Starting: {0}", command), EventLogEntryType.Information);
                using (var sql = new SqlConnection(connectionString))
                {
                    sql.Open();
                    var sqlCommand = new SqlCommand(command.Trim(), sql) {CommandType = CommandType.StoredProcedure};
                    sqlCommand.ExecuteNonQuery();
                }
                WriteEvent(string.Format("Done in {0} seconds", DateTime.Now.Subtract(start).TotalSeconds), EventLogEntryType.Information);
            }
完全一样

编辑2 是否有一个选项可以将这些存储过程安排为由SQL Server自己在某个时间间隔或特定时间运行

解决了的 有一点,虽然我从来没有找到一个实际的C解决方案来解决我的问题,但使用SQL Server代理确实做到了这一点。由于死锁问题,C进程被锁定了,死锁有时也会发生在作业上,不像控制台程序那么多,但我们正在解决这个问题

是否有一个选项可以安排这些存储过程的运行

SQL Server本身在某个时间间隔或特定时间

是的,SQL Server代理可以根据特定的时间或间隔运行作业

SSMS->SQL Server代理->右键单击->新建作业->选择名称、数据库、代码和计划

完成后,可以单击“脚本”按钮并获取创建作业的脚本(如果需要)

您还可以使用T-SQL启动作业,例如从应用程序/另一个存储过程或触发器:

EXEC msdb.dbo.sp_start_job N'JobName';

从应用程序运行过程时,请运行探查器跟踪,并查看该过程是否真的花费了很长时间,而不是网络或应用程序。您确定从应用程序调用时,您的查询没有被其他应用程序阻止吗?请使用重新编译和重建索引进行删除。也许能帮你在我看来,你是在重新发明作业调度程序。在使用c应用程序时,你是否在与SP调用相同的事务中插入ocr更新MessageLog表?@Leon为查找死锁,我建议SP_whoisactive
EXEC msdb.dbo.sp_start_job N'JobName';