1. 우리 집 거실처럼 DB도 청소가 필요해요
컴퓨터를 오래 쓰면 느려지듯, 데이터베이스(DB)도 오래 사용하면 속도가 떨어집니다. 특히 데이터를 지웠는데도 파일 용량은 그대로이거나, 간단한 검색인데도 한참 걸린다면 “DB에 먼지가 쌓였다”고 생각하시면 됩니다.
실무에서는 이를 ‘조각화’라고 부르는데, 쉽게 말해 책장의 책들이 순서 없이 뒤섞여 있어 원하는 책을 찾는 데 시간이 오래 걸리는 상태를 말해요. 오늘은 이 뒤섞인 책(인덱스)을 정리하고, 남는 공간(파일 용량)을 줄여주는 아주 쉬운 방법을 알려드릴게요.
2. 개념 설명: ‘인덱스 조각화’와 ‘쉬링크’란?
2.1 인덱스 조각화 (방이 어질러진 상태)
우리가 데이터를 빨리 찾으려고 만든 게 ‘인덱스’예요. 그런데 데이터를 넣고 빼다 보면 이 인덱스라는 지도에 구멍이 뚫리거나 순서가 엉망이 됩니다. 이걸 ‘조각화’라고 해요. 지도가 찢어져 있으니 당연히 찾는 속도가 느려지겠죠?
2.2 쉬링크 (빈 상자 버리기)
데이터를 100GB치 넣었다가 50GB를 지웠다고 해서 DB 파일 크기가 자동으로 50GB로 줄어들지는 않아요. 50GB만큼의 ‘빈 공간’을 그대로 차지하고 있죠. ‘쉬링크(Shrink)’는 이 빈 공간을 잘라내서 컴퓨터 저장 공간을 확보하는 작업이에요.
3. 실무 코드 예제: 따라만 하세요!
전문적인 도구 없이도 아래 명령어를 복사해서 붙여넣기만 하면 상태를 확인하고 고칠 수 있습니다.
3.1 우리 DB 상태는 어떨까? (상태 체크)
SQL
-- 내 DB의 인덱스 상태 확인
SELECT
OBJECT_NAME(object_id) AS [테이블이름],
avg_fragmentation_in_percent AS [어질러진정도(%)]
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'DETAILED')
WHERE avg_fragmentation_in_percent > 10 -- 10% 이상 어질러진 것만 보기
ORDER BY [어질러진정도(%)] DESC;
3.2 깔끔하게 정리하기 (청소 시작)
SQL
-- 1. 인덱스 정렬하기 (REBUILD)
ALTER INDEX ALL ON [TableName] REBUILD;
-- 2. SHRINK
-- DB 파일의 빈 공간을 깎아서 용량을 줄이기
DBCC SHRINKDATABASE (N'DatabaseName');
4. 코드 상세 분석: 왜 이렇게 하나요?
- REBUILD (인덱스 재구축): 어질러진 책장을 다 비우고 처음부터 다시 차곡차곡 책을 꽂는 작업이에요. 가장 확실하게 속도를 높여주지만, 청소하는 동안은 책장을 쓸 수 없으니(Lock) 사용자가 적은 밤 시간에 하는 게 좋아요.
- SHRINKDATABASE (DB 수축): 이 명령어는 “이제 안 쓰는 공간은 반납할게!”라고 컴퓨터 운영체제에 말하는 거예요. 덕분에 하드디스크 용량에 여유가 생깁니다.
- 숫자 10의 의미: 보통 ‘어질러진 정도’가 10~30%면 가볍게 정리(Reorganize)하고, 30%가 넘어가면 아예 새로 만드는(Rebuild) 게 정석이에요.
5. 주의사항: 이것만은 꼭 기억하기!
5.1 청소도 너무 자주 하면 독이 돼요
“매일 쉬링크(Shrink)를 하면 용량도 아끼고 좋지 않을까?”라고 생각하실 수 있어요. 하지만 쉬링크는 DB 입장에서는 굉장히 힘든 작업이에요. 너무 자주 하면 오히려 DB가 스트레스를 받아 더 느려질 수 있으니, 대규모로 데이터를 삭제한 직후나 한 달에 한 번 정도만 하는 것을 추천해요.
5.2 백업은 우리의 생명줄
중요한 청소를 하기 전에는 반드시 백업을 해두는 습관을 지니세요. 혹시 모를 정전이나 오류에 대비하기 위해!
6. 요약하자면!
- 확인하기: 내 DB가 얼마나 어질러졌는지 체크한다.
- 정리하기:
REBUILD로 뒤섞인 데이터를 일렬로 세운다. - 줄이기:
SHRINK로 낭비되는 용량을 깎아낸다.
이렇게만 해주셔도 여러분의 DB는 처음 설치했을 때처럼 쌩쌩하게 돌아갈 거예요!
많은 도움이 되었어요~ 감사합니다
항상 감사합니다~ 자주 와주세요! ㅎㅎ