рдирд┐: рд╢реБрд▓реНрдХ SQLIndexManager рдЙрдкрдХрд░рдг рдХрд╛ рдЕрд╡рд▓реЛрдХрди

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЕрдиреБрдХреНрд░рдорд┐рдд DBMS рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддреЗ рд╣реИрдВ, рд╡рд╛рдВрдЫрд┐рдд рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП рдПрдХ рддреНрд╡рд░рд┐рдд рдЦреЛрдЬ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рд╕рдордп рдкрд░ рдврдВрдЧ рд╕реЗ рд╕реЗрд╡рд╛ рджреЗрдирд╛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рд╕рд╛рдордЧреНрд░реА рд▓рд┐рдЦреА рдЧрдИ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдкреНрд░рдХрд╛рд╢рди рдореЗрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдХреА рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╕рдореАрдХреНрд╖рд╛ рдХреА рдЧрдИ рдереАред

рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдИ рднреБрдЧрддрд╛рди рдФрд░ рдореБрдлреНрдд рд╕рдорд╛рдзрд╛рди рджреЛрдиреЛрдВ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрдиреБрдХреВрд▓реА рд╕реВрдЪрдХрд╛рдВрдХ рдЕрдиреБрдХреВрд▓рди рд╡рд┐рдзрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЯрд░реНрдирдХреА рд╕рдорд╛рдзрд╛рди рд╣реЛрддрд╛ рд╣реИ ред

рдЕрдЧрд▓рд╛, AlanDenton рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд┐рдд рдирд┐рд╢реБрд▓реНрдХ SQLIndexManager рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

SQLIndexManager рдФрд░ рдХрдИ рдЕрдиреНрдп рдПрдирд╛рд▓реЙрдЧреНрд╕ рдХреЗ рдмреАрдЪ рдореБрдЦреНрдп рддрдХрдиреАрдХреА рдЕрдВрддрд░ рд▓реЗрдЦрдХ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдпрдВ рдФрд░ рдпрд╣рд╛рдБ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ ред

рдЙрд╕реА рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рдФрд░ рдЗрд╕ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╕рдорд╛рдзрд╛рди рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВред

рдЗрд╕ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдкрд░ рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВ ред
рд╕рдордп рдХреЗ рд╕рд╛рде, рдЕрдзрд┐рдХрд╛рдВрд╢ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдФрд░ рдХреАрдбрд╝реЗ рддрдп рд╣реЛ рдЧрдП рд╣реИрдВред

рддреЛ, рдЕрдм SQLIndexManager рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред

рдЕрдиреБрдкреНрд░рдпреЛрдЧ рджреГрд╢реНрдп рд╕реНрдЯреВрдбрд┐рдпреЛ 2017 рдореЗрдВ C # .NET рдлреНрд░реЗрдорд╡рд░реНрдХ 4.5 рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд░реВрдкреЛрдВ рдХреЗ рд▓рд┐рдП DevExpress рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:



рдФрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:



рд╕рднреА рдЕрдиреБрд░реЛрдз рдирд┐рдореНрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ:

  1. рд╕реВрдЪреА
  2. рд╕рд╡рд╛рд▓
  3. QueryEngine
  4. ServerInfo



рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЬреБрдбрд╝рдиреЗ рдФрд░ DBMS рдХреЛ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреЗ рдмрд╛рдж, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

ApplicationName=тАЭSQLIndexManagerтАЭ 

рдЬрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдПрдХ рдХрдиреЗрдХреНрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЛрдбрд▓ рд╡рд┐рдВрдбреЛ рдЦреБрд▓рддреА рд╣реИ:


рдпрд╣рд╛рдБ рдкрд░ рд╕реНрдерд╛рдиреАрдп рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЙрдкрд▓рдмреНрдз MS SQL рд╕рд░реНрд╡рд░ рдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдкреВрд░реА рд╕реВрдЪреА рд▓реЛрдб рдХрд░рдирд╛ рдЕрднреА рддрдХ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдЖрдк рдореБрдЦреНрдп рдореЗрдиреВ рдкрд░ рдмрд╛рдИрдВ рдУрд░ рдХреЗ рдмрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдХрдиреЗрдХреНрд╢рди рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:



