View
109
Download
0
Category
Preview:
DESCRIPTION
SQL Server 저장 프로시저 성능 최적화 김정선 필라넷 / DB 사업부 / 수석 컨설턴트 삼성 SDS 멀티캠퍼스 / 전임 교수 Microsoft SQL Server MVP. 강사 소개. - PowerPoint PPT Presentation
Citation preview
강사 소개김 정선 Email: visualdb@unitel.co.krBlog: visualdb.onblog.com
자격 /인증 사항 MCDBA MCITP Database Administrator Microsoft SQL Server MVP근무 이력 현 ) 필라넷 (Feel@NET) / DB 사업부 / 수석 컨설턴트 현 ) 삼성 SDS 멀티캠퍼스 / 전임 교수 전 ) 삼성 중공업 조선해양사업본부 ECIM 팀주요 업무 SQL Server 컨설팅 / 기술지원 / 개발 / 교육강사 활동 MSDN, TechNet, Devdays, MCPWorld, 등출판물 SQL Server 2005 관리자 가이드 (MS) SQL Server 2005 개발자 가이드 (MS) SQL Server 2005 포켓 컨설턴트 관리자용 ( 정보문화사 )
대상 기술범위 :
• 대상– 현업 개발자 및 관리자– 저장 프로시저 성능에 관심 있는 개발자– 저장 프로시저 실행 구조 , 환경 및 그 특징에 관심 있는
사용자
• 기술범위– 쿼리 최적화기– 저장 프로시저 성능– Database API 성능
이 주제를 이해하는 데 필요한 지식
Level 300Level 300
• SQL Server T-SQL Programming• 인덱스• 쿼리 최적화기 (Query Optimizer)• 저장 프로시저• 데이터베이스 프로그래밍
2 장 . 목차
• 응용 프로그램 이슈– RPC Event 를 통하지 않은 호출– 파라미터 개체 자동 생성– 파라미터 암시적 데이터 형식 지정
• 암시적 소유자 지정 혹은 sp_ 프로시저 호출• 재컴파일 (Recompile)• SARG 위반• Parameter Sniffing• 파라미터 vs. 변수• 파라미터에 따라 다른 실행 계획• 동적 검색 조건• 유의 사항 정리
RPC Event 를 통하지 않은 호출
SQL Language Message(Batch Event)
SET rs = New ADODB.Recordset...rs.Open “EXEC Proc param1”...
cmd.Connection = cnn;cmd.CommandText = “EXEC Proc param1”;cmd.CommandType = CommandType.Text;
rdr = cmd.ExecuteReader();
cmd.Connection = cnn;cmd.CommandText = “dbo.Proc”;cmd.CommandType = StoredProcedure;
cmd.Parameters.Add(“@member_no”, SqlDbType.Int, 4).Value = param_value;
...rdr = cmd.ExecuteReader();
NO
NO
실행 계획 재사용 능력 및 성능 향상실행 계획 재사용 능력 및 성능 향상
파라미터 파라미터 Caching/Caching/ 재사용 능력 제공재사용 능력 제공
SQL InjectionSQL Injection 을 포함한 보안 강화을 포함한 보안 강화
SQL SQL 엔진이 원하는 것은 엔진이 원하는 것은 RPC EventRPC Event
RPC Message(RPC Event)
파라미터 개체 자동 생성
Parameter 개체 암시적 생성
WITH cmd .ActiveConnection = cn .CommandText = “Proc” .CommandType = adCmdStoredProc
.Parameters.Refresh .Parameters(1).Value = 1000...
NO
sp_procedure_params_rowset sp_procedure_params_rowset 실행실행
서버의 라운드 트립 유발서버의 라운드 트립 유발
시스템 테이블 접근 유발시스템 테이블 접근 유발 -sysobjects -sysobjects 등등
추가 추가 Request, I/O Request, I/O 등 성능 문제 유발등 성능 문제 유발
혹은 이것도 생략 가능혹은 이것도 생략 가능
파라미터 암시적 데이터 형식 지정Parameter 데이터 형식의 생략혹은 암시적 지정
cmd.Connection = cnn;cmd.CommandType = CommandType.Text;cmd.CommandText = “SELECT * FROM dbo.member WHERE firstname = @fname”;
cmd.Parameters.AddWithValue(“@fname”, lstFname.SelectedItem);...
NO
불필요한 불필요한 Procedure Cache Procedure Cache 소비소비
SARG SARG 위반할 경우 성능 문제 유발위반할 경우 성능 문제 유발
Parameterized QueryParameterized Query 에서 특히 주의에서 특히 주의
App/DBApp/DB 에서 암시적 형 변환 유발에서 암시적 형 변환 유발
암시적 소유자 혹은 sp_ 프로시저 호출
ProcProc존재존재 ??
dbo.Proc
이름으로 검사
OBJECT_IDOBJECT_ID(Proc)(Proc)존재존재 ??
EXEC ProcEXEC Proc
HitHit
불일치
Cache Miss
ID 로 검사
암시적 소유자로 호출한 경우
System System Procedure?Procedure?
EXEC sp_Proc
불일치
AA
System Proc 찾기
AA
Cache Miss
sp_ 접두사를 사용한 프로시저
컴파일 단계
dbo.sp_Proc
재컴파일
• 재컴파일은 필요 조건이지만 충분 조건은 아님• 재컴파일의 유형별 특징을 숙지하고 적절한 조치
필요• 유형
– 자동 재컴파일• 실행 전 자동 재컴파일 원인 • 실행 시 재컴파일 원인 - 과도한 ( 조정 가능한 ) 재컴파일
– 수동 재컴파일
실행 전 자동 재컴파일• 재컴파일 원인
– WITH RECOMPILE 절 사용– 제약조건 , 기본값 또는 규칙의 추가 , 제거를 포함한 참조 개체의 스키마 변경 *– 통계 정보 변경 *– 인덱스 추가 / 제거 *– 참조한 테이블에 대해 sp_recompile 수행– 데이터베이스 복원– 오래된 계획으로 프로시저 캐시에서 제거
• 주의 대상– (* 항목 ) Batch 형식의 코드 실행 시 자동 재컴파일이 안될 수도 있다
• DB 옵션 확인 – “통계 자동 업데이트” , “ 통계 자동 작성”• Batch 코드를 재 작성 • 수동 재컴파일 코드 추가• 검증 필요
– 실행 계획 재사용 부작용을 내포한 쿼리의 경우 재컴파일에 주의• 실행 계획 분리 ( 앞으로 다룰 내용 )
– 개체 이름 참조 시에는 항상 2-part 형식 이상으로 표기• EXEC dbo.up_OrdersInfo• SELECT * FROM dbo.Orders
실행 시 자동 재컴파일 1/2• 재컴파일 원인
– 주의 . 과도한 재컴파일을 유발 , 조정 가능– 참조 테이블의 충분한 비율의 데이터 변경 (*MS 기술 자료 내용 )
– SET 옵션 (Connection 상태 ) 변경• “ 추가 자료들” – ( 기술자료 ) 참조
– DDL 및 DML 문의 교차 실행
– 임시 테이블에서 특정 작업 수행• 존재하지 않는 시점의 테이블 참조
테이블 유형 빈 테이블 기준 빈 테이블 시의 임계 값 비어 있는 않은 경우 임계 값
일반 < 500 rows >= 500 변경 시 500 + ( 선택도의 20%) 변경 시
임시 < 6 rows >= 6 변경 시 500 + ( 선택도의 20%) 변경 시
테이블 변수 해당 없음 해당 없음 해당 없음
CREATE PROC dbo.InterleaveASCREATE TABLE dbo.#t1 (a int, b char(5))SELECT ...
CREATE INDEX nc_#t1_a ON #t1(a)SELECT ...
Recompile 시 EventSubClass 측정 값• Event = SP:Recompile, column =
EventSubClass번호 설명
1 컴파일이나 실행 사이의 스키마 , 바인딩 또는 권한 변경
2 통계정보 변경 (sysindexes.rowmodctr)
3 Recompile DNR(Deferred Name Resolution) 컴파일 시에 존재하지 않은 개체 . 즉 , 실행 시에 재 검사 수행해당 프로시저를 처음 실행하는 경우에 주로 발생
4 SET 옵션 변경
5 임시 테이블 스키마 , 바인딩 또는 권한 변경
6 원격 ROWSET 스키마 , 바인딩 또는 권한 변경
실행 시 자동 재컴파일 2/2
• 조정 가능한 작업들– 전체 프로시저의 재컴파일을 구문 단위로 유도
• sp_executesql / EXEC() 로 대체• 하위 저장 프로시저로 대체• ( 임시 테이블의 경우 ) KEEP PLAN / KEEPFIXED PLAN 옵션 사용
– SET 옵션으로 인한 재컴파일 방지• 재컴파일에 영향을 주지 않는 제한된 옵션만 사용 • 프로시저 호출 시에 옵션이 달라지지 않도록 유의
– DDL 과 DML 구문을 교차 실행하지 않고 순서대로 실행• CREATE; CREATE; SELECT; SELECT
– 임시 테이블 사용 시 고려 사항• 프로시저 자신의 임시 테이블만 참조• 임시 테이블 이름을 만들기 전 또는 삭제된 후에 참조하지 않도록 유의
– 프로시저 시작 부분에서 생성• IF...ELSE, WHILE 같은 제어 문에서 생성하지 않도록 유의• 필요 시 테이블 변수로 대체
수동 재컴파일
• 적재적소 ( 適材適所 )
프로시저 작성 시 지정Ad hoc 과 동일 ?
Cache 저장되지 않는다 최후의 보류 ?
실행 시 지정Ad hoc 과 동일 ?
Cache 저장되지 않는다기존 Cache
재사용 안됨그대로 존재 옵션 제거 시 재사용
재컴파일 강제 표시 설정이후 실행 시 스스로 재컴파일테이블 지정 시 참조하는 모든 계획을 재컴파일
긴급 활용CPU Killer 제거 시
sp_recompile proceduresp_recompile table
EXEC...WITH RECOMPILE
CREATE PROC ...WITH RECOMPILE
SARG 위반
CREATE PROC dbo.up_2 @ID intASSELECT * FROM dbo.tableWHERE char_col = @ID
CREATE PROC dbo.up_1 @ID char(2)ASSELECT *FROM dbo.tableWHERE LEFT(char_col, 2) = @ID
CREATE PROC dbo.up_3 @ID char(10)ASSELECT *FROM dbo.tableWHERE char_col LIKE RTRIM(@ID)
<column_name> <inclusive_operator> <value> [AND…]
CREATE PROC dbo.up_4 @ds datetimeAS...SET @s = @ds + 7
SELECT * FROM dbo.tableWHERE date_col BETWEEN @ds AND @s
char_col LIKE @ID ...
@ID varchar(5)
@ID varchar(5)
@ID
@ds AND (@ds+7)@ds AND @ds2
선택도 = 65/830
실행계획 = CL Index Scan
Parameter Sniffing
• 문제 : (초기 /재 ) 컴파일 시 사용된 파라미터로 생성된 실행 계획이 , 재사용 시에는 잘못된 실행 계획이 되는 경우
@B_Date=‘19960710’@E_Date=‘19960930’
선택도 = 2/830
실행계획 = CL Index Scan
선택도 = 2/830
실행계획 = Index Seek
FROM dbo.OrdersWHERE OrderDate Between @B_Date AND @E_Date
FROM dbo.OrdersWHERE OrderDate Between @B_Date AND @E_Date
@B_Date=‘19960710’@E_Date=‘19960711’
@B_Date=‘19960710’@E_Date=‘19960711’
선택도 = 11 / 100,000
실행계획 = Index Seek
• 전제 : 변수의 값은 쿼리 실행 시점에 알 수 있다• 문제 : 컴파일 시 쿼리 선택도 판단에 있어 , 변수는 그 값을 알 수 없으므로 인한 최적 실행 계획 오류
파라미터 vs. 변수
@no intAS...FROM dbo.ChargeWHERE memeber_no=@no
@no intAS...FROM dbo.ChargeWHERE memeber_no=@no
선택도 = 2,752/100,000
실행계획 = Table Scan
dbo.ParamVsVar @mem_no = 10000
ASDECLARE @v_no intSET @v_no = @noFROM dbo.ChargeWHERE memeber_no=@v_no
ASDECLARE @v_no intSET @v_no = @noFROM dbo.ChargeWHERE memeber_no=@v_no
@v_no = ?
@v_no = @no@v_no = 10000
파라미터에 따라 다른 실행 계획• 전제 : 파라미터에 따라 실행할 쿼리 형식이 다른 경우• 문제 : (초기 /재 ) 컴파일 시 모든 쿼리의 정확한 선택도를
판단할 수 없으므로 인한 최적 실행 계획 오류
선택도 = 1/830
실행계획 = Index Seek@id = 10248@date = NULL
선택도 = 70/830
실행계획 = Index Seek
선택도 = 70/830
실행계획 = CL Index Scan
@id int,@date datetimeASIF @id IS NOT NULL SELECT * FROM ... WHERE OrderID=@idELSE SELECT * FROM ... WHERE OrderDate<=@date
@id int,@date datetimeASIF @id IS NOT NULL SELECT * FROM ... WHERE OrderID=@idELSE SELECT * FROM ... WHERE OrderDate<=@date
@id = NULL@date = ‘19960930’
@id = NULL@date = ‘19960930’
@date = ?
동적 검색 조건 - 예제 @orderid int = NULL, @fromdate datetime = NULL, @todate datetime = NULL, @prodname nvarchar(40) = NULL...SELECT @sql = 'SELECT * FROM Northwind.dbo.Orders o JOIN Northwind.dbo.[Order Details] od ON o.OrderID = od.OrderID JOIN Northwind.dbo.Products p ON p.ProductID = od.ProductID WHERE 1 = 1 ' IF @orderid IS NOT NULL SET @sql = @sql + 'AND o.OrderID = @xorderid ' IF @fromdate IS NOT NULL SET @sql = @sql + 'AND o.OrderDate >= @xfromdate 'IF @todate IS NOT NULL SET @sql = @sql + 'AND o.OrderDate <= @xtodate 'IF @prodname IS NOT NULL SET @sql = @sql + 'AND p.ProductName LIKE @xpname + ''%''' ...EXEC sp_executesql @sql, @paramlist,
@orderid, @fromdate, @todate, @prodname
개별 구문 별 재사용 처리
동일 구문에 대해서는 여전히 재사용 문제 내포
프로시저와 다른 Scope 로 처리
Recompile 강제 어려움sp_recompile 테이블
모든 경우의 수에 따른 성능 확인 필요모든 경우의 수에 따른 성능 확인 필요
유의 사항• 하나의 쿼리는 하나의 실행 계획만을 가지도록 구성
– 쿼리를 분리 혹은 프로시저를 분리• SET NOCOUNT ON 세션 옵션 사용• OUTPUT 파라미터 , RETURN 활용• sp_executesql vs. EXEC 명확히 구분해서 사용• sp_ 접두사는 금기• 소유자명 명기 ( 내부 쿼리 포함 ), ex. dbo.UP• 프로시저 내에서 파라미터 값의 변형은 금기
– 조건 식에서 함수 호출에 주의– 조건 식에서 파라미터에 함수 적용 시에도 주의
• 불필요한 / 과도한 재컴파일 유의– 대형 프로시저의 경우 전체 프로시저의 재컴파일을 방지– 세션 옵션 사용에 유의
• 제한된 세션 옵션만 사용 ( 다음 장 참조 )• 특히 ANSI_NULLS, QUOTED_IDENTIFIER 는 소용 없음
– DDL / DML 구문은 교차하지 않도록 처리– 임시테이블 / 테이블 변수 사용에 주의
• 임시 저장 프로시저 방지
SQL Server 2005 New Features재컴파일 (Recompile)• 쿼리 최적화기의 변화 및 기능 향상• 구문 - 단위 재컴파일• EXEC (...) 쿼리에 대한 Cache 처리 지원• 쿼리 플랜용 비용 계산식의 변환• CLR 에서 호출된 배치에 대한 재사용 지원• 칼럼 단위 통계 처리 지원• 향상된 암시적 형 변환 처리 기능• 추가 힌트 지원 , ex. OPTION (RECOMPILE)• 향상된 자동 파라미터화 기능
SQL Server 2005 New Features통계정보 (Statistics)• 문자열 요약 통계 – LIKE 가 빨라졌다• 비동기적 통계 업데이트• 계산된 열에 통계 지원 향상• 대용량 개체 지원• 향상된 통계 로딩 구조• 최대 통계 수량 증가 – 2,000/ 테이블 , 32 칼럼• DBCC SHOW_STATITSTICS 출력 향상• 내부 테이블에 대한 통계 지원 – xml, fulltext index, etc• 풀 스캔 시의 병렬 수집• 생략된 통계 정보에 대한 자동 생성 및 재컴파일 지원• 빈 테이블에 대한 통계 업데이트 및 재컴파일 기능 향상• sp_updatestats 기능 향상
세션 요약
• 저장 프로시저를 호출하는 데이터베이스용 어플리케이션의 성능 문제를 이해한다 .
• 저장 프로시저와 일반적인 Ad hoc 쿼리와 어떻게 다른지를 이해한다 .
• 재컴파일로 인한 성능 문제를 이해하고 다양한 해결 방안들을 알 수 있다 .
• 저장 프로시저 사용시 발생 가능한 성능 문제의 유형들을 이해하고 그 해결 방안들을 알 수 있다 .
• SQL Server 2005 향상된 기능을 활용하자 .
추가 자료들• Microsoft SQL Server Query Processor Internals and
Architecturehttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnsql7/html/sqlquerproc.asp
• ( 기술자료 ) 저장 프로시저 재컴파일 문제 해결http://support.microsoft.com/kb/243586/ko
• Microsoft SQL Server 성능 튜닝 Technical ReferenceWhalen, Garcial, Deluca, Thompson | 정보문화사
• Inside Microsoft SQL Server 2000Kalen Delaney | 정보문화사
• SQL Server 최적화 튜닝정원혁 , iti 교육센타
• Programming a Microsoft SQL Server 2000 Database 2073, MOC 교육 과정
여러분의 여러분의 Microsoft Microsoft 기술 능력 평가기술 능력 평가
Microsoft Skills Assessment 무엇인가 ?• 현재 제품 및 기술 솔루션에 대한 능력 평가• Windows Server 2003, Exchange Server 2003,
Windows Storage Server 2003, Visual Studio .NET, Office 2003
• 무료 , 온라인 , 누구나 사용 가능• 평가결과를 기초로 Microsoft 교육 프로그램을
제안합니다 .• 평가항목과 최고점수 표시
• 방문하세요 ! www.microsoft.com/assessment
Microsoft Certified Systems Administrator(MCSA) 가 되자 !• MCSA 무엇인가 ?
– Microsoft Windows Server 기반의 시스템 , 네트워크 유지보수와 관리를 하는 IT 전문가를 위한 인증제도
• 어떻게 MCSA(Windows Server 2003) 합격 ?– 3개 코어 시험 통과– 1개 선택 과목
• 자세한 정보는 아래 URL 를 참고하세요 ?
www.microsoft.com/mcsa
Microsoft Certified Systems Engineer (MCSE) 가 되자 !
• MCSE 무엇인가 ?– Microsoft Windows Server System 기반의
비즈니스 솔루션 , 인프라스트럭처의 설계 , 도입계획 , 도입방법 , IT 운영자의 요구분석 능력을 인증하는 제도
• 어떻게 MCSE(Microsoft Windows 2003) 합격 ?– 6개 코어 시험 통과 – 1 새 선택 시험 통과
• 자세한 정보는 아래 URL 를 참고하세요 ?
www.microsoft.com/mcse
Microsoft Certified Desktop Support Technician(MCDST) • What is the MCDST certification?
– Microsoft Windows 오퍼레이팅 시스템에서 실행되는 데스크톱 환경의 문제해결 및 전문가의 기술지원 능력을 인증하는 제도
• 어떻게 MCDST(Microsoft Windows XP) 합격 ?– 2 개 코어 시험 통과
• 오퍼레이팅 시스템• 데스크톱 애플리케이션 지원
• 자세한 정보는 아래 URL 를 참고하세요 ?
www.microsoft.com/mcse
Specialization 인증을 도전하세요 .• MCSA/MCSE specializations?
– IT 전문가를 위한 메시징 , 보안 전문분야의 인증제도
• 현재 인증 가능한 전문 ?– MCSA: Security – MCSA: Messaging– MCSE: Security – MCSE: Messaging
• 자세한 정보는 아래 URL 를 참고하세요 ?www.microsoft.com/mcsa or
www.microsoft.com/mcse
www.microsoft.com/technet/subscriptions
TechNet 에 가입하세요 .최신 기술 뉴스를 받고 싶으세요 ?
평가기간 없는 소프트웨어 !: Technet Plus 가입자는 평가 목적으로 Microsoft 정품제품을 다양하게 시험을 할 수 있다 .
무료 기술지원 : 가입자는 2 개의 무료 기술지원을 받을 수 있으며 , 중요한 문제해결을 위해 시간을 절약할 수 있다 .
최신 TechNet 정보를 오프라인에서 사용 : TechNet 사이트의 Microsoft 평가 , 설치 , 솔루션의 정보를 CD 또는 DVD 로 받을 수 있다 .
어디서 정보를 얻을 수 있나요 ?• 웹 캐스트 또는 온라인 채팅
www.microsoft.com/technet/community/chatswww.microsoft.com/technet/community/webcasts
• 뉴스그룹 목록www.microsoft.com/technet/community/newsgroups
• Microsoft 커뮤니티 사이트www.microsoft.com/technet/community
• 커뮤니티 이벤트www.microsoft.com/technet/community/events
• 커뮤니티 칼럼www.microsoft.com/technet/community/columns
Recommended