เบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบŸเบฃเบต SQLIndexManager

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบ—เปˆเบฒเบ™เบฎเบนเป‰, เบ”เบฑเบ”เบชเบฐเบ™เบตเบกเบตเบšเบปเบ”เบšเบฒเบ”เบชเปเบฒเบ„เบฑเบ™เปƒเบ™ DBMS, เบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เบ„เบปเป‰เบ™เบซเบฒเป„เบงเปƒเบซเป‰เบเบฑเบšเบšเบฑเบ™เบ—เบถเบเบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป„เบงเป‰. เบ™เบฑเป‰เบ™เปเบกเปˆเบ™เป€เบซเบ”เบœเบปเบ™เบ—เบตเปˆเบงเปˆเบฒเบกเบฑเบ™เบกเบตเบ„เบงเบฒเบก เบชเบณ เบ„เบฑเบ™เบซเบผเบฒเบเบ—เบตเปˆเบˆเบฐเปƒเบซเป‰เบšเปเบฅเบดเบเบฒเบ™เบžเบงเบเป€เบ‚เบปเบฒเบขเปˆเบฒเบ‡เบ—เบฑเบ™เป€เบงเบฅเบฒ. เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบซเบผเบฒเบเบ‚เบญเบ‡เป€เบญเบเบฐเบชเบฒเบ™เป„เบ”เป‰เบ–เบทเบเบฅเบฒเบเบฅเบฑเบเบญเบฑเบเบชเบญเบ™เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเปเบฅเบฐเบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš, เบฅเบงเบกเบ—เบฑเบ‡เปƒเบ™เบญเบดเบ™เป€เบ•เบตเป€เบ™เบฑเบ”. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบซเบปเบงเบ‚เปเป‰เบ™เบตเป‰เป„เบ”เป‰เบ–เบทเบเบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™เปƒเบ™เบšเปเปˆเบ”เบปเบ™เบกเบฒเบ™เบตเป‰ เบชเบดเปˆเบ‡เบžเบดเบกเบ™เบตเป‰.

เบกเบตเบซเบผเบฒเบเบงเบดเบ—เบตเปเบเป‰เป„เบ‚เบ—เบตเปˆเบˆเปˆเบฒเบเปเบฅเบฐเบšเปเปˆเป€เบชเบเบ„เปˆเบฒเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เบตเป‰. เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡, เบกเบตเบเบฒเบ™เบเบฝเบกเบžเป‰เบญเบก เบเบฒเบ™เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆ, เบญเบตเบ‡เปƒเบชเปˆเบงเบดเบ—เบตเบเบฒเบ™เบ”เบฑเบ”เบ›เบฑเบšเบ”เบฑเบ”เบ™เบตเบ›เบฑเบšเบ•เบปเบงเปƒเบซเป‰เป€เปเบฒเบฐเบชเบปเบก.

เบ•เปเปˆเป„เบ›, เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เบ—เบตเปˆเบšเปเปˆเป€เบชเบเบ„เปˆเบฒ SQLIndexManager, เบ‚เบฝเบ™เป‚เบ”เบ AlanDenton.

เบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡เบ—เบฒเบ‡เบงเบดเบŠเบฒเบเบฒเบ™เบ•เบปเป‰เบ™เบ•เปเบฅเบฐเบซเบงเปˆเบฒเบ‡ SQLIndexManager เปเบฅเบฐเบˆเปเบฒเบ™เบงเบ™ analogues เบญเบทเปˆเบ™เป†เปเบกเปˆเบ™เปƒเบซเป‰เป‚เบ”เบเบœเบนเป‰เบ‚เบฝเบ™เป€เบญเบ‡ เบ—เบตเปˆเบ™เบตเป‰ ะธ เบ—เบตเปˆเบ™เบตเป‰.

เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบžเบฒเบเบ™เบญเบเบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™เปเบฅเบฐเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‡เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เปเบเป‰เป„เบ‚เบŠเบญเบšเปเบงเบ™เบตเป‰.

