เชซเซเชฐเซ€ เชŸเซ‚เชฒ SQLIndexManager เชจเซ€ เชธเชฎเซ€เช•เซเชทเชพ

เชœเซ‡เชฎ เชคเชฎเซ‡ เชœเชพเชฃเซ‹ เช›เซ‹, DBMS เชฎเชพเช‚ เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เชญเซ‚เชฎเชฟเช•เชพ เชญเชœเชตเซ‡ เช›เซ‡, เชœเชฐเซ‚เชฐเซ€ เชฐเซ‡เช•เซ‹เชฐเซเชกเซเชธ เชฎเชพเชŸเซ‡ เชเชกเชชเซ€ เชถเซ‹เชง เชชเซ‚เชฐเซ€ เชชเชพเชกเซ‡ เช›เซ‡. เชคเซ‡เชฅเซ€ เชœ เชคเซ‡เชฎเชจเซ€ เชธเชฎเชฏเชธเชฐ เชธเซ‡เชตเชพ เช•เชฐเชตเซ€ เช–เซ‚เชฌ เชœ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เช›เซ‡. เช‡เชจเซเชŸเชฐเชจเซ‡เชŸ เชธเชนเชฟเชค เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช…เชจเซ‡ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เชเซ‡เชถเชจ เชตเชฟเชถเซ‡ เช˜เชฃเซ€ เชฌเชงเซ€ เชธเชพเชฎเช—เซเชฐเซ€ เชฒเช–เชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช† เชตเชฟเชทเชฏเชจเซ€ เชคเชพเชœเซ‡เชคเชฐเชฎเชพเช‚ เชธเชฎเซ€เช•เซเชทเชพ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€ เช† เชชเซเชฐเช•เชพเชถเชจ.

เช† เชฎเชพเชŸเซ‡ เช˜เชฃเชพ เชชเซ‡เช‡เชก เช…เชจเซ‡ เชซเซเชฐเซ€ เชธเซ‹เชฒเซเชฏเซเชถเชจเซเชธ เช›เซ‡. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชคเซเชฏเชพเช‚ เชเช• เชคเซˆเชฏเชพเชฐ เช›เซ‡ เช‰เช•เซ‡เชฒ, เช…เชจเซเช•เซ‚เชฒเชจเชถเซ€เชฒ เช‡เชจเซเชกเซ‡เช•เซเชธ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เชเซ‡เชถเชจ เชชเชฆเซเชงเชคเชฟ เชชเชฐ เช†เชงเชพเชฐเชฟเชค เช›เซ‡.

เช†เช—เชณ, เชšเชพเชฒเซ‹ เชซเซเชฐเซ€ เชฏเซเชŸเชฟเชฒเชฟเชŸเซ€ เชœเซ‹เชˆเช SQLIndexManager, เชฆเซเชตเชพเชฐเชพ เชฒเซ‡เช–เช• เชเชฒเชจเชกเซ‡เชจเซเชŸเชจ.

SQLIndexManager เช…เชจเซ‡ เช…เชจเซเชฏ เชธเช‚เช–เซเชฏเชพเชฌเช‚เชง เชเชจเชพเชฒเซ‹เช— เชตเชšเซเชšเซ‡เชจเซ‹ เชฎเซเช–เซเชฏ เชŸเซ‡เช•เชจเชฟเช•เชฒ เชคเชซเชพเชตเชค เชฒเซ‡เช–เช•เซ‡ เชชเซ‹เชคเซ‡ เช†เชชเซเชฏเซ‹ เช›เซ‡ เช…เชนเซ€เช‚ ะธ เช…เชนเซ€เช‚.

เช† เชฒเซ‡เช–เชฎเชพเช‚, เช…เชฎเซ‡ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เช…เชจเซ‡ เช† เชธเซ‹เชซเซเชŸเชตเซ‡เชฐ เชธเซ‹เชฒเซเชฏเซเชถเชจเชจเซ€ เช“เชชเชฐเซ‡เชถเชจเชฒ เช•เซเชทเชฎเชคเชพเช“ เชชเชฐ เชเช• เชฌเชนเชพเชฐ เชจเชœเชฐ เชจเชพเช–เซ€เชถเซเช‚.