рдЕрдЧрд▓рд╛, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд DBMS рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

  1. DBMS рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
     SELECT ProductLevel = SERVERPROPERTY('ProductLevel') , Edition = SERVERPROPERTY('Edition') , ServerVersion = SERVERPROPERTY('ProductVersion') , IsSysAdmin = CAST(IS_SRVROLEMEMBER('sysadmin') AS BIT) 

  2. рдЕрдкрдиреЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдЙрдкрд▓рдмреНрдз рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
     SELECT DatabaseName = t.[name] , d.DataSize , DataUsedSize = CAST(NULL AS BIGINT) , d.LogSize , LogUsedSize = CAST(NULL AS BIGINT) , RecoveryModel = t.recovery_model_desc , LogReuseWait = t.log_reuse_wait_desc FROM sys.databases t WITH(NOLOCK) LEFT JOIN ( SELECT [database_id] , DataSize = SUM(CASE WHEN [type] = 0 THEN CAST(size AS BIGINT) END) , LogSize = SUM(CASE WHEN [type] = 1 THEN CAST(size AS BIGINT) END) FROM sys.master_files WITH(NOLOCK) GROUP BY [database_id] ) d ON d.[database_id] = t.[database_id] WHERE t.[state] = 0 AND t.[database_id] != 2 AND ISNULL(HAS_DBACCESS(t.[name]), 1) = 1 


рдЙрдкрд░реЛрдХреНрдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдПрдХ рд╡рд┐рдВрдбреЛ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдордПрд╕ SQL тАЛтАЛрд╕рд░реНрд╡рд░ рдХреЗ рдЪрдпрдирд┐рдд рдЙрджрд╛рд╣рд░рдг рдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рд╣реИ:



рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдЬрд╛рдирдХрд╛рд░реА рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рдпрджрд┐ sysadmin рд╣реИ , рддреЛ рдЖрдк sys.master_files рджреГрд╢реНрдп рд╕реЗ рдбреЗрдЯрд╛ рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рдпрджрд┐ рдРрд╕реЗ рдХреЛрдИ рдЕрдзрд┐рдХрд╛рд░ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЕрдиреБрд░реЛрдз рдХреЛ рдзреАрдорд╛ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рдбреЗрдЯрд╛ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рд░реБрдЪрд┐ рдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ "рдУрдХреЗ" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЕрдЧрд▓рд╛, рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рддрд╛рдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ:

