[[TableOfContents]] ==== 로컬변수 ==== OPTIMIZE FOR 쿼리힌트가 생겼다. (2005 버전 이후) OPTIMIZE FOR는 로컬변수를 사용할 때 옵티마이저가 로컬변수의 불확실성으로 최적화된 쿼리계획을 세우지 못할 경우 옵티마이저에게 통계정보를 잘 이용 할 수 있도록 값을 제공하기 위하여 사용된다. OPTIMIZE FOR에 명시된 값은 쿼리 최적화될 때만 사용되고 실행할 때는 사용되지 않는다. (로컬변수 사용시의 문제점은 [Magic Density]를 참고하라.) {{{ USE AdventureWorks; GO EXEC sp_helpindex 'Person.Address'; /* rowguid AddressLine1, AddressLine2, City, StateProvinceID, PostalCode StateProvinceID AddressID */ create index nix_postal_code on Person.Address(PostalCode); go DECLARE @city_name nvarchar(30); DECLARE @postal_code nvarchar(15); SET @postal_code = 86171; --sql1 SELECT * FROM Person.Address WHERE City = @city_name AND PostalCode = @postal_code OPTION ( OPTIMIZE FOR (@city_name = 'Seattle', @postal_code UNKNOWN) ); }}} attachment:OPTIMIZEFORQueryHintOptionIncludeUNKNOWNVariableValue/optimize_for01.jpg {{{ --sql2 SELECT * FROM Person.Address WHERE City = @city_name AND PostalCode = @postal_code OPTION ( OPTIMIZE FOR (@city_name = 'Seattle', @postal_code = 98028) ); }}} attachment:OPTIMIZEFORQueryHintOptionIncludeUNKNOWNVariableValue/optimize_for02.jpg ==== 매개변수 ==== 'optimize for ...'를 꼭 로컬변수에만 사용할 수 있는 것은 아니다. sql server는 기본적으로 통계정보가 자동갱신되는 옵션을 채택하고 있다. 하지만 필자가 알기로는 통계정보의 갱신주기가 비율로 정해져 있기 때문에 간혹 대용량 데이터베이스 통계정보가 갱신되지 않아 최근의 데이터가 처리 대상일 경우 기대에 어긋나는 실행계획을 세운다. 이럴 때도 사용할 수 있다. 대략 다음과 같이 사용하면 된다. (오늘(2011-07-06) 배치 완료 시간이 1시간정도 밀렸다. 확인해보니 이런 경우다) {{{ create proc 대용량테이블조회sp as select * from 대용량테이블 where std_dt between @bdt and @edt option ( optimize for (@bdt = '20110601', @edt = '20110602')) }}}