소개
가능하면 하지 않는 것이 좋은 DB 관리 작업 중에 대표적인 DBCC SHRINKDATABASE 또는 SHRINKFILE, 그러나 현실적으로는 필요한 경우들이 생기죠. 필요에 의해 SHRINK 작업을 하는 경우에도 성능 또는 안정성을 위해 고려할 부분들이 많이 있습니다. 특히 점검 시간이 아닐 때는 더더욱 주의가 필요하죠 그 중에 하나가 쿼리 실행과 동시 처리 시 문제가 될 수 있다는 점입니다.
WAIT_AT_LOW_PRIORITY 옵션의 지원 범위가 점점 넓어지는 것 같습니다, 온라인 인덱스 작업 시 지원되는 경우를 포함해서 이제 SHRINK 작업에도 이 옵션이 유사한 용도로 지원됩니다, SQL Server 2022 또는 Azure SQL 용입니다. 이에 대해서 간단히 살펴보겠습니다.
- DBCC SHRINKDATABASE (위 옵션에 대한 설명과 동시성 관련 설문 참조)
DBCC SHRINKDATABASE(또는 FILE)의 동시성 문제
테이블 개체를 참조하는 쿼리를 실행할 때는 기본적으로 스키마 안정성(Sch-S) 잠금을 필요로 하죠 반대로 SHRINK와 같은 작업은 개체 공간의 이동 및 할당 변경을 의해 스키마 변경(Sch-M) 잠금을 필요로 하는데 이 두 가지는 상호 호환이 되지 않는 즉 한 쪽은 대기를 해야하는 결과를 만듭니다. 이러한 상황이 대량으로 발생하거나 혹은 쿼리나 SHIRNK 작업이 길어진다면 그 만큼 문제를 유발할 수 있겠죠. (위 링크에 있는 문서 하단의 내용 참조)
WAIT_AT_LOW_PRIORITY (ABORT_AFTER_WAIT = {SELF | BLOCKER} ) 옵션 지원
SQL Server 2022에서 이 옵션이 추가되었습니다. 온라인 인덱스 옵션과 거의 유사합니다, 쿼리 실행 시 Sch-S 잠금이 요구되는 경우 SHRINK 작업을 더 낮은 순위로 내려서 쿼리가 먼저 처리되도록 양보하는 것입니다. 그런 쿼리가 대량으로 호출되거나 긴 시간을 가지는 경우엔 또 다른 부작용을 일으킬 수 있겠죠 해서 문서에서는 1분의 timeout를 가진다고 설명합니다.
그럼 시간을 초과하면 어떻게 되는가? {SELF | BLOKC} 하위 옵션이 바로 이 동작을 결정합니다. 디폴트인 SELF는 SHRINK 작업을 중단시키는 동작이고 BLOCKER는 차단 원인인 해당 쿼리를 취소 시킵니다.
실제 운영 중인 상태 또는 사용량이 매우 작은 상황 또는 사용하지 않는 점검 시점 등의 상황에 따라 이 옵션을 활용하면 동시성 문제를 완하시키는데 도움이 될 수 있을 것으로 예상됩니다.
정리
고객사에서 간헐적으로 SHRINK 작업을 하시는 경우가 있으니 SQL Server 2022 이상 버전의 사용자라면 이 옵션을 소개해 드려야겠습니다.
모두 건강하세요.
김정선 드림