데이터베이스 개발자 Tip & 강좌

SQLER의 개발자들이 만들어가는 데이터베이스 사용자 Tip & 강좌 게시판입니다. SQL서버, Oracle, MySQL 등 여러 클라우드/오픈소스 기반 데이터베이스 개발 및 운영 관련 팁과 쿼리 노하우를 이곳에서 가장 먼저 접하실 수 있습니다. 많은 도움 되시길 바랍니다.

SQL Server 쿼리 처리 아키텍처_실행 계획 캐싱 및 다시 사용

  • 강제 매개 변수화

 

  • Version : SQL Server 2005, 2008, 2008R2, 2012

 

데이터베이스의 모든 SELECT, INSERT, UPDATE, DELETE 문이 특정 제한에 따라 매개 변수화되도록 지정하여 SQL Server의 기본 단순 매개 변수화 동작을 무시 할 수 있다. ALTER DATABASE 문에서 PARAMETERIZATION FORCED로 설정하면 강제 매개 변수화를 설정 할 수 있다.

--강제 매개변수화 적용

ALTER DATABASE SW_TEST SET PARAMETERIZATION FORCED

GO

 

--단순 매개변수화 적용

ALTER DATABASE SW_TEST SET PARAMETERIZATION SIMPLE

GO

 

[강제 매개 변수화 적용된 데이터베이스 확인]

1 – 강제 매개 변수화 적용

0 – 단순 매개 변수화 적용

SELECT name, is_parameterization_forced FROM sys.databases

 

 

 

강제 매개 변수화를 사용하여 쿼리 컴파일 및 재컴파일 빈도를 줄여 특정 데이터베이스의 성능을 향상 시킬 수 있다. 일반적으로 POS시스템과 같은 원본으로부터 대량의 동시 쿼리를 처리 해야 하는 데이터베이스에서 강제 매개 변수화를 사용하면 도움이 된다.

 

PARAMETERIZATON FORCED로 설정하면 임의의 형식으로 전송된 SELECT, INSERT, UPDATE, DELETE 문에 표시되는 리터럴 값이 쿼리 컴파일 중에 매개변수로 변환 된다.

SELECT ProductID, SellStartDate FROM AdventureWorks2008R2.Production.Product

WHERE ISNULL(SellStartDate, '1900-01-01') > '2013-05-03'

 

 

[매개 변수 예외 상황]

  • INSERT...EXECUTE문
  • 저장 프로시저, 트리거, 사용자 정의 함수의 본문 안에 있는 있는 문(이러한 루틴의 경우 SQL Server는 쿼리 계획을 다시 사용하고 있다.)
  • 클라이언트측 응용 프로그램에서 이미 매개 변수화된 쿼리 문
  • XQuery 메서드 호출이 포함된 문. (WHERE절과 같이 해당 인수가 일반적으로 매개 변수화되는 컨텍스트에서 메서드가 나타난다)
  • T-SQL 커서내의 문(API 커서 내의 SELECT문은 매개 변수화 된다.)
  • 사용되지 않은 쿼리 구문
  • ANSI_PADDING OFF, ANSI_NULLS OFF 가 설정된 컨텍스트에서 실행 되는 문
  • 매개 변수화하기에 적합한 리터럴이 2097개 이상 포함 된 문
  • WHERE T.col2 >= @BB와 같이 변수를 참조 하는 문
  • RECOMPILE 쿼리 힌트가 포함된 문
  • COMPUTE 절을 포함하는 문
  • WHERE CURRENT OF 절을 포함하는 문

 

 

[강제 매개 변수화 일부 적용 상황]

  • SELECT 문의 <select_list> 하위 쿼리의 SELECT 목록 및 INSERT 문 내의 SELECT 목록 포함
  • IF 문 내에 나타나는 하위 쿼리 SELECT 문
  • 쿼리의 TOP, TABLESAMPLE, HABING, GROUP BY, ORDER BY, OUTPUT..INTO, FOR XML 절
  • OPENROWSET, OPENQUERY, OPENDATASOURCE, OPENXML, FULLTEXT 연산자에 대한 직접 인수 또는 하위 식으로서의 인수
  • CONVERT 절의 style 인수
  • IDENTITY 절 내의 정수 상수
  • ODBC 확장 구문을 사용하여 지정한 상수
  • +, -, *, /, % 연산자의 인수인 상수 폴딩 가능 식. SQL Server에서느 식이 강제 매개 변수화에 적합한지 결정할 때 다음 조건 중 하나가 True이면 상수 폴딩 가능 식으로 간주 된다.
    • 식에 열, 변수 또는 하위 쿼리가 나타나지 않는다
    • 식에 CASE 절이 포함된다

 