рд╕реВрдЪрдХрд╛рдВрдХ рд╕реНрдерд┐рддрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
 declare @Fragmentation float=15; declare @MinIndexSize bigint=768; declare @MaxIndexSize bigint=1048576; declare @PreDescribeSize bigint=32768; SET NOCOUNT ON SET ARITHABORT ON SET NUMERIC_ROUNDABORT OFF IF OBJECT_ID('tempdb.dbo.#AllocationUnits') IS NOT NULL DROP TABLE #AllocationUnits CREATE TABLE #AllocationUnits ( ContainerID BIGINT PRIMARY KEY , ReservedPages BIGINT NOT NULL , UsedPages BIGINT NOT NULL ) INSERT INTO #AllocationUnits (ContainerID, ReservedPages, UsedPages) SELECT [container_id] , SUM([total_pages]) , SUM([used_pages]) FROM sys.allocation_units WITH(NOLOCK) GROUP BY [container_id] HAVING SUM([total_pages]) BETWEEN @MinIndexSize AND @MaxIndexSize IF OBJECT_ID('tempdb.dbo.#ExcludeList') IS NOT NULL DROP TABLE #ExcludeList CREATE TABLE #ExcludeList (ID INT PRIMARY KEY) INSERT INTO #ExcludeList SELECT [object_id] FROM sys.objects WITH(NOLOCK) WHERE [type] IN ('V', 'U') AND ( [is_ms_shipped] = 1 ) IF OBJECT_ID('tempdb.dbo.#Partitions') IS NOT NULL DROP TABLE #Partitions SELECT [object_id] , [index_id] , [partition_id] , [partition_number] , [rows] , [data_compression] INTO #Partitions FROM sys.partitions WITH(NOLOCK) WHERE [object_id] > 255 AND [rows] > 0 AND [object_id] NOT IN (SELECT * FROM #ExcludeList) IF OBJECT_ID('tempdb.dbo.#Indexes') IS NOT NULL DROP TABLE #Indexes CREATE TABLE #Indexes ( ObjectID INT NOT NULL , IndexID INT NOT NULL , IndexName SYSNAME NULL , PagesCount BIGINT NOT NULL , UnusedPagesCount BIGINT NOT NULL , PartitionNumber INT NOT NULL , RowsCount BIGINT NOT NULL , IndexType TINYINT NOT NULL , IsAllowPageLocks BIT NOT NULL , DataSpaceID INT NOT NULL , DataCompression TINYINT NOT NULL , IsUnique BIT NOT NULL , IsPK BIT NOT NULL , FillFactorValue INT NOT NULL , IsFiltered BIT NOT NULL , PRIMARY KEY (ObjectID, IndexID, PartitionNumber) ) INSERT INTO #Indexes SELECT ObjectID = i.[object_id] , IndexID = i.index_id , IndexName = i.[name] , PagesCount = a.ReservedPages , UnusedPagesCount = CASE WHEN ABS(a.ReservedPages - a.UsedPages) > 32 THEN a.ReservedPages - a.UsedPages ELSE 0 END , PartitionNumber = p.[partition_number] , RowsCount = ISNULL(p.[rows], 0) , IndexType = i.[type] , IsAllowPageLocks = i.[allow_page_locks] , DataSpaceID = i.[data_space_id] , DataCompression = p.[data_compression] , IsUnique = i.[is_unique] , IsPK = i.[is_primary_key] , FillFactorValue = i.[fill_factor] , IsFiltered = i.[has_filter] FROM #AllocationUnits a JOIN #Partitions p ON a.ContainerID = p.[partition_id] JOIN sys.indexes i WITH(NOLOCK) ON i.[object_id] = p.[object_id] AND p.[index_id] = i.[index_id] WHERE i.[type] IN (0, 1, 2, 5, 6) AND i.[object_id] > 255 DECLARE @files TABLE (ID INT PRIMARY KEY) INSERT INTO @files SELECT DISTINCT [data_space_id] FROM sys.database_files WITH(NOLOCK) WHERE [state] != 0 AND [type] = 0 IF @@ROWCOUNT > 0 BEGIN DELETE FROM i FROM #Indexes i LEFT JOIN sys.destination_data_spaces dds WITH(NOLOCK) ON i.DataSpaceID = dds.[partition_scheme_id] AND i.PartitionNumber = dds.[destination_id] WHERE ISNULL(dds.[data_space_id], i.DataSpaceID) IN (SELECT * FROM @files) END DECLARE @DBID INT , @DBNAME SYSNAME SET @DBNAME = DB_NAME() SELECT @DBID = [database_id] FROM sys.databases WITH(NOLOCK) WHERE [name] = @DBNAME IF OBJECT_ID('tempdb.dbo.#Fragmentation') IS NOT NULL DROP TABLE #Fragmentation CREATE TABLE #Fragmentation ( ObjectID INT NOT NULL , IndexID INT NOT NULL , PartitionNumber INT NOT NULL , Fragmentation FLOAT NOT NULL , PRIMARY KEY (ObjectID, IndexID, PartitionNumber) ) INSERT INTO #Fragmentation (ObjectID, IndexID, PartitionNumber, Fragmentation) SELECT i.ObjectID , i.IndexID , i.PartitionNumber , r.[avg_fragmentation_in_percent] FROM #Indexes i CROSS APPLY sys.dm_db_index_physical_stats(@DBID, i.ObjectID, i.IndexID, i.PartitionNumber, 'LIMITED') r WHERE i.PagesCount <= @PreDescribeSize AND r.[index_level] = 0 AND r.[alloc_unit_type_desc] = 'IN_ROW_DATA' AND i.IndexType IN (0, 1, 2) IF OBJECT_ID('tempdb.dbo.#Columns') IS NOT NULL DROP TABLE #Columns CREATE TABLE #Columns ( ObjectID INT NOT NULL , ColumnID INT NOT NULL , ColumnName SYSNAME NULL , SystemTypeID TINYINT NULL , IsSparse BIT , IsColumnSet BIT , MaxLen INT , PRIMARY KEY (ObjectID, ColumnID) ) INSERT INTO #Columns SELECT ObjectID = [object_id] , ColumnID = [column_id] , ColumnName = [name] , SystemTypeID = [system_type_id] , IsSparse = [is_sparse] , IsColumnSet = [is_column_set] , MaxLen = [max_length] FROM sys.columns WITH(NOLOCK) WHERE [object_id] IN (SELECT DISTINCT i.ObjectID FROM #Indexes i) IF OBJECT_ID('tempdb.dbo.#IndexColumns') IS NOT NULL DROP TABLE #IndexColumns CREATE TABLE #IndexColumns ( ObjectID INT NOT NULL , IndexID INT NOT NULL , OrderID INT NOT NULL , ColumnID INT NOT NULL , IsIncluded BIT NOT NULL , PRIMARY KEY (ObjectID, IndexID, ColumnID) ) INSERT INTO #IndexColumns SELECT ObjectID = [object_id] , IndexID = [index_id] , OrderID = CASE WHEN [is_included_column] = 0 THEN [key_ordinal] ELSE [index_column_id] END , ColumnID = [column_id] , IsIncluded = ISNULL([is_included_column], 0) FROM sys.index_columns ic WITH(NOLOCK) WHERE EXISTS( SELECT * FROM #Indexes i WHERE i.ObjectID = ic.[object_id] AND i.IndexID = ic.[index_id] AND i.IndexType IN (1, 2) ) IF OBJECT_ID('tempdb.dbo.#Lob') IS NOT NULL DROP TABLE #Lob CREATE TABLE #Lob ( ObjectID INT NOT NULL , IndexID INT NOT NULL , IsLobLegacy BIT , IsLob BIT , PRIMARY KEY (ObjectID, IndexID) ) INSERT INTO #Lob (ObjectID, IndexID, IsLobLegacy, IsLob) SELECT c.ObjectID , IndexID = ISNULL(i.IndexID, 1) , IsLobLegacy = MAX(CASE WHEN c.SystemTypeID IN (34, 35, 99) THEN 1 END) , IsLob = 0 FROM #Columns c LEFT JOIN #IndexColumns i ON c.ObjectID = i.ObjectID AND c.ColumnID = i.ColumnID WHERE c.SystemTypeID IN (34, 35, 99) GROUP BY c.ObjectID , i.IndexID IF OBJECT_ID('tempdb.dbo.#Sparse') IS NOT NULL DROP TABLE #Sparse CREATE TABLE #Sparse (ObjectID INT PRIMARY KEY) INSERT INTO #Sparse SELECT DISTINCT ObjectID FROM #Columns WHERE IsSparse = 1 OR IsColumnSet = 1 IF OBJECT_ID('tempdb.dbo.#AggColumns') IS NOT NULL DROP TABLE #AggColumns CREATE TABLE #AggColumns ( ObjectID INT NOT NULL , IndexID INT NOT NULL , IndexColumns NVARCHAR(MAX) , IncludedColumns NVARCHAR(MAX) , PRIMARY KEY (ObjectID, IndexID) ) INSERT INTO #AggColumns SELECT t.ObjectID , t.IndexID , IndexColumns = STUFF(( SELECT ', [' + c.ColumnName + ']' FROM #IndexColumns i JOIN #Columns c ON i.ObjectID = c.ObjectID AND i.ColumnID = c.ColumnID WHERE i.ObjectID = t.ObjectID AND i.IndexID = t.IndexID AND i.IsIncluded = 0 ORDER BY i.OrderID FOR XML PATH(''), TYPE).value('(./text())[1]', 'NVARCHAR(MAX)'), 1, 2, '') , IncludedColumns = STUFF(( SELECT ', [' + c.ColumnName + ']' FROM #IndexColumns i JOIN #Columns c ON i.ObjectID = c.ObjectID AND i.ColumnID = c.ColumnID WHERE i.ObjectID = t.ObjectID AND i.IndexID = t.IndexID AND i.IsIncluded = 1 ORDER BY i.OrderID FOR XML PATH(''), TYPE).value('(./text())[1]', 'NVARCHAR(MAX)'), 1, 2, '') FROM ( SELECT DISTINCT ObjectID, IndexID FROM #Indexes WHERE IndexType IN (1, 2) ) t SELECT i.ObjectID , i.IndexID , i.IndexName , ObjectName = o.[name] , SchemaName = s.[name] , i.PagesCount , i.UnusedPagesCount , i.PartitionNumber , i.RowsCount , i.IndexType , i.IsAllowPageLocks , u.TotalWrites , u.TotalReads , u.TotalSeeks , u.TotalScans , u.TotalLookups , u.LastUsage , i.DataCompression , f.Fragmentation , IndexStats = STATS_DATE(i.ObjectID, i.IndexID) , IsLobLegacy = ISNULL(lob.IsLobLegacy, 0) , IsLob = ISNULL(lob.IsLob, 0) , IsSparse = CAST(CASE WHEN p.ObjectID IS NULL THEN 0 ELSE 1 END AS BIT) , IsPartitioned = CAST(CASE WHEN dds.[data_space_id] IS NOT NULL THEN 1 ELSE 0 END AS BIT) , FileGroupName = fg.[name] , i.IsUnique , i.IsPK , i.FillFactorValue , i.IsFiltered , a.IndexColumns , a.IncludedColumns FROM #Indexes i JOIN sys.objects o WITH(NOLOCK) ON o.[object_id] = i.ObjectID JOIN sys.schemas s WITH(NOLOCK) ON s.[schema_id] = o.[schema_id] LEFT JOIN #AggColumns a ON a.ObjectID = i.ObjectID AND a.IndexID = i.IndexID LEFT JOIN #Sparse p ON p.ObjectID = i.ObjectID LEFT JOIN #Fragmentation f ON f.ObjectID = i.ObjectID AND f.IndexID = i.IndexID AND f.PartitionNumber = i.PartitionNumber LEFT JOIN ( SELECT ObjectID = [object_id] , IndexID = [index_id] , TotalWrites = NULLIF([user_updates], 0) , TotalReads = NULLIF([user_seeks] + [user_scans] + [user_lookups], 0) , TotalSeeks = NULLIF([user_seeks], 0) , TotalScans = NULLIF([user_scans], 0) , TotalLookups = NULLIF([user_lookups], 0) , LastUsage = ( SELECT MAX(dt) FROM ( VALUES ([last_user_seek]) , ([last_user_scan]) , ([last_user_lookup]) , ([last_user_update]) ) t(dt) ) FROM sys.dm_db_index_usage_stats WITH(NOLOCK) WHERE [database_id] = @DBID ) u ON i.ObjectID = u.ObjectID AND i.IndexID = u.IndexID LEFT JOIN #Lob lob ON lob.ObjectID = i.ObjectID AND lob.IndexID = i.IndexID LEFT JOIN sys.destination_data_spaces dds WITH(NOLOCK) ON i.DataSpaceID = dds.[partition_scheme_id] AND i.PartitionNumber = dds.[destination_id] JOIN sys.filegroups fg WITH(NOLOCK) ON ISNULL(dds.[data_space_id], i.DataSpaceID) = fg.[data_space_id] WHERE o.[type] IN ('V', 'U') AND ( f.Fragmentation >= @Fragmentation OR i.PagesCount > @PreDescribeSize OR i.IndexType IN (5, 6) ) 


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕реНрд╡рдпрдВ рдкреНрд░рд╢реНрдиреЛрдВ рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдХреНрд╕рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдХреЛрдИ рдкреБрдирд░реНрдореВрд▓реНрдпрд╛рдВрдХрди рди рд╣реЛ, рдФрд░ рдПрдХ рдмрдбрд╝реА рдпреЛрдЬрдирд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдбреЗрдЯрд╛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддреЗ рд╕рдордп рдпреЛрдЬрдирд╛ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рддрд╛рд▓рд┐рдХрд╛ рдЪрд░ рдХреЗ рд╕рд╛рде рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдирд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдзрд╛рд░рд╛ рдореЗрдВ рд╕рдВрднрд╡ рд╣реИред

