파워쉘이나 SSIS와 연동한 자동화

By | 2025-07-16

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 (내부)각 파티션에 압축 명령 실행

✅ 구현 절차 요약

  1. Execute SQL Task: 파티션 번호 목록 가져오기 sql복사편집SELECT DISTINCT partition_number FROM sys.partitions WHERE object_id = OBJECT_ID('dbo.YourTableName') AND index_id IN (0, 1)
  2. Foreach Loop Container: 위 결과의 각 partition_number에 대해 반복
  3. 내부에 또 다른 Execute SQL Task: sql복사편집ALTER TABLE dbo.YourTableName REBUILD PARTITION = ? WITH (DATA_COMPRESSION = PAGE);
    • 파라미터: Foreach에서 얻은 partition_number
  4. 필요 시 성공/실패 로깅, 이메일 알림 등 추가 가능

🔄 PowerShell vs SSIS 비교

항목PowerShellSSIS
설정 간편성✅ 쉬움❌ 비교적 복잡
GUI 지원❌ 없음✅ 있음
확장성✅ 스크립트 기반 유연함✅ 패키지 단위 관리
운영 환경 제약Windows 필요SQL Server Integration Services 설치 필요
로깅 및 알림외부 스크립트 필요내장 가능

✅ 자동화 전략 요약

  • 간단한 자동화 & 빠른 도입 → PowerShell + Task Scheduler
  • 복잡한 워크플로우/기업용 자동화 → SSIS + SQL Server Agent
  • 보너스: SQL Server Agent에서 PowerShell Job Step도 사용 가능!

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다