Asp.net mvc SQL Server存储过程减慢查询速度

Asp.net mvc SQL Server存储过程减慢查询速度,asp.net-mvc,sql-server-2008,asp.net-mvc-4,stored-procedures,transactions,Asp.net Mvc,Sql Server 2008,Asp.net Mvc 4,Stored Procedures,Transactions,2014年8月19日-这个问题仍然悬而未决。尽管我还没有运行存储过程,但现在似乎正在发生这种情况。我还没有足够的经验来知道什么样的事情会导致SQL server出现这样的减速 我有个奇怪的问题。两件看似无关的事情现在已经关联了两次 首先,我在SQL Server 2008 Express R2中有一个存储过程,它被包装在一个事务中(下面的代码)。在交易中 超过某个日期的记录将从日志表复制到日志存档表中 然后从日志表中删除记录 数据库位于专用的托管服务器上 其次,我有一个网站页面,通过AJA

2014年8月19日-这个问题仍然悬而未决。尽管我还没有运行存储过程,但现在似乎正在发生这种情况。我还没有足够的经验来知道什么样的事情会导致SQL server出现这样的减速


我有个奇怪的问题。两件看似无关的事情现在已经关联了两次

首先,我在SQL Server 2008 Express R2中有一个存储过程,它被包装在一个事务中(下面的代码)。在交易中

  • 超过某个日期的记录将从日志表复制到日志存档表中
  • 然后从日志表中删除记录
数据库位于专用的托管服务器上

其次,我有一个网站页面,通过AJAX加载三个HTML表。隐藏的代码正在从日志表所在的同一数据库中读取数据,但没有一个数据库表重叠。使用实体框架6,通过LINQ到实体执行查询。它们是一些复杂的查询,但在正常情况下,AJAX调用启动后,每个HTML表的加载时间都不到5秒。该网站位于共享托管服务器上

网站上没有其他查询速度较慢。只有这两个。

出于某种原因,在我执行存储过程之后,网页上的AJAX查询会运行很长时间,以至于它们超时并且没有数据加载。我必须将超时窗口打开180秒,这样他们才有机会在超时之前加载

我能够使查询恢复到“正常”速度的唯一方法是停止SQL Server服务,然后重新启动它。之后,网页加载速度很快

我担心的是,我创建的存储过程会导致SQL Server中出现挂起的问题,或者内存问题,或者其他问题

以下是存储过程:

USE [Main]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      Jason Watts
-- Create date: 7/30/2014
-- Description: Archives every record in ErrorLogs 
--              older than 2 months into the 
--              ErroLogsArchive table.
-- =============================================
ALTER PROCEDURE [dbo].[ArchiveErrorLogs] 
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Init variables and error code
    Declare @TransactionCountOnEntry int;
    Declare @ErrorCode int;
    Select @ErrorCode = @@Error;

    -- Begin transaction processing for rollback option
    If @ErrorCode = 0
    Begin
       Select @TransactionCountOnEntry = @@TranCount;
       BEGIN TRANSACTION;
    End

    -- Get the current date/time
    Declare @ArchiveDT datetime;
    SELECT @ArchiveDT = DATEADD(m, -2, GETDATE());

    -- Copy the records from ErrorLogs to ErrorLogsArchive
    If @ErrorCode = 0
    Begin
        INSERT INTO ErrorLogsArchive (Area,Library,Method,ErrorLevel,[Message],Stacktrace,LogDate)
        SELECT Area,Library,Method,ErrorLevel,[Message],Stacktrace,LogDate
        FROM ErrorLogs
        WHERE LogDate <= @ArchiveDT;

        Select @ErrorCode = @@ERROR;
    End

    -- Delete the records from ErrorLogs
    If @ErrorCode = 0
    Begin
        DELETE FROM ErrorLogs
        WHERE LogDate <= @ArchiveDT;

        Select @ErrorCode = @@ERROR;
    End

    -- End the transaction
    If @@TranCount > @TransactionCountOnEntry
    Begin
       If @ErrorCode = 0
          COMMIT TRANSACTION;
       Else
          ROLLBACK TRANSACTION;
    End

    -- Return
    Return @ErrorCode;
END
使用[Main]
去
将ANSI_空值设置为ON
去
在上设置带引号的\u标识符
去
-- =============================================
--作者:杰森·瓦茨
--创建日期:2014年7月30日
--描述:存档错误日志中的每条记录
--超过2个月的
--埃罗洛格蜂窝表。
-- =============================================
更改过程[dbo]。[ArchiveErrorLogs]
作为
开始
--已添加SET NOCOUNT以防止额外的结果集丢失
--干扰SELECT语句。
不计数;
--初始化变量和错误代码
声明@TransactionCountOnEntry int;
声明@ErrorCode int;
选择@ErrorCode=@@Error;
--开始回滚选项的事务处理
如果@ErrorCode=0
开始
选择@TransactionCountOnEntry=@@TranCount;
开始交易;
终点
--获取当前日期/时间
声明@ArchiveDT datetime;
选择@ArchiveDT=DATEADD(m,-2,GETDATE());
--将记录从ErrorLogs复制到ErrorLogsArchive
如果@ErrorCode=0
开始
插入ErrorLogsArchive(区域、库、方法、ErrorLevel、[消息]、Stacktrace、LogDate)
选择区域、库、方法、错误级别、[消息]、堆栈跟踪、日志日期
从错误日志
其中LogDate重影清理导致性能降低。
阅读

简而言之,删除操作不会删除/删除行。“已删除”行标记为删除,然后(逐渐地)“内存”一次重新分配1-10页。这是SQL Server的“优化”


执行计划 由于存在试图“保留”已删除行的(read-up),这种过时的垃圾收集变得更加复杂。结果是有问题的群集F,类似于死锁,但不是退出

您可以使用


重影清理中的已知错误: 更糟糕的是,SQL Server存在一个已知的错误,无法正确处理数以百万计的重影记录


重新启动SQL Server: 我怀疑,除了刷新所有执行计划外,新启动的SQL Server更重视立即“清理”重影图像


改善效果追踪 来自SQLMag

那么什么时候删除删除的记录呢?删除记录的行为不会将该记录放在重影清理任务的工作队列中。直到SQL Server存储引擎再次读取已删除记录所在的数据库页,该页才会排队等待确定的重影记录删除。 ghost cleanup任务将查看要执行的任务队列,如果该队列为空,它将处理实例上的部分数据库,以查看数据库是否有要删除的ghost记录。确保快速释放重影记录使用的空间的唯一方法是执行诸如表扫描或索引重建之类的操作,以便存储引擎访问表中的所有页面,并将重影记录排队等待删除

  • 似乎受影响的表与日志表位于同一“页面”

  • 我从中得出结论,有很多选择。表格扫描可能会有所帮助


有很多地方可以隐藏真正的问题。根据我的经验,我只能建议几个地方:(1)日志文件大小在大的插入/删除后会变大。增加日志的文件大小或发送到另一个位置,(2)内存:在默认配置中,SQL Server可能会耗尽系统的所有内存。存档操作完成后检查RAM。日志文件相当大。数据库是3GB,日志是12GB。我应该对日志文件做些什么吗?同样,在服务器服务重新启动后,即使使用较大的日志文件,一切都正常运行