非常突然的查询超时,可以通过删除表

时间:2018-12-20 15:19:22

标签: sql-server azure-sql-database

我有一个存储HTTP请求的SQL日志表:

CREATE TABLE [dbo].[ApiHttpRequests](
[Id] [uniqueidentifier] NOT NULL,
[Environment] [nvarchar](10) NOT NULL,
[ApiRef] [nvarchar](10) NOT NULL,
[StampUtc] [datetime] NOT NULL,
[Host] [nvarchar](255) NOT NULL,
[Verb] [int] NOT NULL,
[Path] [nvarchar](255) NOT NULL,
[Query] [nvarchar](255) NULL,
[ContentLengthHeader] [bigint] NULL,
[AcceptHeader] [nvarchar](255) NULL,
[ContentTypeHeader] [nvarchar](255) NULL,
[UserAgentHeader] [nvarchar](255) NULL,
[OtherHeaders] [nvarchar](max) NULL,
[Body] [nvarchar](max) NULL,
[ResponseStampUtc] [datetime] NULL,
[StatusCode] [int] NULL,
[ResponseContentLengthHeader] [bigint] NULL,
[ResponseContentTypeHeader] [nvarchar](255) NULL,
[OtherResponseHeaders] [nvarchar](max) NULL,
[ResponseBody] [nvarchar](max) NULL,
[RowVersion] [timestamp] NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

这些ID确实是GUID,但它们是在服务器应用程序中生成的自动递增的ID。

查询开始时,记录以每秒3-5的速度插入,并在处理后再次更新。说到4,000,000条记录,表存储统计信息是16GB的总空间,16G的已用空间,7G的数据空间(所以我估计每条记录约4k)。

表上的索引:

  1. Id,集群主键(用于UPDATE)
  2. Environment(实际上可能未使用)
  3. Environment, StampUtc-用于清理旧记录

每分钟都会运行以下内容:

DELETE FROM ApiHttpRequests WHERE Environment=@p0 AND StampUtc<=@p1

此查询通常需要10毫秒左右的时间。

但是过了一会儿(今天大约为230万大关),它突然突然开始执行时间跳跃,并在30秒后反复超时。

要修复,我有效地截断了表(我实际上是在sp_rename表中进行操作,并立即使用相同的索引重新创建)。

索引没有显示很多碎片。

如何诊断/我在做什么错?我知道SQL Server对于这种循环缓冲区可能不是最好的-实际上我也正在登录到ELK堆栈,但这是一个备用存储,如果可能的话,我想保留它。

注意:我在这里使用SQL Azure

0 个答案:

没有答案