เบชเบปเบ™เบ—เบฐเบ™เบฒเบเปˆเบฝเบงเบเบฑเบšเบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เบ™เบตเป‰ เบ—เบตเปˆเบ™เบตเป‰.
เป€เบกเบทเปˆเบญเป€เบงเบฅเบฒเบœเปˆเบฒเบ™เป„เบ›, เบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™เปเบฅเบฐเบ‚เปเป‰เบšเบปเบเบžเปˆเบญเบ‡เบชเปˆเบงเบ™เปƒเบซเบเปˆเป„เบ”เป‰เบ–เบทเบเปเบเป‰เป„เบ‚.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เบเป‰เบฒเบงเป„เบ›เบชเบนเปˆ SQLIndexManager utility เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡.

เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ–เบทเบเบ‚เบฝเบ™เป„เบงเป‰เปƒเบ™ C# .NET Framework 4.5 เปƒเบ™ Visual Studio 2017 เปเบฅเบฐเปƒเบŠเป‰ DevExpress เบชเปเบฒเบฅเบฑเบšเปเบšเบšเบŸเบญเบก:

เบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบŸเบฃเบต SQLIndexManager

เปเบฅเบฐเป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบ™เบตเป‰:

เบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบŸเบฃเบต SQLIndexManager

เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบ—เบฑเบ‡เปเบปเบ”เปเบกเปˆเบ™เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เปƒเบ™เป„เบŸเบฅเปŒเบ•เปเปˆเป„เบ›เบ™เบตเป‰:

  1. เบ”เบฑเบ”เบŠเบฐเบ™เบต
  2. เบเบฒเบ™เบชเบญเบšเบ–เบฒเบก
  3. เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบ Query
  4. เบ‚เปเป‰เบกเบนเบ™เป€เบŠเบตเบšเป€เบงเบต

เบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบŸเบฃเบต SQLIndexManager

เป€เบกเบทเปˆเบญเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เปเบฅเบฐเบชเบปเปˆเบ‡เบ„เปเบฒเบ–เบฒเบกเป„เบ›เบซเบฒ DBMS, เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเป„เบ”เป‰เบ–เบทเบเป€เบŠเบฑเบ™เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

ApplicationName=โ€SQLIndexManagerโ€

เป€เบกเบทเปˆเบญเบ—เปˆเบฒเบ™เป€เบ›เบตเบ”เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™, เบ›เปˆเบญเบ‡เบขเป‰เบฝเบก modal เบˆเบฐเป€เบ›เบตเบ”เป€เบžเบทเปˆเบญเป€เบžเบตเปˆเบกเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ:
เบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบŸเบฃเบต SQLIndexManager

เบ—เบตเปˆเบ™เบตเป‰, เบเบฒเบ™เป‚เบซเบผเบ”เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ„เบปเบšเบ–เป‰เบงเบ™เบ‚เบญเบ‡เบ—เบธเบเบ•เบปเบงเบขเปˆเบฒเบ‡ MS SQL Server เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป„เบ”เป‰เบœเปˆเบฒเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™เบเบฑเบ‡เบšเปเปˆเบ—เบฑเบ™เป€เบฎเบฑเบ”เบงเบฝเบ.

เบ™เบญเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เป€เบžเบตเปˆเบกเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป‚เบ”เบเปƒเบŠเป‰เบ›เบธเปˆเบกเบŠเป‰เบฒเบเบชเบธเบ”เปƒเบ™เป€เบกเบ™เบนเบ•เบปเป‰เบ™เบ•เป:

เบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบŸเบฃเบต 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 Serverโ€‹:

เบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบŸเบฃเบต SQLIndexManager

เบกเบฑเบ™เป€เบ›เบฑเบ™เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเบ‚เปเป‰เบกเบนเบ™เบ‚เบฐเบซเบเบฒเบเปเบกเปˆเบ™เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบชเบดเบ”เบ—เบด. เบ–เป‰เบฒเบกเบต sysadmin, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบฅเบทเบญเบเป€เบญเบปเบฒเบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบเบกเบธเบกเป€เบšเบดเปˆเบ‡ sys.master_files. เบ–เป‰เบฒเบšเปเปˆเบกเบตเบชเบดเบ”เบ”เบฑเปˆเบ‡เบเปˆเบฒเบง, เบ‚เปเป‰เบกเบนเบ™เบซเบ™เป‰เบญเบเบˆเบฐเบ–เบทเบเบชเบปเปˆเบ‡เบ„เบทเบ™เบžเบฝเบ‡เปเบ•เปˆเป€เบžเบทเปˆเบญเบšเปเปˆเปƒเบซเป‰เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบŠเป‰เบฒเบฅเบปเบ‡.

