Sql server sql server中基于碎片的索引重建

Sql server sql server中基于碎片的索引重建,sql-server,stored-procedures,sql-server-2012,Sql Server,Stored Procedures,Sql Server 2012,所以,我一直在网上寻找解决问题的方法,我对DBA的事情还比较陌生,所以请不要对我苛刻:) 我有这段代码,它可以帮助我重建索引,如果它们被分割成一定的百分比。 它对重组有一个IF条件,但我不需要它,我需要修改代码,以便它查询特定数据库和模式的索引,并且仅当碎片大于5%时才重建 USE [master] GO /****** Object: StoredProcedure [dbo].[spKodyaz_Index_Maintenance] Script Date: 19.11.2012

所以,我一直在网上寻找解决问题的方法,我对DBA的事情还比较陌生,所以请不要对我苛刻:)

我有这段代码,它可以帮助我重建索引,如果它们被分割成一定的百分比。 它对重组有一个IF条件,但我不需要它,我需要修改代码,以便它查询特定数据库和模式的索引,并且仅当碎片大于5%时才重建

USE [master]
GO

/****** Object:  StoredProcedure [dbo].[spKodyaz_Index_Maintenance]    Script Date: 19.11.2012 19:10:11 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[al]
(
    @DatabaseId smallint
)
AS

DECLARE
    @dbname sysname,
    @schema_name sysname,
    @object_id int,
    @object_name sysname,
    @index_name sysname,
    @avg_fragmentation float,
    @sql nvarchar(max)

CREATE TABLE ##tmpIndexMaintenance (
    object_schema_name sysname NULL,
    object_name sysname NULL,
    object_id int NULL,
    index_name sysname NULL,
    avg_fragmentation_in_percent float NULL
)

SET @dbname = DB_NAME(@DatabaseId);

SET @sql = N'USE [' + @dbname + '];
INSERT INTO ##tmpIndexMaintenance
SELECT
    object_schema_name(ps.object_id) as ObjectSchema,
    object_name(ps.object_id) as ObjectName,
    ps.object_id ObjectId,
    i.name as IndexName,
    ps.avg_fragmentation_in_percent
FROM [' + @dbname + '].sys.dm_db_index_physical_stats(' + CONVERT(nvarchar(5), @DatabaseId) + ', null, null, null, null) ps
inner join [' + @dbname + '].sys.indexes i
    on i.object_id = ps.object_id and i.index_id = ps.index_id
WHERE
    avg_fragmentation_in_percent > 5 -- reorganize and rebuild
    and ps.index_id > 0
ORDER BY avg_fragmentation_in_percent DESC'

--print @sql
EXEC (@sql);

DECLARE indexFragmentation CURSOR FAST_FORWARD FOR SELECT * FROM ##tmpIndexMaintenance

OPEN indexFragmentation
FETCH NEXT FROM indexFragmentation INTO @schema_name, @object_name, @object_id, @index_name, @avg_fragmentation

WHILE @@FETCH_STATUS = 0
BEGIN

    IF @avg_fragmentation > 30 -- ReBuild index
        SELECT @sql = 'USE [' + @dbname + ']; ALTER INDEX [' + @index_name +'] ON [' + @schema_name + '].[' + @object_name + '] REBUILD WITH (ONLINE = ON)';

    ELSE -- ReOrganize index
        SELECT @sql = 'USE [' + @dbname + ']; ALTER INDEX [' + @index_name +'] ON [' + @schema_name + '].[' + @object_name + '] REORGANIZE';

    PRINT @sql;
    EXEC (@sql);

    FETCH NEXT FROM indexFragmentation INTO @schema_name, @object_name, @object_id, @index_name, @avg_fragmentation

END

CLOSE indexFragmentation
DEALLOCATE indexFragmentation

DROP TABLE ##tmpIndexMaintenance


GO 

游标已检索碎片超过5%的数据库。只需删除if条件并在默认情况下重建它们

WHILE@@FETCH\u STATUS=0
开始
选择@sql='使用['+@dbname+'];在['+@schema_name+']上更改索引['+@INDEX_name+']。['+@object_name+']重建为(ONLINE=ON)';
PRINT@sql;
EXEC(@sql);
从indexFragmentation中获取下一个到@schema\u name、@object\u name、@object\u id、@index\u name、@avg\u碎片

结束
在索引维护方面,重新发明轮子几乎没有什么意义。Ola Hallengren的脚本是无与伦比的,很可能满足您的所有需求。下载它,看一看,了解它的功能和原因@马金森,谢谢,但我现在觉得有点进步了