索引是 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