sql – 基于碎片结果自动化INDEX重建?

是否可以添加维护作业来检查索引碎片.如果大于50%,那么会自动重建这些索引?

索引大小可以从100MB到10GB不等.
sql 2005.

谢谢.

解决方法

我使用这个脚本.请注意,我建议您阅读我在这里使用的dmv,它们是sql2005中的隐藏的宝石.
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
CREATE TABLE #FragmentedIndexes
(
 DatabaseName SYSNAME,SchemaName SYSNAME,TableName SYSNAME,IndexName SYSNAME,[Fragmentation%] FLOAT
)

INSERT INTO #FragmentedIndexes
SELECT
 DB_NAME(DB_ID()) AS DatabaseName,ss.name AS SchemaName,OBJECT_NAME (s.object_id) AS TableName,i.name AS IndexName,s.avg_fragmentation_in_percent AS [Fragmentation%]
FROM sys.dm_db_index_physical_stats(db_id(),NULL,'SAMPLED') s
INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id]
AND s.index_id = i.index_id
INNER JOIN sys.objects o ON s.object_id = o.object_id
INNER JOIN sys.schemas ss ON ss.[schema_id] = o.[schema_id]
WHERE s.database_id = DB_ID()
AND i.index_id != 0
AND s.record_count > 0
AND o.is_ms_shipped = 0
DECLARE @RebuildIndexessql NVARCHAR(MAX)
SET @RebuildIndexessql = ''
SELECT
 @RebuildIndexessql = @RebuildIndexessql +
CASE
 WHEN [Fragmentation%] > 30
   THEN CHAR(10) + 'ALTER INDEX ' + QUOTENAME(IndexName) + ' ON '
      + QUOTENAME(SchemaName) + '.'
      + QUOTENAME(TableName) + ' REBUILD;'
 WHEN [Fragmentation%] > 10
    THEN CHAR(10) + 'ALTER INDEX ' + QUOTENAME(IndexName) + ' ON '
    + QUOTENAME(SchemaName) + '.'
    + QUOTENAME(TableName) + ' REORGANIZE;'
END
FROM #FragmentedIndexes
WHERE [Fragmentation%] > 10
DECLARE @StartOffset INT
DECLARE @Length INT
SET @StartOffset = 0
SET @Length = 4000
WHILE (@StartOffset < LEN(@RebuildIndexessql))
BEGIN
 PRINT SUBSTRING(@RebuildIndexessql,@StartOffset,@Length)
 SET @StartOffset = @StartOffset + @Length
END
PRINT SUBSTRING(@RebuildIndexessql,@Length)
EXECUTE sp_executesql @RebuildIndexessql
DROP TABLE #FragmentedIndexes

还要记住,这个脚本可以运行一段时间,并阻止访问你的表.除非有企业版sql可以在重建索引时锁定表.这将使用索引阻止对该表的所有查询,直到索引碎片整理完成.因此,不建议在维护窗口期间在运行时间内运行索引重建.如果您正在运行企业版,您可以使用ONLINE = ON选项来在线整理索引.这将使用更多的空间,但在碎片整理操作期间不会阻止/锁定您的表.

如果您需要更多信息,请发出提示.

更新:

如果您在较小的数据库上运行此查询,则可以在调用sys.dm_db_index_physical_stats时使用’DETAILED’参数.这可能是对这些指标的更详细的检查.评论中的讨论还将指出,在更大的表格上,可能值得进行SAMPLED扫描,因为这将有助于减少进行索引扫描所需的时间.

相关文章

(一)日志传送架构 (1.1)相关服务器 主服务器 :用于生产的服务器,上面运行这生产SQL Server数据库...
(一)事故背景 最近在SQL Server 2012生产数据库上配置完事物复制(发布订阅)后,生产数据库业务出现了...
(一)测试目的 目前公司使用的SQL SERVER 2012高可用环境为主备模式,其中主库可执行读写操作,备库既...
(一)背景个人在使用sql server时,用到了sql server的发布订阅来做主从同步,类似MySQL的异步复制。在...
UNION和OR谓词 找出 product 和 product2 中售价高于 500 的商品的基本信息. select * from product wh...
datawhale组队学习task03