рдЙрдкрд░реЛрдХреНрдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдПрдХ рд╡рд┐рдВрдбреЛ рдЗрдВрдбреЗрдХреНрд╕ рдЯреЗрдмрд▓ рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ:



рдпрд╣рд╛рдВ рдЖрдк рдЕрдиреНрдп рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рднреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ:

  1. рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕
  2. рд╡рд░реНрдЧреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛
  3. рдЕрдВрддрд┐рдо рдХреЙрд▓ рдХреА рддрд╛рд░реАрдЦ рдФрд░ рд╕рдордп
  4. рджрдмрд╛рд╡
  5. filegroup

рдФрд░ рдЯреАред рдбреАред
рдХреЙрд▓рдо рдЦреБрдж рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:



рдлрд┐рдХреНрд╕ рдХреЙрд▓рдо рдХреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ, рдЖрдк рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдиреБрдХреВрд▓рди рдХреЗ рджреМрд░рд╛рди рдХреНрдпрд╛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдЬрд╛рдПрдЧреАред рд╕реНрдХреИрдирд┐рдВрдЧ рдкреВрд░реА рд╣реЛрдиреЗ рдкрд░, рдЪрдпрдирд┐рдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:



рдЖрдкрдХреЛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╡рд╛рдВрдЫрд┐рдд рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдореБрдЦреНрдп рдореЗрдиреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдмрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рд╡рд╣реА рдмрдЯрди рдЗрдВрдбреЗрдХреНрд╕ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрд╡рдпрдВ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ):