เช† เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเชจเซ€ เชšเชฐเซเชšเชพ เช…เชนเซ€เช‚.
เชธเชฎเชฏ เชœเชคเชพเช‚, เชฎเซ‹เชŸเชพเชญเชพเช—เชจเซ€ เชŸเชฟเชชเซเชชเชฃเซ€เช“ เช…เชจเซ‡ เชญเซ‚เชฒเซ‹ เชธเซเชงเชพเชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€.

เชคเซ‹, เชšเชพเชฒเซ‹ เชนเชตเซ‡ SQLIndexManager เชฏเซเชŸเชฟเชฒเชฟเชŸเซ€ เชชเชฐ เชœ เช†เช—เชณ เชตเชงเซ€เช.

เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชตเชฟเชเซเชฏเซเช…เชฒ เชธเซเชŸเซเชกเชฟเชฏเซ‹ 4.5 เชฎเชพเช‚ C# .NET เชซเซเชฐเซ‡เชฎเชตเชฐเซเช• 2017 เชฎเชพเช‚ เชฒเช–เชพเชฏเซ‡เชฒ เช›เซ‡ เช…เชจเซ‡ เชซเซ‹เชฐเซเชฎเซเชธ เชฎเชพเชŸเซ‡ DevExpress เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡:

เชซเซเชฐเซ€ เชŸเซ‚เชฒ SQLIndexManager เชจเซ€ เชธเชฎเซ€เช•เซเชทเชพ

เช…เชจเซ‡ เช†เชจเชพ เชœเซ‡เชตเซ‹ เชฆเซ‡เช–เชพเชฏ เช›เซ‡:

เชซเซเชฐเซ€ เชŸเซ‚เชฒ SQLIndexManager เชจเซ€ เชธเชฎเซ€เช•เซเชทเชพ

เชฌเชงเซ€ เชตเชฟเชจเช‚เชคเซ€เช“ เชจเซ€เชšเซ‡เชจเซ€ เชซเชพเช‡เชฒเซ‹เชฎเชพเช‚ เชœเชจเชฐเซ‡เชŸ เชฅเชพเชฏ เช›เซ‡:

  1. เช‡เชจเซเชกเซ‡เช•เซเชธ
  2. เช•เซเชตเซ‡เชฐเซ€
  3. QueryEngine
  4. เชธเชฐเซเชตเชฐ เชฎเชพเชนเชฟเชคเซ€

เชซเซเชฐเซ€ เชŸเซ‚เชฒ SQLIndexManager เชจเซ€ เชธเชฎเซ€เช•เซเชทเชพ

เชกเซ‡เชŸเชพเชฌเซ‡เช เชธเชพเชฅเซ‡ เช•เชจเซ‡เช•เซเชŸ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เช…เชจเซ‡ DBMS เชจเซ‡ เช•เซเชตเซ‡เชฐเซ€ เชฎเซ‹เช•เชฒเชคเซ€ เชตเช–เชคเซ‡, เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชชเชฐ เชจเซ€เชšเซ‡ เชฎเซเชœเชฌ เชนเชธเซเชคเชพเช•เซเชทเชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡:

ApplicationName=โ€SQLIndexManagerโ€

เชœเซเชฏเชพเชฐเซ‡ เชคเชฎเซ‡ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฒเซ‹เช‚เชš เช•เชฐเซ‹ เช›เซ‹, เชคเซเชฏเชพเชฐเซ‡ เช•เชจเซ‡เช•เซเชถเชจ เช‰เชฎเซ‡เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฎเซ‹เชกเชฒ เชตเชฟเชจเซเชกเซ‹ เช–เซเชฒเชถเซ‡:
เชซเซเชฐเซ€ เชŸเซ‚เชฒ SQLIndexManager เชจเซ€ เชธเชฎเซ€เช•เซเชทเชพ

เช…เชนเซ€เช‚, เชธเซเชฅเชพเชจเชฟเช• เชจเซ‡เชŸเชตเชฐเซเช•เซเชธ เชชเชฐ เชธเซเชฒเชญ เชคเชฎเชพเชฎ MS SQL เชธเชฐเซเชตเชฐ เช‰เชฆเชพเชนเชฐเชฃเซ‹เชจเซ€ เชธเช‚เชชเซ‚เชฐเซเชฃ เชธเซ‚เชšเชฟ เชฒเซ‹เชก เช•เชฐเชตเชพเชจเซเช‚ เชนเชœเซ€ เช•เชพเชฎ เช•เชฐเชคเซเช‚ เชจเชฅเซ€.

