Dị ka ị maara, indexes na-arụ ọrụ dị mkpa na DBMS, na-enye nyocha ngwa ngwa na ndekọ achọrọ. Ọ bụ ya mere o ji dị ezigbo mkpa ijere ha ozi n'oge. Edere ọtụtụ ihe gbasara nyocha na njikarịcha, gụnyere na ịntanetị. Dịka ọmụmaatụ, a tụlere isiokwu a n'oge na-adịbeghị anya .
Enwere ọtụtụ ngwọta akwụ ụgwọ na efu maka nke a. Dịka ọmụmaatụ, enwere ihe ejikere eme , dabere na usoro njikarịcha index na-agbanwe agbanwe.
Na-esote, ka anyị leba anya na ọrụ n'efu , onye dere ya .
Isi ọrụ dị iche n'etiti SQLIndexManager na ọtụtụ analogues ndị ọzọ nyere onye edemede n'onwe ya и .
N'isiokwu a, anyị ga-eleba anya n'èzí na ọrụ ahụ na ike ịrụ ọrụ nke ngwọta ngwanrọ a.
Na-akparịta uru a .
Ka oge na-aga, a na-edozi ọtụtụ n'ime nkọwa na mperi.
Yabụ, ka anyị gaa ugbu a gaa na Utility SQLIndexManager n'onwe ya.
Edere ngwa a na C # .NET Framework 4.5 na Visual Studio 2017 wee jiri DevExpress maka ụdị:
ma dị ka nke a:
A na-ewepụta arịrịọ niile na faịlụ ndị a:
- Index
- Ajụjụ
- Injin ajụjụ
- Ozi nkesa
Mgbe ị na-ejikọta na nchekwa data na izipu ajụjụ na DBMS, a na-abanye ngwa ahụ dịka ndị a:
ApplicationName=”SQLIndexManager” Mgbe ịmalitere ngwa a, windo modal ga-emeghe iji tinye njikọ:
Ebe a, loading a zuru ezu ndepụta niile MS SQL Server ihe omume inweta na mpaghara netwọk adịghị arụ ọrụ.
Ị nwekwara ike ịgbakwunye njikọ site na iji bọtịnụ aka ekpe na isi menu:
Na-esote, a ga-ewepụta ajụjụ ndị a na DBMS:
- Inweta ozi gbasara DBMS
SELECT ProductLevel = SERVERPROPERTY('ProductLevel') , Edition = SERVERPROPERTY('Edition') , ServerVersion = SERVERPROPERTY('ProductVersion') , IsSysAdmin = CAST(IS_SRVROLEMEMBER('sysadmin') AS BIT) - Inweta ndepụta ọdụ data dị na nkenke ha
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
Mgbe emechara edemede ndị a dị n'elu, windo ga-apụta nwere ozi dị nkenke gbasara ọdụ data nke MS SQL Server ahọpụtara:
Okwesiri iburu n'uche na egosiri ozi agbatịkwuru dabere na ikike. Ọ bụrụ n'ebe ahụ , mgbe ahụ ị nwere ike họrọ data si ele . Ọ bụrụ na enweghị ikike ndị dị otú ahụ, mgbe ahụ, a na-eweghachite obere data ka ọ ghara iwelata arịrịọ ahụ.
N'ebe a, ịkwesịrị ịhọrọ ọdụ data nke mmasị wee pịa bọtịnụ "OK".
Na-esote, a ga-eme ihe ederede na-esonụ maka nchekwa data ọ bụla ahọpụtara iji nyochaa ọnọdụ nke indexes:
Nyocha ọnọdụ index
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)
)
Dị ka a na-ahụ site na ajụjụ ndị ahụ n'onwe ha, a na-ejikarị tebụl oge eme ihe. A na-eme nke a ka ọ bụrụ na enweghi nchikota, na n'ihe banyere nnukwu atụmatụ, enwere ike ịmepụta atụmatụ ahụ n'otu oge mgbe ịtinye data, ebe ọ bụ na ịtinye mgbanwe tebụl ga-ekwe omume naanị n'otu eri.
Mgbe emechara edemede a dị n'elu, windo nwere tebụl ndeksi ga-apụta:
Ị nwekwara ike igosipụta ozi ndị ọzọ zuru ezu ebe a, dịka:
- nchekwa data
- ọnụ ọgụgụ nke ngalaba
- ụbọchị na oge oku ikpeazụ
- mkpakọ
- otu faịlụ
na ihe ndị ọzọ.
Enwere ike ịhazi ndị ọkà okwu n'onwe ha:
N'ime sel nke kọlụm Fix, ị nwere ike họrọ ihe a ga-eme n'oge kachasị mma. Ọzọkwa, mgbe nyochachara, a na-ahọrọ ihe ndabara dabere na ntọala ahọpụtara:
Ị ga-ahọrọ ndepụta nke achọrọ maka nhazi.
Iji menu isi, ị nwere ike chekwaa edemede ahụ (otu bọtịnụ ahụ na-amalite usoro njikarịcha index n'onwe ya):
ma chekwaa tebụl n'ụdị dị iche iche (otu bọtịnụ ahụ na-enye gị ohere imepe ntọala zuru ezu maka nyocha na ịkwalite index):
Ị nwekwara ike imelite ozi ahụ site na ịpị bọtịnụ nke atọ dị n'aka ekpe na isi menu n'akụkụ iko na-ebuli elu.
Bọtịnụ nwere iko na-ebuwanye ibu na-enye gị ohere ịhọrọ ọdụ data achọrọ maka ntụle.
Enweghị usoro enyemaka zuru oke ugbu a. Ya mere, pịa bọtịnụ "?" naanị ga-eme ka windo modal pụta nwere ozi bụ isi gbasara ngwaahịa ngwanro:
Na mgbakwunye na ihe niile akọwara n'elu, isi menu nwere ihe nchọta:
Mgbe ịmalite usoro njikarịcha index:
Ị nwekwara ike ịlele ndekọ nke omume emere na ala nke mpio ahụ:
Na mpio ntọala zuru ezu maka nyocha na njikarịcha index, ị nwere ike hazie nhọrọ ndị ọzọ dị nro:
Arịrịọ maka ngwa:
- mee ka o kwe omume ịmelite ọnụ ọgụgụ na-ahọrọ ọ bụghị naanị maka indexes yana kwa n'ụzọ dị iche iche (imelite nke ọma ma ọ bụ akụkụ ụfọdụ)
- mee ka o kwe omume ọ bụghị naanị ịhọrọ nchekwa data, kamakwa sava dị iche iche (nke a dị ezigbo mma mgbe enwere ọtụtụ oge nke MS SQL Server)
- Maka mgbanwe dị ukwuu n'iji ya eme ihe, a na-atụ aro ka ị kechie iwu ahụ n'ọbá akwụkwọ wee wepụta ha na iwu PowerShell, dịka a na-eme, dịka ọmụmaatụ, ebe a:
- mee ka o kwe omume ịchekwa ma gbanwee ntọala nkeonwe ma maka ngwa niile yana, ọ bụrụ na ọ dị mkpa, maka ihe atụ ọ bụla nke MS SQL Server na nchekwa data ọ bụla.
- Site na paragraf 2 na 4 ọ na-esote na ịchọrọ ịmepụta otu site na ọdụ data na otu site na MS SQL Server ihe atụ, nke ntọala bụ otu.
- Chọọ maka ndezigharị oyiri (zuru ezu na ezughi oke, nke dịtụ iche ma ọ bụ dị iche naanị na kọlụm agụnyere)
- Ebe ọ bụ na a na-eji SQLIndexManager naanị maka MS SQL Server DBMS, ọ dị mkpa iji gosipụta nke a n'aha, dịka ọmụmaatụ, dị ka ndị a: SQLIndexManager maka MS SQL Server.
- Bugharịa akụkụ niile na-abụghị GUI nke ngwa n'ime modul dị iche iche wee degharịa ha na NET Core 2.1
N'oge edere, ihe 6 nke ọchịchọ na-arụsi ọrụ ike ma enweela nkwado n'ụdị ịchọ ihe zuru ezu na nke yiri ya:
Isi mmalite
isi: www.habr.com
