MSSQL SQL SERVER 인덱스 성능 개선
2023. 7. 14. 09:30ㆍ웹개발
728x90
인덱스의 조각이 많이 난 인덱스와 테이블명을 조회한다.
SELECT -- TOP 10 -- 상위 10개만
DB_NAME() AS DatabaseName
, OBJECT_NAME(S.OBJECT_ID) AS TableName
, I.NAME AS IndexName
, ROUND(AVG_FRAGMENTATION_IN_PERCENT, 2) AS Fragmentation
FROM SYS.DM_DB_INDEX_PHYSICAL_STATS(DB_ID(),NULL,NULL,NULL,NULL) AS S
INNER JOIN SYS.INDEXES AS I
ON S.OBJECT_ID = I.OBJECT_ID AND S.INDEX_ID = I.INDEX_ID
WHERE S.DATABASE_ID = DB_ID('DB_NAME') -- 현재 데이터베이스
AND I.NAME IS NOT NULL -- HEAP은 무시
AND OBJECTPROPERTY(S.OBJECT_ID, 'IsMsShipped') = 0 -- 시스템 개체 무시
ORDER BY Fragmentation DESC
Fragmentation (AVG_FRAGMENTATION_IN_PERCENT) 가 클수록 조각이 많이 나있는 상태
또는
DBCC SHOWCONTIG(테이블명)
이런경우 인덱스를 다시 구성하거나 REBUID 해서 조각난것을 다시 모을수있다.
DBCC DBREINDEX (테이블명, 인덱스명) -- 인덱스명을 생략하면 테이블의 모든인덱스를 수행
DBCC INDEXDEFRAG (데이터베이스명, 테이블명, 인덱스명) -- DB에 LOCK이 걸리지않는다
ALTER INDEX ALL ON 테이블명 REBUILD WITH (ONLINE = ON)
또는
데이터베이스에서 선언된 임계값 이상으로 조각화된 모든 인덱스에 조각 모음을 수행
/*Perform a 'USE <database name>' to select the database in which to run the script.*/
-- Declare variables
SET NOCOUNT ON;
DECLARE @tablename VARCHAR(255);
DECLARE @execstr VARCHAR(400);
DECLARE @objectid INT;
DECLARE @indexid INT;
DECLARE @frag DECIMAL;
DECLARE @maxfrag DECIMAL;
-- Decide on the maximum fragmentation to allow for.
SELECT @maxfrag = 30.0;
-- Declare a cursor.
DECLARE tables CURSOR FOR
SELECT TABLE_SCHEMA + '.' + TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE';
-- Create the table.
CREATE TABLE #fraglist (
ObjectName CHAR(255),
ObjectId INT,
IndexName CHAR(255),
IndexId INT,
Lvl INT,
CountPages INT,
CountRows INT,
MinRecSize INT,
MaxRecSize INT,
AvgRecSize INT,
ForRecCount INT,
Extents INT,
ExtentSwitches INT,
AvgFreeBytes INT,
AvgPageDensity INT,
ScanDensity DECIMAL,
BestCount INT,
ActualCount INT,
LogicalFrag DECIMAL,
ExtentFrag DECIMAL);
-- Open the cursor.
OPEN tables;
-- Loop through all the tables in the database.
FETCH NEXT
FROM tables
INTO @tablename;
WHILE @@FETCH_STATUS = 0
BEGIN
-- Do the showcontig of all indexes of the table
INSERT INTO #fraglist
EXEC ('DBCC SHOWCONTIG (''' + @tablename + ''')
WITH FAST, TABLERESULTS, ALL_INDEXES, NO_INFOMSGS');
FETCH NEXT
FROM tables
INTO @tablename;
END;
-- Close and deallocate the cursor.
CLOSE tables;
DEALLOCATE tables;
-- Declare the cursor for the list of indexes to be defragged.
DECLARE indexes CURSOR FOR
SELECT ObjectName, ObjectId, IndexId, LogicalFrag
FROM #fraglist
WHERE LogicalFrag >= @maxfrag
AND INDEXPROPERTY (ObjectId, IndexName, 'IndexDepth') > 0;
-- Open the cursor.
OPEN indexes;
-- Loop through the indexes.
FETCH NEXT
FROM indexes
INTO @tablename, @objectid, @indexid, @frag;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'Executing DBCC INDEXDEFRAG (0, ' + RTRIM(@tablename) + ',
' + RTRIM(@indexid) + ') - fragmentation currently '
+ RTRIM(CONVERT(varchar(15),@frag)) + '%';
SELECT @execstr = 'DBCC INDEXDEFRAG (0, ' + RTRIM(@objectid) + ',
' + RTRIM(@indexid) + ')';
EXEC (@execstr);
FETCH NEXT
FROM indexes
INTO @tablename, @objectid, @indexid, @frag;
END;
-- Close and deallocate the cursor.
CLOSE indexes;
DEALLOCATE indexes;
-- Delete the temporary table.
DROP TABLE #fraglist;
GO
참조 : https://rohsstory.tistory.com/497
참조 : https://learn.microsoft.com/ko-kr/sql/t-sql/database-console-commands/dbcc-indexdefrag-transact-sql?view=sql-server-ver16
728x90
반응형
'웹개발' 카테고리의 다른 글
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target (0) | 2023.08.29 |
---|---|
MSSQL 인덱스 힌트 INDEX HINT (0) | 2023.08.01 |
SVN: '0x0040010b: Obtain Project Name' 오류 시 (0) | 2023.07.12 |
좌표 기반 폴리곤 안에 위치해 있는지 확인하는 자바스크립트 (0) | 2023.07.03 |
MSSQL CPU 점유 성능 향상 (0) | 2023.07.03 |