เชคเชฎเซ‡ เชฎเซเช–เซเชฏ เชฎเซ‡เชจเซ‚ เชชเชฐ เชธเซŒเชฅเซ€ เชกเชพเชฌเซ€ เชฌเชพเชœเซเชจเชพ เชฌเชŸเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เชจเซ‡เช•เซเชถเชจ เชชเชฃ เช‰เชฎเซ‡เชฐเซ€ เชถเช•เซ‹ เช›เซ‹:

เชซเซเชฐเซ€ เชŸเซ‚เชฒ SQLIndexManager เชจเซ€ เชธเชฎเซ€เช•เซเชทเชพ

เช†เช—เชณ, 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
    

เช‰เชชเชฐเซ‹เช•เซเชค เชธเซเช•เซเชฐเชฟเชชเซเชŸเซ‹ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เซเชฏเชพ เชชเช›เซ€, เชเช• เชตเชฟเชจเซเชกเซ‹ เชฆเซ‡เช–เชพเชถเซ‡ เชœเซ‡เชฎเชพเช‚ MS SQL เชธเชฐเซเชตเชฐเชจเชพ เชชเชธเช‚เชฆ เช•เชฐเซ‡เชฒ เช‰เชฆเชพเชนเชฐเชฃเชจเชพ เชกเซ‡เชŸเชพเชฌเซ‡เช เชตเชฟเชถเซ‡ เชธเช‚เช•เซเชทเชฟเชชเซเชค เชฎเชพเชนเชฟเชคเซ€ เชนเชถเซ‡:

เชซเซเชฐเซ€ เชŸเซ‚เชฒ SQLIndexManager เชจเซ€ เชธเชฎเซ€เช•เซเชทเชพ

เชคเซ‡ เชจเซ‹เช‚เชงเชตเซเช‚ เชฏเซ‹เช—เซเชฏ เช›เซ‡ เช•เซ‡ เชตเชฟเชธเซเชคเซƒเชค เชฎเชพเชนเชฟเชคเซ€ เช…เชงเชฟเช•เชพเชฐเซ‹เชจเชพ เช†เชงเชพเชฐเซ‡ เชฌเชคเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชœเซ‹ เชคเซเชฏเชพเช‚ 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)
)

เช•เซเชตเซ‡เชฐเซ€เชฎเชพเช‚เชฅเซ€ เชœ เชœเซ‹เชˆ เชถเช•เชพเชฏ เช›เซ‡, เช…เชธเซเชฅเชพเชฏเซ€ เช•เซ‹เชทเซเชŸเช•เซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช˜เชฃเซ€ เชตเชพเชฐ เชฅเชพเชฏ เช›เซ‡. เช† เชเชŸเชฒเชพ เชฎเชพเชŸเซ‡ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช•เซ‡ เชคเซเชฏเชพเช‚ เช•เซ‹เชˆ เชชเซเชจเชƒเชธเช‚เช•เชฒเชจ เชจ เชฅเชพเชฏ, เช…เชจเซ‡ เชฎเซ‹เชŸเซ€ เชฏเซ‹เชœเชจเชพเชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชกเซ‡เชŸเชพ เชฆเชพเช–เชฒ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เชชเซเชฒเชพเชจ เชธเชฎเชพเช‚เชคเชฐ เชฐเซ€เชคเซ‡ เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡, เช•เชพเชฐเชฃ เช•เซ‡ เช•เซ‹เชทเซเชŸเช• เชšเชฒเซ‹ เชฆเชพเช–เชฒ เช•เชฐเชตเชพเชจเซเช‚ เชซเช•เซเชค เชเช• เชฅเซเชฐเซ‡เชกเชฎเชพเช‚ เชœ เชถเช•เซเชฏ เช›เซ‡.

เช‰เชชเชฐเซ‹เช•เซเชค เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชเช•เซเชเซ‡เช•เซเชฏเซเชŸ เช•เชฐเซเชฏเชพ เชชเช›เซ€, เช‡เชจเซเชกเซ‡เช•เซเชธ เชŸเซ‡เชฌเชฒ เชธเชพเชฅเซ‡เชจเซ€ เชตเชฟเชจเซเชกเซ‹ เชฆเซ‡เช–เชพเชถเซ‡:

