MSSQL의 파티션별 압축을 자동화하려면, 다음 두 가지 접근 방식이 자주 사용됩니다:
🛠️ 1. PowerShell을 이용한 압축 자동화
PowerShell은 SQL Server Agent 작업과도 쉽게 연동되며, Windows 환경에서 손쉽게 예약 실행이 가능합니다.
✅ PowerShell 스크립트 예제 (동적 압축)
# 변수 설정
$serverName = "localhost"
$databaseName = "YourDatabase"
$tableName = "YourTableName"
# SQL 압축 명령 동적 생성
$query = @"
DECLARE @sql NVARCHAR(MAX) = '';
SELECT
@sql += '
ALTER TABLE ' + QUOTENAME(SCHEMA_NAME(o.schema_id)) + '.' + QUOTENAME(o.name) + '
REBUILD PARTITION = ' + CAST(p.partition_number AS VARCHAR) + '
WITH (DATA_COMPRESSION = PAGE);'
FROM sys.partitions p
JOIN sys.objects o ON p.object_id = o.object_id
WHERE o.name = '$tableName' AND p.index_id IN (0,1)
GROUP BY o.schema_id, o.name, p.partition_number;
EXEC sp_executesql @sql;
"@
# SQL 실행
Invoke-Sqlcmd -ServerInstance $serverName -Database $databaseName -Query $query
✅ 사용 방법:
- 위 스크립트를
.ps1
파일로 저장 (예:CompressPartitions.ps1
) - Windows Task Scheduler 또는 SQL Server Agent에서 예약 실행
- 필요 시 PowerShell에서 특정 날짜 기반 파티션만 필터링하도록 확장 가능
📦 2. SSIS (SQL Server Integration Services) 이용한 자동화
✅ 구성 개요
SSIS 구성 요소 | 역할 |
---|---|
Execute SQL Task | 파티션 목록 조회 |
Foreach Loop Container | 파티션 번호 반복 |
Execute SQL Task (내부) | 각 파티션에 압축 명령 실행 |
✅ 구현 절차 요약
- Execute SQL Task: 파티션 번호 목록 가져오기 sql복사편집
SELECT DISTINCT partition_number FROM sys.partitions WHERE object_id = OBJECT_ID('dbo.YourTableName') AND index_id IN (0, 1)
- Foreach Loop Container: 위 결과의 각
partition_number
에 대해 반복 - 내부에 또 다른 Execute SQL Task: sql복사편집
ALTER TABLE dbo.YourTableName REBUILD PARTITION = ? WITH (DATA_COMPRESSION = PAGE);
- 파라미터: Foreach에서 얻은
partition_number
- 파라미터: Foreach에서 얻은
- 필요 시 성공/실패 로깅, 이메일 알림 등 추가 가능
🔄 PowerShell vs SSIS 비교
항목 | PowerShell | SSIS |
---|---|---|
설정 간편성 | ✅ 쉬움 | ❌ 비교적 복잡 |
GUI 지원 | ❌ 없음 | ✅ 있음 |
확장성 | ✅ 스크립트 기반 유연함 | ✅ 패키지 단위 관리 |
운영 환경 제약 | Windows 필요 | SQL Server Integration Services 설치 필요 |
로깅 및 알림 | 외부 스크립트 필요 | 내장 가능 |
✅ 자동화 전략 요약
- 간단한 자동화 & 빠른 도입 → PowerShell + Task Scheduler
- 복잡한 워크플로우/기업용 자동화 → SSIS + SQL Server Agent
- 보너스: SQL Server Agent에서 PowerShell Job Step도 사용 가능!