เบ—เบตเปˆเบ™เบตเป‰เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบฅเบทเบญเบเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเปเบฅเบฐเบ„เบฅเบดเบเปƒเบชเปˆเบ›เบธเปˆเบก "OK".

เบ•เปเปˆเป„เบ›, script เบ•เปเปˆเป„เบ›เบ™เบตเป‰เบˆเบฐเบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบฅเบทเบญเบเป€เบžเบทเปˆเบญเบงเบดเป€เบ„เบฒเบฐเบชเบฐเบ–เบฒเบ™เบฐเบ‚เบญเบ‡เบ”เบฑเบ”เบชเบฐเบ™เบต:

เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบชเบฐเบ–เบฒเบ™เบฐเบžเบฒเบšเบ”เบฑเบ”เบŠเบฐเบ™เบต

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)
)

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เป„เบ”เป‰เบˆเบฒเบเบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบ•เบปเบงเป€เบญเบ‡, เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบŠเบปเปˆเบงเบ„เบฒเบงเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบฅเบทเป‰เบญเบเป†. เบ™เบตเป‰เปเบกเปˆเบ™เป€เบฎเบฑเบ”เป€เบžเบทเปˆเบญเบšเปเปˆเบกเบตเบเบฒเบ™เบฅเบงเบšเบฅเบงเบกเบ„เบทเบ™เปƒเบซเบกเปˆ, เปเบฅเบฐเปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆ, เปเบœเบ™เบเบฒเบ™เบชเบฒเบกเบฒเบ”เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เปƒเบ™เบ‚เบฐเบซเบ™เบฒเบ™เป€เบกเบทเปˆเบญเปƒเบชเปˆเบ‚เปเป‰เบกเบนเบ™, เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบเบฒเบ™เปƒเบชเปˆเบ•เบปเบงเปเบ›เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปเบกเปˆเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบžเบฝเบ‡เปเบ•เปˆเปƒเบ™เบซเบ™เบถเปˆเบ‡เบซเบปเบงเบ‚เปเป‰.

เบซเบผเบฑเบ‡เบˆเบฒเบเบ›เบฐเบ•เบดเบšเบฑเบ” script เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡, เบ›เปˆเบญเบ‡เบขเป‰เบฝเบกเบ—เบตเปˆเบกเบตเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ”เบฑเบ”เบชเบฐเบ™เบตเบˆเบฐเบ›เบฒเบเบปเบ”:

เบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบŸเบฃเบต SQLIndexManager

เบ™เบญเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบชเบฐเปเบ”เบ‡เบ‚เปเป‰เบกเบนเบ™เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบญเบทเปˆเบ™เป†เบ—เบตเปˆเบ™เบตเป‰, เป€เบŠเบฑเปˆเบ™:

  1. เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™
  2. เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เบ‚เบญเบ‡โ€‹เบžเบฒเบโ€‹เบชเปˆเบงเบ™โ€‹
  3. เบงเบฑเบ™เบ—เบต เปเบฅเบฐเป€เบงเบฅเบฒเบ‚เบญเบ‡เบเบฒเบ™เป‚เบ—เบ„เบฑเป‰เบ‡เบชเบธเบ”เบ—เป‰เบฒเบ
  4. เบเบฒเบ™เบšเบตเบšเบญเบฑเบ”
  5. เบเบธเปˆเบกเป„เบŸเบฅเปŒ

เปเบฅเบฐเบญเบทเปˆเบ™เป†.
เบฅเปเบฒเป‚เบžเบ‡เบ•เบปเบงเป€เบญเบ‡เบชเบฒเบกเบฒเบ”เบ›เบฑเบšเปเบ•เปˆเบ‡เป„เบ”เป‰:

เบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบŸเบฃเบต SQLIndexManager

เปƒเบ™เบ•เบฒเบฅเบฒเบ‡เบ‚เบญเบ‡เบ–เบฑเบ™ Fix, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบฅเบทเบญเบเบชเบดเปˆเบ‡เบ—เบตเปˆเบˆเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš. เบ™เบญเบเบˆเบฒเบเบ™เบตเป‰, เป€เบกเบทเปˆเบญเบเบฒเบ™เบชเบฐเปเบเบ™เบชเบณเป€เบฅเบฑเบ”, เบ„เบณเบชเบฑเปˆเบ‡เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบˆเบฐเบ–เบทเบเป€เบฅเบทเบญเบเป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ—เบตเปˆเป€เบฅเบทเบญเบ:

เบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบŸเบฃเบต SQLIndexManager

เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เป€เบฅเบทเบญเบเบ”เบฑเบ”เบŠเบฐเบ™เบตเบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡.

เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เป€เบกเบ™เบนเบ•เบปเป‰เบ™เบ•เป, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบšเบฑเบ™เบ—เบถเบ script เป„เบ”เป‰ (เบ›เบธเปˆเบกเบ”เบฝเบงเบเบฑเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบ”เบฑเบ”เบชเบฐเบ™เบตเบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡):

เบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบŸเบฃเบต SQLIndexManager

เปเบฅเบฐเบšเบฑเบ™เบ—เบถเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปƒเบ™เบฎเบนเบšเปเบšเบšเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™ (เบ›เบธเปˆเบกเบ”เบฝเบงเบเบฑเบ™เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบ›เบตเบ”เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเปเบฅเบฐเบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบ”เบฑเบ”เบชเบฐเบ™เบต):

เบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบŸเบฃเบต SQLIndexManager

เบ™เบญเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบ›เบฑเบšเบ›เบธเบ‡เบ‚เปเป‰เบกเบนเบ™เป‚เบ”เบเบเบฒเบ™เบ„เบฅเบดเบเปƒเบชเปˆเบ›เบธเปˆเบกเบ—เบตเปˆเบชเบฒเบกเบขเบนเปˆเป€เบšเบทเป‰เบญเบ‡เบŠเป‰เบฒเบเปƒเบ™เป€เบกเบ™เบนเบ•เบปเป‰เบ™เบ•เปเบ—เบตเปˆเบขเบนเปˆเบ‚เป‰เบฒเบ‡เปเบเป‰เบงเบ‚เบฐเบซเบเบฒเบเป„เบ”เป‰.

เบ›เบธเปˆเบกเบ—เบตเปˆเบกเบตเปเบงเปˆเบ™เบ‚เบฐเบซเบเบฒเบเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบฅเบทเบญเบเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบžเบทเปˆเบญเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒ.

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบšเปเปˆเบกเบตเบฅเบฐเบšเบปเบšเบเบฒเบ™เบŠเปˆเบงเบเป€เบซเบผเบทเบญเบ—เบตเปˆเบชเบปเบกเบšเบนเบ™เปเบšเบš. เป€เบžเบฒเบฐเบชเบฐเบ™เบฑเป‰เบ™, เบเบปเบ”เบ›เบธเปˆเบก "?" เบžเบฝเบ‡เปเบ•เปˆเบˆเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เบ›เปˆเบญเบ‡เบขเป‰เบฝเบก modal เบ›เบฐเบเบปเบ”เบกเบตเบ‚เปเป‰เบกเบนเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™เบเปˆเบฝเบงเบเบฑเบšเบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™เบŠเบญเบšเปเบง:

เบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบŸเบฃเบต SQLIndexManager

เบ™เบญเบเป€เบซเบ™เบทเบญเป„เบ›เบˆเบฒเบเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบ—เบตเปˆเบญเบฐเบ—เบดเบšเบฒเบเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡, เป€เบกเบ™เบนเบ•เบปเป‰เบ™เบ•เปเบกเบตเปเบ–เบšเบ„เบปเป‰เบ™เบซเบฒ:

เบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบŸเบฃเบต SQLIndexManager

เป€เบกเบทเปˆเบญเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบ”เบฑเบ”เบชเบฐเบ™เบต:

เบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบŸเบฃเบต SQLIndexManager

เบ—เปˆเบฒเบ™เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เบšเบฑเบ™เบ—เบถเบเบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเป„เบ”เป‰เบ›เบฐเบ•เบดเบšเบฑเบ”เบขเบนเปˆเบ”เป‰เบฒเบ™เบฅเบธเปˆเบกเบ‚เบญเบ‡เบ›เปˆเบญเบ‡เบขเป‰เบฝเบก:

เบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบŸเบฃเบต SQLIndexManager

เบขเบนเปˆเปƒเบ™เบ›เปˆเบญเบ‡เบขเป‰เบฝเบกเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ”เบฑเบ”เบชเบฐเบ™เบตเปเบฅเบฐเบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเปเบฒเบ™เบปเบ”เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบฅเบฐเบญเบฝเบ”เบญเปˆเบญเบ™เบเบงเปˆเบฒ:

เบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบŸเบฃเบต SQLIndexManager

เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹:

  1. เป€เบฎเบฑเบ”โ€‹เปƒเบซเป‰โ€‹เบกเบฑเบ™โ€‹เป€เบ›เบฑเบ™โ€‹เป„เบ›โ€‹เป„เบ”เป‰โ€‹เป€เบžเบทเปˆเบญโ€‹เบ„เบฑเบ”โ€‹เป€เบฅเบทเบญเบโ€‹เป€เบญเบปเบฒโ€‹เบเบฒเบ™โ€‹เบ›เบฑเบšโ€‹เบ›เบธเบ‡โ€‹เบชเบฐโ€‹เบ–เบดโ€‹เบ•เบดโ€‹เบšเปเปˆโ€‹เบžเบฝเบ‡โ€‹เปเบ•เปˆโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ”เบฑเบ”โ€‹เบŠเบฐโ€‹เบ™เบตโ€‹เปเบฅเบฐโ€‹เปƒเบ™โ€‹เบงเบดโ€‹เบ—เบตโ€‹เบเบฒเบ™โ€‹เบ—เบตเปˆโ€‹เปเบ•เบโ€‹เบ•เปˆเบฒเบ‡โ€‹เบเบฑเบ™ (เบ›เบฑเบšโ€‹เบ›เบธเบ‡โ€‹เบขเปˆเบฒเบ‡โ€‹เป€เบ•เบฑเบกโ€‹เบชเปˆเบงเบ™โ€‹เบซเบผเบทโ€‹เบšเบฒเบ‡โ€‹เบชเปˆเบงเบ™โ€‹)
  2. เป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบšเปเปˆเบžเบฝเบ‡เปเบ•เปˆเป€เบฅเบทเบญเบเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™, เปเบ•เปˆเบเบฑเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™ (เบ™เบตเป‰เปเบกเปˆเบ™เบชเบฐเบ”เบงเบเบซเบผเบฒเบเป€เบกเบทเปˆเบญเบกเบตเบซเบผเบฒเบเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡ MS SQL Server)
  3. เป€เบžเบทเปˆเบญเบ„เบงเบฒเบกเบขเบทเบ”เบขเบธเปˆเบ™เบซเบผเบฒเบเบ‚เบถเป‰เบ™เปƒเบ™เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰, เบกเบฑเบ™เบ–เบทเบเปเบ™เบฐเบ™เปเบฒเปƒเบซเป‰เบซเปเปˆเบ„เปเบฒเบชเบฑเปˆเบ‡เปƒเบ™เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เปเบฅเบฐเบชเบปเปˆเบ‡เบญเบญเบเป„เบ›เบซเบฒเบ„เปเบฒเบชเบฑเปˆเบ‡ PowerShell, เบ”เบฑเปˆเบ‡เบ—เบตเปˆเป€เบฎเบฑเบ”เปเบฅเป‰เบง, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡, เบ—เบตเปˆเบ™เบตเป‰:
  4. dbatools.io/commands
  5. เป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบšเบฑเบ™เบ—เบถเบเปเบฅเบฐเบ›เปˆเบฝเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบชเปˆเบงเบ™เบšเบธเบเบ„เบปเบ™เบ—เบฑเบ‡เบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ—เบฑเบ‡เบซเบกเบปเบ”เปเบฅเบฐ, เบ–เป‰เบฒเบˆเปเบฒเป€เบ›เบฑเบ™, เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡ MS SQL Server เปเบฅเบฐเปเบ•เปˆเบฅเบฐเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™.
  6. เบˆเบฒเบเบˆเบธเบ” 2 เปเบฅเบฐ 4, เบกเบฑเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบกเบ—เบตเปˆเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบชเป‰เบฒเบ‡เบเบธเปˆเบกเป‚เบ”เบเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เปเบฅเบฐเบเบธเปˆเบกเป‚เบ”เบ MS SQL Server instances, เป€เบŠเบดเปˆเบ‡เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเปเบกเปˆเบ™เบ„เบทเบเบฑเบ™.
  7. เบ„เบปเป‰เบ™เบซเบฒเบ”เบฑเบ”เบชเบฐเบ™เบตเบ—เบตเปˆเบŠเป‰เปเบฒเบเบฑเบ™ (เบ„เบปเบšเบ–เป‰เบงเบ™เปเบฅเบฐเบšเปเปˆเบชเบปเบกเบšเบนเบ™, เป€เบŠเบดเปˆเบ‡เปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เป€เบฅเบฑเบเบ™เป‰เบญเบเบซเบผเบทเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบžเบฝเบ‡เปเบ•เปˆเบขเบนเปˆเปƒเบ™เบ„เปเบฅเปเบฒเบฅเบงเบก)
  8. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบ SQLIndexManager เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบžเบฝเบ‡เปเบ•เปˆเบชเปเบฒเบฅเบฑเบš MS SQL Server DBMS, เบกเบฑเบ™เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบˆเปเบฒเป€เบ›เบฑเบ™เบ—เบตเปˆเบˆเบฐเบชเบฐเบ—เป‰เบญเบ™เปƒเบซเป‰เป€เบซเบฑเบ™เบ™เบตเป‰เปƒเบ™เบŠเบทเปˆ, เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡, เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰: SQLIndexManager เบชเปเบฒเบฅเบฑเบš MS SQL Server
  9. เบเป‰เบฒเบเบ—เบธเบเบชเปˆเบงเบ™เบ—เบตเปˆเบšเปเปˆเปเบกเปˆเบ™ GUI เบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เป‚เบกเบ”เบนเบ™เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ เปเบฅเบฐเบ‚เบฝเบ™เบ„เบทเบ™เปƒเบ™ .NET Core 2.1