เชซเซเชฐเซ€ เชŸเซ‚เชฒ SQLIndexManager เชจเซ€ เชธเชฎเซ€เช•เซเชทเชพ

เชคเชฎเซ‡ เช…เชนเซ€เช‚ เช…เชจเซเชฏ เชตเชฟเช—เชคเชตเชพเชฐ เชฎเชพเชนเชฟเชคเซ€ เชชเชฃ เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹, เชœเซ‡เชฎ เช•เซ‡:

  1. เชกเซ‡เชŸเชพเชฌเซ‡เช
  2. เชตเชฟเชญเชพเช—เซ‹เชจเซ€ เชธเช‚เช–เซเชฏเชพ
  3. เช›เซ‡เชฒเซเชฒเชพ เช•เซ‰เชฒเชจเซ€ เชคเชพเชฐเซ€เช– เช…เชจเซ‡ เชธเชฎเชฏ
  4. เชธเซเช•เซเชตเชฟเช
  5. เชซเชพเช‡เชฒเช—เซเชฐเซเชช

เช…เชจเซ‡ เชคเซ‡เชฅเซ€ เชชเชฐ
เชธเซเชชเซ€เช•เชฐเซเชธ เชชเซ‹เชคเชพเชจเซ‡ เช•เชธเซเชŸเชฎเชพเช‡เช เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡:

เชซเซเชฐเซ€ เชŸเซ‚เชฒ SQLIndexManager เชจเซ€ เชธเชฎเซ€เช•เซเชทเชพ

เชซเชฟเช•เซเชธ เช•เซ‰เชฒเชฎเชจเชพ เช•เซ‹เชทเซ‹เชฎเชพเช‚, เชคเชฎเซ‡ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เชเซ‡เชถเชจ เชฆเชฐเชฎเชฟเชฏเชพเชจ เช•เชˆ เช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ เชคเซ‡ เชชเชธเช‚เชฆ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹. เช‰เชชเชฐเชพเช‚เชค, เชœเซเชฏเชพเชฐเซ‡ เชธเซเช•เซ‡เชจ เชชเซ‚เชฐเซเชฃ เชฅเชพเชฏ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เชชเชธเช‚เชฆ เช•เชฐเซ‡เชฒ เชธเซ‡เชŸเชฟเช‚เช—เซเชธเชจเชพ เช†เชงเชพเชฐเซ‡ เชกเชฟเชซเซ‹เชฒเซเชŸ เช•เซเชฐเชฟเชฏเชพ เชชเชธเช‚เชฆ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡:

เชซเซเชฐเซ€ เชŸเซ‚เชฒ SQLIndexManager เชจเซ€ เชธเชฎเซ€เช•เซเชทเชพ

เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชฎเชพเชŸเซ‡ เชคเชฎเชพเชฐเซ‡ เช‡เชšเซเช›เชฟเชค เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพเช“ เชชเชธเช‚เชฆ เช•เชฐเชตเซ€ เช†เชตเชถเซเชฏเช• เช›เซ‡.

เชฎเซเช–เซเชฏ เชฎเซ‡เชจเซ‚เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡, เชคเชฎเซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเซ‡ เชธเชพเชšเชตเซ€ เชถเช•เซ‹ เช›เซ‹ (เชคเซ‡ เชœ เชฌเชŸเชจ เช‡เชจเซเชกเซ‡เช•เซเชธ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เชเซ‡เชถเชจ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชชเซ‹เชคเซ‡ เชœ เชถเชฐเซ‚ เช•เชฐเซ‡ เช›เซ‡):

เชซเซเชฐเซ€ เชŸเซ‚เชฒ SQLIndexManager เชจเซ€ เชธเชฎเซ€เช•เซเชทเชพ

เช…เชจเซ‡ เช•เซ‹เชทเซเชŸเช•เชจเซ‡ เชตเชฟเชตเชฟเชง เชซเซ‹เชฐเซเชฎเซ‡เชŸเชฎเชพเช‚ เชธเชพเชšเชตเซ‹ (เชคเซ‡ เชœ เชฌเชŸเชจ เชคเชฎเชจเซ‡ เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพเช“เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช…เชจเซ‡ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เช เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชตเชฟเช—เชคเชตเชพเชฐ เชธเซ‡เชŸเชฟเช‚เช—เซเชธ เช–เซ‹เชฒเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡):