매개 변수화는 개별 T-SQL문 수준에서 수행 된다. 일괄 처리 내의 개별 문이 매개 변수화 된다. 컴파일 후 매개 변수가 있는 쿼리는 쿼리가 원래 전송되었던 일괄 처리의 컨텍스트에서 실행 된다. 쿼리의 실행계획이 캐싱된 경우에는 sys.syscacheobjects에서 sql 열을 참조하여 쿼리가 매개변수화 되었는지 여부를 확인 할 수 있다.

 

select sql from sys.syscacheobjects

 

 

 

쿼리가 매개 변수화 된 경우 (@1 tinyint)와 같이 이 열에서 매개 변수의 이름 및 데이터 형식은 전송된 일괄처리 텍스트 앞에 온다.

 

매개 변수 이름은 임의로 지정하므로 사용자나 응용 프로그램에서는 특정 명명 순서를 따를 필요가 없다. SQL Server 버전에 따라 달라 질 수 있으며 매개 변수 이름, 리터럴 선택 항목 및 변수화된 텍스트의 공백이 여기에 포함 된다.

 

[매개 변수 데이터 형식]

SQL Server에서 리터럴을 매개 변수화 하면 다음 데이터 형식으로 변환 된다.

  • 정수 리터럴은 그 크기가 int 데이터 형식에 적합하면 int로 매개 변수 된다.
  • <, <=, =, =!, >, >=, , !<, !>, <>, ALL, ANY, BETWEEN, IN과 같은 비교 연산자와 관련된 조건자의 일부인 큰 정수 리터럴은 numeric(38, 0)으로 매개 변수화 된다.
  • 비교 연산자와 관련된 조건자의 일부인 고정 소수점 숫자 리터럴은 전체 자릿수가 38이고 소수 자릿수가 리터럴의 크기를 지원할 만큼 큰 numeric으로 매개 변수화 된다. 비교 연산자와 관련된 조건자의 일부가 아닌 고정 소수점 숫자 리터럴은 전체 자릿수 및 소수 자릿수가 리터럴의 크기를 지원할 만큼 큰 numeric으로 매개 변수화 된다.
  • 부동 소수점 숫자 리터럴은 float(53)으로 매개 변수화 된다.
  • 비유니코드 문자열 리터럴의 크기가 8000자 내일 때는 varchar(8000)로 매개 변수화되고 8000자 보다 클 때는 varchar(max)로 매개 변수화 된다.
  • 유니코드 문자열 리터럴의 크기가 유니코드 문자로 4000자 내일 때는 nvarchar(4000)로 매개 변수화 되고 4000자보다 클 때는 nvarchar(max)로 매개 변수화 된다.
  • 이진 리터럴 크기가 8000바이트 내일 때는 varbinary(8000)로 매개 변수화 되고 8000 바이트보다 클 때는 varbinary(max)로 변환 된다.
  • 통화 유형 리터럴은 money로 매개 변수화 된다.

 

 

[강제 매개 변수화 사용 지침]

  • PARAMETERIZATION FORCED 설정 시 고려 사항
  • 영향 평가 후 적용 하자. 강제 매개 변수화를 적용하면 쿼리 컴파일 시 쿼리의 리터럴 상수가 매개 변수로 변경된다. 따라서 최적의 실행계획을 선택하지 못할 수도 있다.
  • 둘 이상의 데이터베이스를 참조하는 분산 쿼리에 강제 매개 변수를 사용하면 좋다. 단 쿼리가 실행되는 컨텍스트에서 PARAMETERIZATION FORCED로 설정 되어 있어야 한다.
  • FORCED로 설정 시 현재 컴파일(재컴파일) 되었거나 실행 중인 쿼리 계획을 제외한 모든 쿼리 계획이 캐시에서 플러시 된다. 실행중인 계획은 다음 쿼리가 실행 될 때 매개 변수화 된다.
  • 옵션 변경은 온라인으로 수정 되므로 데이터베이스 수준의 잠금이 필요하지 않다.
  • SQL Server 호환성 수준이 80으로 설정되어 있거나 이전 버전의 인스턴스에 있는 데이터베이스가 SQL Server2005 이상 버전의 인스턴스에 연결된 경우에는 강제 매개 변수화가 해재 된다.(Simple로 설정 됨)
  • 현재 PARAMETERIZATION 옵션 설정은 데이터베이스를 다시 연결하거나 복원 할 때도 그대로 유지 된다.

 

