我使用SQL Server 2012已经超过2年了。在此期间,我添加了一些索引,但从未触及碎片。老实说,我没有意识到索引碎片。但今天我跑的时候,
SELECT
dbschemas.[name] as 'Schema',
dbtables.[name] as 'Table',
dbindexes.[name] as 'Index',
indexstats.avg_fragmentation_in_percent,
indexstats.page_count
FROM
sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS indexstats
INNER JOIN
sys.tables dbtables on dbtables.[object_id] = indexstats.[object_id]
INNER JOIN
sys.schemas dbschemas on dbtables.[schema_id] = dbschemas.[schema_id]
INNER JOIN
sys.indexes AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id]
AND indexstats.index_id = dbindexes.index_id
WHERE
indexstats.database_id = DB_ID()
ORDER BY
indexstats.avg_fragmentation_in_percent DESC
我得到了这些结果:
Schema Table Index avg_fragmentation_in_percent page_count
--------------------------------------------------------------------------------------------------------------
dbo ELMAH_Error IX_ELMAH_Error_App_Time_Seq 99.2438563327032 529
dbo ELMAH_Error PK_ELMAH_Error 98.8664987405542 794
dbo ProductsCountriesVariants PK__Products__3214EC270AC6A076 98 100
dbo Tags PK_Tags 91.2820512820513 195
dbo ProductGallery PK_ProductGallery 89.0909090909091 220
dbo devicecatalog IX_DeviceCatalog_NativeDeviceID 88.5964912280702 342
dbo Products IX_Products_RetailerID_ModelNumber 88.5245901639344 122
dbo Products IX_Products_RetailerID_SKU 82.7272727272727 110
--------------------------------------------------------------------------------------------------------------
我应该重建所有索引吗?它会影响我在生产中运行的数据库吗?有趣的是,我刚刚在几分钟前创建了IX_DeviceCatalog_NativeDeviceID
索引。
答案 0 :(得分:2)
重建索引将锁定表,除非您指定操作是在线完成的:
ALTER INDEX REBUILD WITH (ONLINE = ON)
仅适用于企业版及以上版本。
答案 1 :(得分:1)
您还可以查看重新组织是否有帮助,直到您可以执行完全重建。你需要做更多的研究,但基本上,根据需要经常重新组织,以便将你的碎片保持在20-30%之下,直到你能在非工作时间重建。忽略少于15-20页的任何内容,因为碎片不可靠。
具有NULL名称的索引是系统创建的临时索引,直到重新启动服务。