我有一个存储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)。
表上的索引:
Id
,集群主键(用于UPDATE)Environment
(实际上可能未使用)Environment, StampUtc
-用于清理旧记录每分钟都会运行以下内容:
DELETE FROM ApiHttpRequests WHERE Environment=@p0 AND StampUtc<=@p1
此查询通常需要10毫秒左右的时间。
但是过了一会儿(今天大约为230万大关),它突然突然开始执行时间跳跃,并在30秒后反复超时。
要修复,我有效地截断了表(我实际上是在sp_rename
表中进行操作,并立即使用相同的索引重新创建)。
索引没有显示很多碎片。
如何诊断/我在做什么错?我知道SQL Server对于这种循环缓冲区可能不是最好的-实际上我也正在登录到ELK堆栈,但这是一个备用存储,如果可能的话,我想保留它。
注意:我在这里使用SQL Azure