рд╡рд┐рднрд┐рдиреНрди рд╕реНрд╡рд░реВрдкреЛрдВ рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╕рд╣реЗрдЬреЗрдВ (рдПрдХ рд╣реА рдмрдЯрди рдЖрдкрдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддреГрдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЦреЛрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ):



рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрд╡рд░реНрдзрдХ рдЧреНрд▓рд╛рд╕ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рдореБрдЦреНрдп рдореЗрдиреВ рдореЗрдВ рдмрд╛рдИрдВ рдУрд░ рддреАрд╕рд░реЗ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдЬрд╛рдирдХрд╛рд░реА рдЕрдкрдбреЗрдЯ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред

рдЖрд╡рд░реНрдзрдХ рдЧреНрд▓рд╛рд╕ рд╡рд╛рд▓рд╛ рдПрдХ рдмрдЯрди рдЖрдкрдХреЛ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рд╡рд╛рдВрдЫрд┐рдд рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЛрдИ рдкреВрд░реНрдг рд╕рд╣рд╛рдпрддрд╛ рдкреНрд░рдгрд╛рд▓реА рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, "рджрдмрд╛рдиреЗ" рдпрд╣ рдХреЗрд╡рд▓ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЙрддреНрдкрд╛рдж рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреБрдирд┐рдпрд╛рджреА рдЬрд╛рдирдХрд╛рд░реА рдпреБрдХреНрдд рдПрдХ рдореЛрдбрд▓ рд╡рд┐рдВрдбреЛ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛:



рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЦреНрдп рдореЗрдиреВ рдореЗрдВ рдПрдХ рдЦреЛрдЬ рдмрд╛рд░ рд╣реИ:



рд╕реВрдЪрдХрд╛рдВрдХ рдЕрдиреБрдХреВрд▓рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп:



рд╡рд┐рдВрдбреЛ рдХреЗ рдирд┐рдЪрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдЖрдк рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд▓реЙрдЧ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:



рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рд╡рд┐рдВрдбреЛ рдореЗрдВ, рдЖрдк рдЕрдзрд┐рдХ рд╕реВрдХреНрд╖реНрдо рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:



рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рд╕реБрдЭрд╛рд╡:

  1. рдХреЗрд╡рд▓ рдЖрдБрдХрдбрд╝реЛрдВ рдХреЗ рд▓рд┐рдП рд╣реА рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ (рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрджреНрдпрддрди рдпрд╛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ) рдЖрдБрдХрдбрд╝реЛрдВ рдХреЛ рдЪреБрдирд┐рдВрджрд╛ рд░реВрдк рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ
  2. рди рдХреЗрд╡рд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдмрд▓реНрдХрд┐ рд╡рд┐рднрд┐рдиреНрди рд╕рд░реНрд╡рд░ рднреА (рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдЬрдм рдПрдордПрд╕ SQL тАЛтАЛрд╕рд░реНрд╡рд░ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ)
  3. рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реЗрдкрди рдХреЗ рд▓рд┐рдП, рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдХрдорд╛рдВрдб рд▓рдкреЗрдЯрдирд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИ, рдФрд░ рдЙрдиреНрд╣реЗрдВ PowerShell рдХрдорд╛рдВрдб рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдирд╛, рдЬреИрд╕рд╛ рдХрд┐ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ: dbatools.io/commands
  4. рд╕рдВрдкреВрд░реНрдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ MS SQL рд╕рд░реНрд╡рд░ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рд╕рд╣реЗрдЬрдирд╛ рдФрд░ рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рд╣реИ
  5. рдЦрдВрдб 2 рдФрд░ 4 рд╕реЗ рдпрд╣ рдПрдордПрд╕ SQL тАЛтАЛрд╕рд░реНрд╡рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рд╕рдореВрд╣реЛрдВ рдкрд░ рд╕рдореВрд╣ рдмрдирд╛рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕рдорд╛рди рд╣реИрдВ
  6. рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░реЗрдВ (рдкреВрд░реНрдг рдФрд░ рдЕрдкреВрд░реНрдг, рдЬреЛ рдпрд╛ рддреЛ рдереЛрдбрд╝реЗ рдЕрд▓рдЧ рд╣реЛрддреЗ рд╣реИрдВ рдпрд╛ рдХреЗрд╡рд▓ рд╢рд╛рдорд┐рд▓ рдХреЙрд▓рдо рдореЗрдВ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВ)
  7. рдЪреВрдВрдХрд┐ SQLIndexManager рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ MS SQL рд╕рд░реНрд╡рд░ DBMS рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕ рдирд╛рдо рд╕реЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: SQL SQL рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП SQLIndexManager
  8. GUI рд╕реЗ рдЕрд▓рдЧ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЖрд╡реЗрджрди рдХреЗ рд╕рднреА рднрд╛рдЧреЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ .NET рдХреЛрд░ 2.1 рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВ

рд▓реЗрдЦрди рдХреЗ рд╕рдордп, рдЗрдЪреНрдЫрд╛рдУрдВ рдХреЗ рдЕрдиреБрдЪреНрдЫреЗрдж 6 рдХреЛ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдкреВрд░реНрдг рдФрд░ рд╕рдорд╛рди рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдорд░реНрдерди рд╣реИ:



рд╕реВрддреНрд░реЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ


Source: https://habr.com/ru/post/hi461277/


All Articles