เชซเซเชฐเซ€ เชŸเซ‚เชฒ SQLIndexManager เชจเซ€ เชธเชฎเซ€เช•เซเชทเชพ

เชคเชฎเซ‡ เชฎเซ‡เช—เซเชจเชฟเชซเชพเชˆเช‚เช— เช—เซเชฒเชพเชธเชจเซ€ เชฌเชพเชœเซเชฎเชพเช‚ เชฎเซเช–เซเชฏ เชฎเซ‡เชจเซเชฎเชพเช‚ เชกเชพเชฌเซ€ เชฌเชพเชœเซเชจเชพ เชคเซเชฐเซ€เชœเชพ เชฌเชŸเชจ เชชเชฐ เช•เซเชฒเชฟเช• เช•เชฐเซ€เชจเซ‡ เชชเชฃ เชฎเชพเชนเชฟเชคเซ€ เช…เชชเชกเซ‡เชŸ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹.

เชฌเซƒเชนเชฆเชฆเชฐเซเชถเช• เช•เชพเชš เชธเชพเชฅเซ‡เชจเซเช‚ เชฌเชŸเชจ เชคเชฎเชจเซ‡ เชตเชฟเชšเชพเชฐเชฃเชพ เชฎเชพเชŸเซ‡ เช‡เชšเซเช›เชฟเชค เชกเซ‡เชŸเชพเชฌเซ‡เชธเซ‡เชธ เชชเชธเช‚เชฆ เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡.

เชนเชพเชฒเชฎเชพเช‚ เช•เซ‹เชˆ เชตเซเชฏเชพเชชเช• เชธเชนเชพเชฏ เชชเซเชฐเชฃเชพเชฒเซ€ เชจเชฅเซ€. เชคเซ‡เชฅเซ€, โ€œ?โ€ เชฌเชŸเชจ เชฆเชฌเชพเชตเซ€เชจเซ‡ เชธเซ‹เชซเซเชŸเชตเซ‡เชฐ เช‰เชคเซเชชเชพเชฆเชจ เชตเชฟเชถเซ‡ เชฎเซ‚เชณเชญเซ‚เชค เชฎเชพเชนเชฟเชคเซ€ เชงเชฐเชพเชตเชคเซ€ เชฎเซ‹เชกเชฒ เชตเชฟเชจเซเชกเซ‹ เชฆเซ‡เช–เชพเชตเชพเชจเซเช‚ เช•เชพเชฐเชฃ เชฌเชจเชถเซ‡:

เชซเซเชฐเซ€ เชŸเซ‚เชฒ SQLIndexManager เชจเซ€ เชธเชฎเซ€เช•เซเชทเชพ

เช‰เชชเชฐ เชตเชฐเซเชฃเชตเซ‡เชฒ เชฆเชฐเซ‡เช• เชตเชธเซเชคเซ เช‰เชชเชฐเชพเช‚เชค, เชฎเซเช–เซเชฏ เชฎเซ‡เชจเซ‚เชฎเชพเช‚ เชถเซ‹เชง เชฌเชพเชฐ เช›เซ‡:

เชซเซเชฐเซ€ เชŸเซ‚เชฒ SQLIndexManager เชจเซ€ เชธเชฎเซ€เช•เซเชทเชพ

เช‡เชจเซเชกเซ‡เช•เซเชธ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เชเซ‡เชถเชจ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชถเชฐเซ‚ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡:

เชซเซเชฐเซ€ เชŸเซ‚เชฒ SQLIndexManager เชจเซ€ เชธเชฎเซ€เช•เซเชทเชพ

เชคเชฎเซ‡ เชตเชฟเชจเซเชกเซ‹เชจเซ€ เชจเซ€เชšเซ‡ เช†เชชเซ‡เชฒเซ€ เช•เซเชฐเชฟเชฏเชพเช“เชจเซ‹ เชฒเซ‹เช— เชชเชฃ เชœเซ‹เชˆ เชถเช•เซ‹ เช›เซ‹:

เชซเซเชฐเซ€ เชŸเซ‚เชฒ SQLIndexManager เชจเซ€ เชธเชฎเซ€เช•เซเชทเชพ

