索引是MS SQL数据库文件的对象。这些模式对象的作用类似于数据库的目录。它们用于改进MS SQL数据库表上的数据检索操作。
然而,随着时间的推移,由于连续的INSERT
和UPDATE
操作,表可能会变得碎片化。而且,像其他对象一样,索引也容易受损坏。如果索引损坏,您可能会收到类似以下错误:
Table error: table 'Items' (ID 1954106002). Data row does not have a matching index row in the index 'IX_Advertise_BrandCopy_Price_Stock' (ID 69). Possible missing or invalid keys for the index row matching:
Msg 8955, Level 16, State 1, Line 1
Data row (1:11226494:9) identified by (Id = 11078215) with index values 'AdvertiseFlag = 1 and BrandCopyParentId = 0 and NSFPPrice = 137.50 and NSFPQtyInStock = 0 and Id = 11078215'.
Msg 8951, Level 16, State 1, Line 1
要解决与索引损坏或索引碎片化水平增加相关的错误,您可以重建或重新组织索引。在本文中,我们将讨论如何重新组织和重建MS SQL中的索引服务器。我们还将提及一种先进的MS SQL数据库修复工具,可以快速、完全准确地从损坏的SQL数据库文件中恢复索引和其他对象。
检查索引的碎片百分比
在重新组织索引之前,您需要知道碎片化的百分比。您可以使用以下命令来检查索引碎片的百分比:
SELECT
OBJECT_NAME(object_id) tableName12,
index_id,
index_type_desc,
avg_fragmentation_in_percent,
page_count
FROM
sys.dm_db_index_physical_stats (
DB_ID('Adventureworks2019'),
OBJECT_ID('[Person].[Person]'),
NULL, NULL, 'DETAILED'
);
在SQL Server中重新组织索引
如果索引的碎片化水平在10到30之间,建议重新组织索引。您可以使用以下T-SQL代码来重新组织索引:
ALTER INDEX [PK_Person_BusinessEntityID] ON [Person].[Person]
REORGANIZE;
或者,您可以使用SQL Server Management Studio(SSMS)来重新组织索引。按照以下步骤进行:
- 在SSMS中连接到您的SQL Server实例。
- 在对象资源管理器中展开数据库。
- 展开表文件夹,然后展开索引文件夹。
- 右键单击需要重新组织的索引,然后单击重新组织。
在MS SQL中重建索引
如果碎片化较高,则可以重建索引。您可以使用DBCC DBREINDEX
命令来重建索引。以下是执行此命令的方法:
DBCC DBREINDEX
(
table_name
[ , index_name [ , fillfactor ] ]
)
[ WITH NO_INFOMSGS ]
此命令不支持空间索引和内存优化列存储索引。
或者,您可以使用ALTER INDEX
命令:
ALTER INDEX [PK_Person_BusinessEntityID] ON [Person].[Person]
REBUILD;
您还可以使用SSMS中的图形用户界面重建索引。以下是步骤:
- 在SSMS中,在对象资源管理器中展开包含需要重建索引的表的数据库。
- 展开表文件夹,然后展开需要重建索引的表。
- 展开索引文件夹,右键单击需要重建的索引,然后选择重建。
修复SQL Server数据库
如果重新组织或重建索引没有效果,那么您可以尝试使用DBCC CHECKDB
命令,并使用REPAIR_ALLOW_DATA_LOSS
选项来修复数据库。以下是如何使用该命令的步骤:
首先,使用以下命令将数据库模式更改为SINGLE_USER
:
ALTER DATABASE BusinessEntity SET SINGLE_USER
接下来,运行以下DBCC CHECKDB
命令来修复数据库:
DBCC CHECKDB (N ’BusinessEntity’, REPAIR_ALLOW_DATA_LOSS) WITH ALL_ERRORMSGS, NO_INFOMSGS;
GO
修复后,通过执行以下命令将数据库模式设置为MULTI_USER
:
ALTER DATABASE BusinessEntity SET MULTI_USER
上述DBCC CHECKDB
命令可以帮助您解决与索引损坏相关的所有错误。它可以修复SQL数据库中的聚集索引和非聚集索引。但是,它不能保证完全数据恢复,可能会导致数据丢失。为了防止数据丢失,您可以使用专业的MS SQL修复工具。它们采用先进的算法,可以从损坏的数据库中恢复所有对象,包括聚集索引和非聚集索引、存储过程、触发器等。
结论
您可以通过重新组织或重建索引来减少索引碎片化。本文详细解释了如何检查索引中的碎片化百分比以及如何重建索引。
Source:
https://dzone.com/articles/reorganize-and-rebuild-indexes-in-ms-sql