단일 쿼리 또는 구문은 동일하고 매개 변수 값만 다른 기타 쿼리는 단순 매개 변수화되지 않도록 지정하여 강제 매개 변수화의 동작을 무시할 수 있다. 반대로 데이터베이스에서 강제 매개 변수화가 해제된 경우에도 구문이 동일한 쿼리에 한해 강제 매개 변수화가 수행 되도록 지정할 수 있다.

 

PARAMETERIZATION 옵션이 FORCED로 설정되어 있으면 오류 메시지 보고가 단순 매개 변수화의 경우와 다를 수 있다. 단순 매개 변수화에서 보고되는 메시지 보다 많은 오류 메시지가 보고될 수 있으며 오류가 발생한 줄 번호가 잘못 보고 될 수 있다.

 

 

[참고자료]

강제 매개 변수화 : http://msdn.microsoft.com/ko-kr/library/ms175037(v=sql.105).aspx

단순 및 강제 매개 변수화

http://www.mssqltips.com/sqlservertip/2935/sql-server-simple-and-forced-parameterization/

 


강성욱 / jevida@naver.com
Microsoft SQL Server MVP
Blog : http://sqlmvp.kr
Facebook : http://facebook.com/sqlmvp

No. Subject Author Date Views
1790 메모리 관리 아키텍처 – 버퍼 관리_페이지 읽기 jevida(강성욱) 2016.09.28 1250
1789 메모리 관리 아키텍처 – 버퍼 관리 jevida(강성욱) 2016.09.28 1788
1788 메모리 관리 아키텍처 – Min/Max Server Memory 효과 jevida(강성욱) 2016.09.28 2528
1787 메모리 관리 아키텍처 – 동적 메모리 관리 jevida(강성욱) 2016.09.28 1361
1786 메모리 관리 아키텍처 – 프로세스 주소 공간 jevida(강성욱) 2016.09.28 1360
1785 메모리 관리 아키텍처 – 메모리 아키텍처 jevida(강성욱) 2016.09.28 1858
1784 데이터 압축 상태에 대한 개체 크기 예상 jevida(강성욱) 2016.09.28 1357
1783 sp_MSforeachdb, sp_MSforeachtable 프로시저 활용하기 jevida(강성욱) 2016.09.28 2829
1782 SQL Server 쿼리 처리 아키텍처_분산 쿼리 아키텍처 jevida(강성욱) 2016.09.28 1142
1781 SQL Server 쿼리 처리 아키텍처_병렬 쿼리 처리 - 병렬 인덱스 작업 jevida(강성욱) 2016.09.28 1335
1780 SQL Server 쿼리 처리 아키텍처_병렬 쿼리 처리 - 병렬 처리 수준 jevida(강성욱) 2016.09.28 1836
1779 SQL Server 쿼리 처리 아키텍처_병렬 쿼리 처리 jevida(강성욱) 2016.09.28 1745
1778 SQL Server 쿼리 처리 아키텍처_실행 계획 캐싱 및 다시 사용 - Preparing SQL Statements jevida(강성욱) 2016.09.28 1007
» SQL Server 쿼리 처리 아키텍처_실행 계획 캐싱 및 다시 사용 - 강제 매개 변수화 jevida(강성욱) 2016.09.28 993
1776 SQL Server 쿼리 처리 아키텍처_실행 계획 캐싱 및 다시 사용 - 단순 매개 변수화 jevida(강성욱) 2016.09.28 875
1775 SQL Server 쿼리 처리 아키텍처_실행 계획 캐싱 및 다시 사용 - 매개 변수 및 실행 계획 재사용 jevida(강성욱) 2016.09.28 1094
1774 SQL Server 쿼리 처리 아키텍처_실행 계획 캐싱 및 다시 사용 jevida(강성욱) 2016.09.28 1422
1773 DMV를 이용한 캐시된 저장 프로시저 통계 정보 확인 jevida(강성욱) 2016.09.28 978
1772 SQL Server 쿼리 처리 아키텍처_저장 프로시저 및 트리거 실행 jevida(강성욱) 2016.09.27 939
1771 SQL Server 쿼리 처리 아키텍처 _ SQL 문 처리 (4/4) – 분산형 분할 뷰(View) 확인 jevida(강성욱) 2016.09.27 1335





XE Login