рдирд┐рдГрд╢реБрд▓реНрдХ рдЯреВрд▓ SQLIndexManager рдХреА рд╕рдореАрдХреНрд╖рд╛

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

рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдИ рд╕рд╢реБрд▓реНрдХ рдФрд░ рдирд┐рдГрд╢реБрд▓реНрдХ рд╕рдорд╛рдзрд╛рди рдореМрдЬреВрдж рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд░реЗрдбреАрдореЗрдб рд╣реИ рдирд┐рд░реНрдгрдп, рдПрдХ рдЕрдиреБрдХреВрд▓реА рд╕реВрдЪрдХрд╛рдВрдХ рдЕрдиреБрдХреВрд▓рди рд╡рд┐рдзрд┐ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред

рдЖрдЧреЗ, рдЖрдЗрдП рдирд┐рдГрд╢реБрд▓реНрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдкрд░ рдирдЬрд░ рдбрд╛рд▓реЗрдВ SQLIndex рдкреНрд░рдмрдВрдзрдХ, рд▓реЗрдЦрдХ рдПрд▓рдирдбреЗрдВрдЯрди.

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

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

рдЗрд╕ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдкрд░ рдЪрд░реНрдЪрд╛ рдпрд╣рд╛рдВ.
рд╕рдордп рдХреЗ рд╕рд╛рде, рдЕрдзрд┐рдХрд╛рдВрд╢ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдФрд░ рдмрдЧ рдареАрдХ рдХрд░ рджрд┐рдП рдЧрдПред

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

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

рдирд┐рдГрд╢реБрд▓реНрдХ рдЯреВрд▓ SQLIndexManager рдХреА рд╕рдореАрдХреНрд╖рд╛

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

рдирд┐рдГрд╢реБрд▓реНрдХ рдЯреВрд▓ SQLIndexManager рдХреА рд╕рдореАрдХреНрд╖рд╛

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

  1. рд╕реВрдЪреА
  2. рдкреНрд░рд╢реНрди
  3. рдХреНрд╡реЗрд░реАрдЗрдВрдЬрди
  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 рдХреА рд╕рдореАрдХреНрд╖рд╛

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

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

рдирд┐рдГрд╢реБрд▓реНрдХ рдЯреВрд▓ SQLIndexManager рдХреА рд╕рдореАрдХреНрд╖рд╛

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

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