Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Преструктуриране и реорганизиране на индекса на SQL Server

Здравейте

Всички индекси в базата данни на SQL Server ще бъдат фрагментирани След като свързаните таблици са получили много актуализации, изтрийте транзакции.

Индекс за повторно изграждане на SQL сървър

Ако индексът в таблицата е фрагментиран, тогава всички транзакции, свързани с тази таблица, ще бъдат много бавни. Така че SQL Server DBA трябва често да наблюдава индексите и кои от индексите са фрагментирани и кои не.

Индекс за реорганизиране на SQL сървър

Можете да използвате фрагментиран индекс със следната процедура. Тази процедура възстановява и реорганизира индекс зависи от неговата ситуация

CREATE PROC [INDEX_MAINTENANCE] @DBName VARCHAR(100)
AS BEGIN
            SET NOCOUNT ON;
            DECLARE
                  @OBJECT_ID INT,
                  @INDEX_NAME sysname,
                  @SCHEMA_NAME sysname,
                  @OBJECT_NAME sysname,
                  @AVG_FRAG float,
                  @command varchar(8000),
                  @RebuildCount int,
                  @ReOrganizeCount int
 
            CREATE TABLE #tempIM (
                  [ID] [INT] IDENTITY(1,1) NOT NULL PRIMARY KEY,
                  [INDEX_NAME] sysname NULL,
                  [OBJECT_ID] INT NULL,
                  [SCHEMA_NAME] sysname NULL,
                  [OBJECT_NAME] sysname NULL,
                  [AVG_FRAG] float
            )          
            SELECT @RebuildCount=0,@ReOrganizeCount=0
           
            --Get Fragentation values
            SELECT @command=
                  'Use ' + @DBName + ';
                  INSERT INTO #tempIM (OBJECT_ID, INDEX_NAME, SCHEMA_NAME, OBJECT_NAME, AVG_FRAG)
                  SELECT
                        ps.object_id,
                        i.name as IndexName,
                        OBJECT_SCHEMA_NAME(ps.object_id) as ObjectSchemaName,
                        OBJECT_NAME (ps.object_id) as ObjectName,
                        ps.avg_fragmentation_in_percent
                  FROM sys.dm_db_index_physical_stats (NULL, NULL, NULL , NULL, ''LIMITED'') ps
                  INNER JOIN sys.indexes i ON i.object_id=ps.object_id and i.index_id=ps.index_id
                  WHERE avg_fragmentation_in_percent > 5 AND ps.index_id > 0
                        and ps.database_id=DB_ID('''[email protected]+''')
                  ORDER BY avg_fragmentation_in_percent desc
                  '
           
            exec(@command)
            DECLARE c CURSOR FAST_FORWARD FOR
                  SELECT OBJECT_ID,INDEX_NAME, SCHEMA_NAME, OBJECT_NAME, AVG_FRAG
                  FROM #tempIM
            OPEN c
            FETCH NEXT FROM c INTO @OBJECT_ID, @INDEX_NAME, @SCHEMA_NAME, @OBJECT_NAME, @AVG_FRAG
            WHILE @@FETCH_STATUS = 0
            BEGIN
                  --Reorganize or Rebuild
                  IF @AVG_FRAG>30 BEGIN
                        SELECT @command = 'Use ' + @DBName + '; ALTER INDEX [' + @INDEX_NAME +'] ON ['
                                                 + @SCHEMA_NAME + '].[' + @OBJECT_NAME + '] REBUILD   WITH (ONLINE = ON  )';
                        SET @RebuildCount = @RebuildCount+1
                  END ELSE BEGIN
                        SELECT @command = 'Use ' + @DBName + '; ALTER INDEX [' + @INDEX_NAME +'] ON ['
                                                 + @SCHEMA_NAME + '].[' + @OBJECT_NAME + '] REORGANIZE ';
                        SET @ReOrganizeCount = @ReOrganizeCount+1
                  END
                                                
                  BEGIN TRY
                        EXEC (@command); 
                  END TRY
                  BEGIN CATCH
                  END CATCH
                 
                  FETCH NEXT FROM c INTO @OBJECT_ID, @INDEX_NAME, @SCHEMA_NAME, @OBJECT_NAME, @AVG_FRAG
            END
            CLOSE c
            DEALLOCATE c
           
            DROP TABLE #tempIM
           
            SELECT cast(@RebuildCount as varchar(5))+' index Rebuild,'+cast(@ReOrganizeCount as varchar(5))+' index Reorganize is done.' as Result
END  







Можете да изпълните тази процедура със следната заявка. Въведете правилно име на база данни вместо DEVECI и процедурата ще възстанови и реорганизира индексите на свързани бази данни.

exec dbo.INDEX_MAINTENANCE 'DEVECI';



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Кога сортирането на SQL Server се пренавива?

  2. Конфигуриране на групи за наличност на AlwaysOn - част 2

  3. Какво е DATALENGTH() в SQL Server?

  4. Събиране на данни за производителността с помощта на инструмента SQLDiag | Отстраняване на проблеми с производителността на SQL Server -6

  5. Агрегирана функция в заявка за актуализиране на SQL?