เปƒเบ™โ€‹เป€เบงโ€‹เบฅเบฒโ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบ‚เบฝเบ™โ€‹, เบ‚เปเป‰ 6 เบ‚เบญเบ‡โ€‹เบ„เบงเบฒเบกโ€‹เบ›เบฒเบ”โ€‹เบ–เบฐโ€‹เบซเบ™เบฒโ€‹เปเบกเปˆเบ™โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบžเบฑเบ”โ€‹เบ—เบฐโ€‹เบ™เบฒโ€‹เบขเปˆเบฒเบ‡โ€‹เบซเป‰เบฒเบงโ€‹เบซเบฑเบ™โ€‹เปเบฅเบฐโ€‹เบกเบตโ€‹เบเบฒเบ™โ€‹เบชเบฐโ€‹เบซเบ™เบฑเบšโ€‹เบชเบฐโ€‹เบซเบ™เบนเบ™โ€‹เปƒเบ™โ€‹เบฎเบนเบšโ€‹เปเบšเบšโ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบŠเบญเบโ€‹เบซเบฒโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบŠโ€‹เป‰โ€‹เปเบฒโ€‹เบเบฑเบ™โ€‹เบ—เบตเปˆโ€‹เบชเบปเบกโ€‹เบšเบนเบ™โ€‹เปเบฅเบฐโ€‹เบ„เป‰เบฒเบโ€‹เบ„เบทโ€‹เบเบฑเบ™โ€‹:

เบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบŸเบฃเบต SQLIndexManager

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™