我刚刚经历了数据库故障,因为从磁盘上突然发送了异常数据。 我发现当我尝试插入大约一个日志表时会出现问题。 350万行。该表的ID列设置为IDENTITY,但没有索引或唯一约束。
CREATE TABLE [dbo].[IntegrationTestLog](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Ident] [varchar](50) NULL,
[Date] [datetime] NOT NULL,
[Thread] [varchar](255) NOT NULL,
[Level] [varchar](50) NOT NULL,
[Logger] [varchar](255) NOT NULL,
[Message] [varchar](max) NOT NULL,
[Exception] [varchar](max) NULL
)
此行触发的问题:
INSERT INTO IntegrationTestLog ([Ident],[Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@Ident, @log_date, @thread, @log_level, @logger, @message, @exception)
可能会有很多其他查询会触发它,但我肯定知道这个。
忍受我,因为我现在只是猜测,但如果索引丢失,身份播种过程会以某种方式减慢吗?是否有任何轻微的机会可以回到MAX(ID)查询来获取最新的条目? (可能不是)。我还没有成功找到有关该主题的任何深层技术信息。如果你知道一些文学或链接,请分享。
为了解决问题,我们最终截断了表格,这本身花了很长时间。我还将ID提升为主键。 然后我读了这篇文章:Identity columns并发现truncate确实触及了身份种子。
截断表(但不是删除)会将当前种子更新为 原始种子价值。
......这再一次只让我对身份种子更加怀疑。
我再次在黑暗中寻找 - 如果你有洞察力,请在这个问题上启发我。