рдирд┐: рд╢реБрд▓реНрдХ рдЙрдкрдХрд░рдг SQLIndexManager рдХреЛ рд╕рдореАрдХреНрд╖рд╛

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

рдпрд╕рдХреЛ рд▓рд╛рдЧрд┐ рдзреЗрд░реИ рд╕рд╢реБрд▓реНрдХ рд░ рдирд┐: рд╢реБрд▓реНрдХ рд╕рдорд╛рдзрд╛рдирд╣рд░реВ рдЫрдиреНред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рддреНрдпрд╣рд╛рдБ рдПрдХ рддрдпрд╛рд░ рдЫ рд╕рдорд╛рдзрд╛рди, рдЕрдиреБрдХреВрд▓реА рд╕реВрдЪрдХрд╛рдВрдХ рдЕрдиреБрдХреВрд▓рди рд╡рд┐рдзрд┐рдорд╛ рдЖрдзрд╛рд░рд┐рддред

рдЕрд░реНрдХреЛ, рдирд┐: рд╢реБрд▓реНрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╣реЗрд░реМрдВ SQLIndexManager, рджреНрд╡рд╛рд░рд╛ рд▓реЗрдЦрдХ рдПрд▓рди рдбреЗрдиреНрдЯрди.

SQLIndexManager рд░ рдЕрдиреНрдп analogues рдХреЛ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдмреАрдЪрдХреЛ рдореБрдЦреНрдп рдкреНрд░рд╛рд╡рд┐рдзрд┐рдХ рднрд┐рдиреНрдирддрд╛ рд▓реЗрдЦрдХ рдЖрдлреИрд▓реЗ рджрд┐рдПрдХреЛ рдЫ рдпрд╣рд╛рдБ ╨╕ рдпрд╣рд╛рдБ.

рдпрд╕ рд▓реЗрдЦрдорд╛, рд╣рд╛рдореА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд░ рдпрд╕ рд╕рдлреНрдЯрд╡реЗрдпрд░ рд╕рдорд╛рдзрд╛рдирдХреЛ рдкрд░рд┐рдЪрд╛рд▓рди рдХреНрд╖рдорддрд╛рд╣рд░реВрдорд╛ рдмрд╛рд╣рд┐рд░реА рдирдЬрд░ рд▓рд┐рдиреЗрдЫреМрдВред

рдпрд╕ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдХреЛ рдмрд╛рд░реЗрдорд╛ рдЫрд▓рдлрд▓ рдЧрд░реНрджреИ рдпрд╣рд╛рдБ.
рд╕рдордп рдмрд┐рддреНрджреИ рдЬрд╛рдБрджрд╛, рдзреЗрд░реИрдЬрд╕реЛ рдЯрд┐рдкреНрдкрдгреА рд░ рдмрдЧрд╣рд░реВ рд╕рдЪреНрдпрд╛рдЗрдпреЛред

рддреНрдпрд╕реЛрднрдП, рдЕрдм SQLIndexManager рдЙрдкрдпреЛрдЧрд┐рддрд╛рдорд╛ рдЬрд╛рдФрдВред

рдЖрд╡реЗрджрди C# .NET Framework 4.5 рдорд╛ рднрд┐рдЬреБрдЕрд▓ рд╕реНрдЯреБрдбрд┐рдпреЛ 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 рдХреЛ рд╕рдореАрдХреНрд╖рд╛

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

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

рдирд┐: рд╢реБрд▓реНрдХ рдЙрдкрдХрд░рдг SQLIndexManager рдХреЛ рд╕рдореАрдХреНрд╖рд╛

рд╕реНрд░реЛрддрд╣рд░реВ

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди