Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Chỉ mục xây dựng lại và tổ chức lại máy chủ SQL

Xin chào

Tất cả các Chỉ mục trong cơ sở dữ liệu SQL Server sẽ bị phân mảnh Sau khi các bảng liên quan có nhiều bản cập nhật, hãy xóa các giao dịch.

Chỉ mục tạo lại máy chủ SQL

Nếu chỉ mục trong bảng bị phân mảnh thì tất cả các giao dịch liên quan đến bảng đó sẽ rất chậm. Vì vậy, SQL Server DBA nên thường xuyên theo dõi các chỉ mục và chỉ mục nào bị phân mảnh và chỉ mục nào không.

Chỉ mục sắp xếp lại máy chủ SQL

Bạn có thể sử dụng chỉ mục phân mảnh với quy trình sau. Quy trình xây dựng lại và tổ chức lại chỉ mục này tùy thuộc vào tình huống của nó

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  







Bạn có thể thực hiện thủ tục này với truy vấn sau. Nhập chính xác Tên cơ sở dữ liệu thay vì DEVECI và quy trình sẽ xây dựng lại và tổ chức lại các chỉ mục cơ sở dữ liệu liên quan.

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. so sánh một cột với một danh sách các giá trị trong t-sql

  2. Thu thập số lượng từ một truy vấn SQL

  3. Chuyển đổi ‘time’ thành ‘smalldatetime’ trong SQL Server (Ví dụ T-SQL)

  4. Tạo Cơ sở dữ liệu SQL Server với SQLOPS

  5. Sử dụng DBCC CLONEDATABASE để tạo bản sao chỉ lược đồ và thống kê của cơ sở dữ liệu người dùng trong SQL Server 2014 SP2