쿼리의 예상 비용이 특정값 이상인 경우에 쿼리가 수행되지 못하도록 할 수 있을까? 라는 목적으로 만들어진 것이 바로 query governor cost limit 구성옵션이다. UI에서는 "커리 관리자를 사용하여 장기 실행 쿼리방지"라는 이름으로 설정할 수 있으며, 기본값은 0 (제한없음) 이다. 이전 버전에도 있던 구성옵션이므로 새로울 것은 없지만 이 값을 설정 후에 문제가 되는 경우가 있어서 이글을 통해 소개하고자 한다.
문제
SQL Server 2005의 복제 article을 대상으로 ddl문을 수행하면 8649 오류가 발생하며 실패함.
메시지 8649, 수준 17, 상태 1, 프로시저 sp_MStran_ddlrepl, 줄 40
이 쿼리의 예상 비용(1275)이 구성 임계값 150을(를) 초과하여 쿼리가 취소되었습니다. 시스템 관리자에게 문의하십시오.
오류 메시지를 통해, sp_MStran_ddlrepl내의 특정 statement 수준에서 예상비용 1275가 나왔고 query governor cost limit은 150으로 설정되어 있었기 때문에 문제가 발생한 것을 알 수 있다.
해결
ddl문은 관리자에 의해서 발생하게 되므로, 다음과 같이 수행 session 단위로 query_governor_cost_limit를 설정하게되면 문제없이 쿼리가 수행됨
실행 예) “쿼리 관리자를 사용하여 장기 실행 쿼리 방지” = 150인 상태에서 다음과 같이 ddl문 수행.
set query_governor_cost_limit 1300
go
reconfigure with override
go
--ddl문
alter table t1 add c7 nvarchar(100)
go
set query_governor_cost_limit 0;
go
reconfigure with override
go
추가 정보
복제 article에 ddl문이 수행되면 호출되는 sp_MStran_ddlrepl내에서 다음 구문의 예상 하위 트리 비용이 1274인 것을 확인함. XML data를 처리하는 과정에서 발생한 것으로, 시스템 저장 프로시저의 임의 수정이 불가능하여 이 구문의 비용을 낮출 수는 없는 상태임.
select @object_name = event_instance.value('ObjectName[1]', 'sysname')
,@object_owner = event_instance.value('SchemaName[1]', 'sysname')
,@objecttype = event_instance.value('ObjectType[1]', 'varchar(32)')
,@encrypted = event_instance.value('(TSQLCommand/SetOptions/@ENCRYPTED)[1]', 'nvarchar(32)')
,@pass_through_scripts = event_instance.value('(TSQLCommand/CommandText)[1]', 'nvarchar(max)')
,@targetobject = event_instance.value('TargetObjectName[1]', 'nvarchar(512)')
FROM @EventData.nodes('/EVENT_INSTANCE') as R(event_instance)
참조
SQL Server 2005 온라인 설명서(2008년 11월)query governor cost limit 옵션
http://msdn.microsoft.com/ko-kr/library/ms190419(SQL.90).aspx
HTH,
한기환

이올린에 북마크하기

