我有一个带有许多索引的分区表,所有索引都是对齐的,只有一个索引没有对齐。这是因为它通过多个分区来控制唯一性:
CREATE UNIQUE NONCLUSTERED INDEX [ix_uq_fltr_IdTransazioneRettificata_BM] ON [dbo].[Transazioni]
(
[IdTransazioneRettificata] ASC
)
WHERE ([id]>(10000000000.) AND [StatusFatturazione]<>(15) AND [IdTransazioneRettificata] IS NOT NULL)
ON [PRIMARY]
当我执行一个简单的删除操作时,会发生错误:
select id
into #t
from billing_prod2.dbo.Transazioni
where DataInserimento = '20240229'
and Data = '20240201'
--(162.321 rows affected)
alter table #t add primary key(id)
delete t
from billing_prod2.dbo.Transazioni t
join #t tt
on t.id = tt.id
SSMS 的输出:
消息 3624,级别 20,状态 1,第 11 行 系统断言检查失败。检查 SQL Server 错误日志以获取详细信息。通常,断言失败是由软件错误或数据损坏引起的。要检查数据库是否损坏,请考虑运行 DBCC CHECKDB。如果您同意在安装过程中将转储发送给 Microsoft,则小型转储将发送给 Microsoft。Microsoft 可能会在最新的 Service Pack 或技术支持的修补程序中提供更新。消息 596,级别 21,状态 1,第 10 行 无法继续执行,因为会话处于终止状态。消息 0,级别 20,状态 0,第 10 行 当前命令发生严重错误。如果有结果,则应丢弃。
错误日志的输出:
错误:17065,严重性:16,状态:1。 SQL Server 断言:文件:<“cxrowset.cpp”>,行 = 2026 失败断言 = 'cstePrefix >= 1' 范围在分区 id 列上缺少前缀。此错误可能与时间相关。如果重新运行该语句后错误仍然存在,请使用 DBCC CHECKDB 检查数据库的结构完整性,或重新启动服务器以确保内存中的数据结构未损坏。错误:3624,严重性:20,状态:1。系统断言检查失败。检查 SQL Server 错误日志以获取详细信息。通常,断言失败是由软件错误或数据损坏引起的。要检查数据库是否损坏,请考虑运行 DBCC CHECKDB。如果您同意在安装过程中将转储发送给 Microsoft,则小型转储将发送给 Microsoft。
还有一个足够长的转储文件,但如果它可能停止,我也可以粘贴它。
这些都没有明确说明哪个索引有问题。
DBCC CHECKDB
什么也没说,
dbcc checktable('dbo.transazioni') with NO_INFOMSGS, ALL_ERRORMSGS
什么也没说。
我唯一能猜到的应该是一个不经常使用的索引,否则错误日志中会报告更多错误,所以我从这个开始,不对齐且较少使用。
删除它后,错误就消失了,所以问题确实出在那个未对齐的索引上。
谁能解释一下吗?
数据库已启用 TDE。
Microsoft SQL Server 2019 (RTM-CU22-GDR) (KB5029378) - 15.0.4326.1 (X64) 2023 年 8 月 18 日 14:05:15 版权所有 (C) 2019 Microsoft Corporation 标准版(64 位),位于 Windows Server 2016 Datacenter 10.0 (内部版本 14393:)(虚拟机管理程序)