เช‡เชจเซเชกเซ‡เช•เซเชธ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช…เชจเซ‡ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เชเซ‡เชถเชจ เชฎเชพเชŸเซ‡ เชตเชฟเช—เชคเชตเชพเชฐ เชธเซ‡เชŸเชฟเช‚เช—เซเชธ เชตเชฟเช‚เชกเซ‹เชฎเชพเช‚, เชคเชฎเซ‡ เชตเชงเซ เชธเซ‚เช•เซเชทเซเชฎ เชตเชฟเช•เชฒเซเชชเซ‹ เช—เซ‹เช เชตเซ€ เชถเช•เซ‹ เช›เซ‹:

เชซเซเชฐเซ€ เชŸเซ‚เชฒ SQLIndexManager เชจเซ€ เชธเชฎเซ€เช•เซเชทเชพ

เช…เชฐเชœเซ€ เชฎเชพเชŸเซ‡เชจเซ€ เชตเชฟเชจเช‚เชคเซ€เช“:

  1. เชฎเชพเชคเซเชฐ เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพเช“ เชฎเชพเชŸเซ‡ เชœ เชจเชนเซ€เช‚ เช…เชจเซ‡ เชตเชฟเชตเชฟเชง เชฐเซ€เชคเซ‡ (เชธเช‚เชชเซ‚เชฐเซเชฃเชชเชฃเซ‡ เช…เชชเชกเซ‡เชŸ เช…เชฅเชตเชพ เช†เช‚เชถเชฟเช• เชฐเซ€เชคเซ‡) เช†เช‚เช•เชกเชพเช“เชจเซ‡ เชชเชธเช‚เชฆเช—เซ€เชฏเซเช•เซเชค เชฐเซ€เชคเซ‡ เช…เชชเชกเซ‡เชŸ เช•เชฐเชตเชพเชจเซเช‚ เชถเช•เซเชฏ เชฌเชจเชพเชตเซ‡ เช›เซ‡.
  2. เชฎเชพเชคเซเชฐ เชกเซ‡เชŸเชพเชฌเซ‡เช เชœ เชจเชนเซ€เช‚, เชชเชฃ เชตเชฟเชตเชฟเชง เชธเชฐเซเชตเชฐเซเชธ เชชเชฃ เชชเชธเช‚เชฆ เช•เชฐเชตเชพเชจเซเช‚ เชถเช•เซเชฏ เชฌเชจเชพเชตเซ‹ (เชเชฎเชเชธ เชเชธเช•เซเชฏเซเชเชฒ เชธเชฐเซเชตเชฐเชจเชพ เช˜เชฃเชพ เช‰เชฆเชพเชนเชฐเชฃเซ‹ เชนเซ‹เชฏ เชคเซเชฏเชพเชฐเซ‡ เช† เช–เซ‚เชฌ เช…เชจเซเช•เซ‚เชณ เช›เซ‡)
  3. เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชตเชงเซ เชธเซเช—เชฎเชคเชพ เชฎเชพเชŸเซ‡, เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€เช“เชฎเชพเช‚ เช†เชฆเซ‡เชถเซ‹เชจเซ‡ เชฒเชชเซ‡เชŸเซ€เชจเซ‡ เชชเชพเชตเชฐเชถเซ‡เชฒ เช†เชฆเซ‡เชถเซ‹เชฎเชพเช‚ เช†เช‰เชŸเชชเซเชŸ เช•เชฐเชตเชพเชจเซเช‚ เชธเซ‚เชšเชจ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช…เชนเซ€เช‚:
  4. dbatools.io/commands
  5. เชธเชฎเช—เซเชฐ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฎเชพเชŸเซ‡ เช…เชจเซ‡ เชœเซ‹ เชœเชฐเซ‚เชฐเซ€ เชนเซ‹เชฏ เชคเซ‹, เชเชฎเชเชธ SQL เชธเชฐเซเชตเชฐ เช…เชจเซ‡ เชฆเชฐเซ‡เช• เชกเซ‡เชŸเชพเชฌเซ‡เชเชจเชพ เชฆเชฐเซ‡เช• เช‰เชฆเชพเชนเชฐเชฃ เชฎเชพเชŸเซ‡ เชตเซเชฏเช•เซเชคเชฟเช—เชค เชธเซ‡เชŸเชฟเช‚เช—เซเชธเชจเซ‡ เชธเชพเชšเชตเชตเชพเชจเซเช‚ เช…เชจเซ‡ เชฌเชฆเชฒเชตเชพเชจเซเช‚ เชถเช•เซเชฏ เชฌเชจเชพเชตเซ‡ เช›เซ‡.
  6. เชชเซ‹เชˆเชจเซเชŸ 2 เช…เชจเซ‡ 4 เชฅเซ€, เชคเซ‡ เช…เชจเซเชธเชฐเซ‡ เช›เซ‡ เช•เซ‡ เชคเชฎเซ‡ เชกเซ‡เชŸเชพเชฌเซ‡เช เชฆเซเชตเชพเชฐเชพ เชœเซ‚เชฅเซ‹ เช…เชจเซ‡ MS SQL เชธเชฐเซเชตเชฐ เช‰เชฆเชพเชนเชฐเชฃเซ‹ เชฆเซเชตเชพเชฐเชพ เชœเซ‚เชฅเซ‹ เชฌเชจเชพเชตเชตเชพ เชฎเชพเช‚เช—เซ‹ เช›เซ‹, เชœเซ‡เชจเชพ เชฎเชพเชŸเซ‡ เชธเซ‡เชŸเชฟเช‚เช—เซเชธ เชธเชฎเชพเชจ เช›เซ‡
  7. เชกเซเชชเซเชฒเชฟเช•เซ‡เชŸ เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพเช“ เชฎเชพเชŸเซ‡ เชถเซ‹เชงเซ‹ (เชธเช‚เชชเซ‚เชฐเซเชฃ เช…เชจเซ‡ เช…เชชเซ‚เชฐเซเชฃ, เชœเซ‡ เช•เชพเช‚ เชคเซ‹ เชธเชนเซ‡เชœ เช…เชฒเช— เช›เซ‡ เช…เชฅเชตเชพ เชซเช•เซเชค เชธเชฎเชพเชตเชฟเชทเซเชŸ เช•เซ‰เชฒเชฎเซเชธเชฎเชพเช‚ เช…เชฒเช— เช›เซ‡)
  8. SQLIndexManager เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชซเช•เซเชค MS SQL เชธเชฐเซเชตเชฐ DBMS เชฎเชพเชŸเซ‡ เชฅเชคเซ‹ เชนเซ‹เชตเชพเชฅเซ€, เชคเซ‡เชจเซ‡ เชจเชพเชฎเชฎเชพเช‚ เชชเซเชฐเชคเชฟเชฌเชฟเช‚เชฌเชฟเชค เช•เชฐเชตเซเช‚ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชจเซ€เชšเซ‡ เชฎเซเชœเชฌ: MS SQL เชธเชฐเซเชตเชฐ เชฎเชพเชŸเซ‡ SQLIndexManager
  9. เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเชพ เชคเชฎเชพเชฎ เชฌเชฟเชจ-GUI เชญเชพเช—เซ‹เชจเซ‡ เช…เชฒเช— เชฎเซ‹เชกเซเชฏเซเชฒเชฎเชพเช‚ เช–เชธเซ‡เชกเซ‹ เช…เชจเซ‡ เชคเซ‡เชฎเชจเซ‡ .NET Core 2.1 เชฎเชพเช‚ เชซเชฐเซ€เชฅเซ€ เชฒเช–เซ‹.

เชฒเซ‡เช–เชจ เชธเชฎเชฏเซ‡, เช‡เชšเซเช›เชพเช“เชจเซ€ เช†เช‡เชŸเชฎ 6 เชธเช•เซเชฐเชฟเชฏเชชเชฃเซ‡ เชตเชฟเช•เชธเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชฐเชนเซ€ เช›เซ‡ เช…เชจเซ‡ เชธเช‚เชชเซ‚เชฐเซเชฃ เช…เชจเซ‡ เชธเชฎเชพเชจ เชกเซเชชเซเชฒเชฟเช•เซ‡เชŸเซเชธ เชถเซ‹เชงเชตเชพเชจเชพ เชธเซเชตเชฐเซ‚เชชเชฎเชพเช‚ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชธเชฎเชฐเซเชฅเชจ เช›เซ‡:

เชซเซเชฐเซ€ เชŸเซ‚เชฒ SQLIndexManager เชจเซ€ เชธเชฎเซ€เช•เซเชทเชพ

เชธเซเชคเซเชฐเซ‹เชคเซ‹

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