рдореЛрдлрдд рдЯреВрд▓ SQLIndexManager рдЪреЗ рдкреБрдирд░рд╛рд╡рд▓реЛрдХрди

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

рдпрд╛рд╕рд╛рдареА рдЕрдиреЗрдХ рд╕рд╢реБрд▓реНрдХ рдЖрдгрд┐ рд╡рд┐рдирд╛рдореВрд▓реНрдп рдЙрдкрд╛рдп рдЖрд╣реЗрдд. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдПрдХ рд░реЗрдбреАрдореЗрдб рдЖрд╣реЗ ╤А╨╡╤И╨╡╨╜╨╕╨╡, рдЕрдиреБрдХреВрд▓реА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рди рдкрджреНрдзрддреАрд╡рд░ рдЖрдзрд╛рд░рд┐рдд.

рдкреБрдвреЗ, рд╡рд┐рдирд╛рдореВрд▓реНрдп рдЙрдкрдпреБрдХреНрддрддрд╛ рдкрд╛рд╣реВ 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. рд╕рдВрдкреВрд░реНрдг рдНрдкреНрд▓рд┐рдХреЗрд╢рдирд╕рд╛рдареА рдЖрдгрд┐ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реНрдпрд╛рд╕, MS 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