728x90
Stored Procedure
-- 저장 프로시저 이름은 "sp_" 시작하지 않도록 지정
- sp_procName : sysem proc : master database 를 먼저 lookup
- up_procName
-- 파라미터 스니핑 : recompile, if 분기 *****
- 데이타 분포가 안좋을때, 실행계획이 먼저 컴파일된 프로시져를 따라갈때 발생
ex)
create proc up_getadata @num int
as
select * from tbl where col = @num
with option (recompile) -- 2005 에서 해결방법
exec up_getadata 4
exec up_getadata 1
setstatistics io on
select * from tbl
- 해결방법(2000)
exec up_getadata 1 with (recompile)
-- 재컴파일 이슈 : recompile 되는 프로시져. 프로파일러로 확인
ex)
create proc XXXX
as
create table tmp(int)
select * from #tmp
-- 동적쿼리 쓰지말기 : 각 case 별로 sp 생성하는게 낫다.
-- if 분기 : sp 는 실행계획이 하나만 가지기 때문에 사용안하도록.
ex)
create proc XXX @num int
as
if @num = 1
select * from tbl
else
select * from ttt
-- 파라미터 다시 가공 안 하기 : equal(=) 에서는 괜찮으나, range 인 경우엔 문제를 야기시킴 **
ex)
declare @i int
set @i = 1
select * from tbl where col >= @i and col < @i
-- 정확한 파라미터 타입
ex)
create proc up_test
@num varchar(10)
as
select * from ttt where col = @num
-- 표준 템플릿
/* 작성자:
작성일:
파라미터
용도
수정목록(수정자/수정일/내용)
*/
CREATE PROC dbo.up_GetUser
@useno INT
AS
SET NOCOUNT ON
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
(사용자 쿼리 시작)
GO
-- 소유자 꼭 붙여주기(테이블도 마찬가지) : 없을 경우, 공유 잠금 발생.
- dbo 붙여주기. 없을 경우 실행한 application 이름으로 소유자로 인식.
-- 프로시져 작동 방식
1. 구문분석. 최적화
2. 옵티마이져 = 실행계획
3. 쿼리 실행
-- 문제가 될수있는 상황
1. cursor 를 사용하지 않도록
2. view 랑 join 하지 않도록(DB가 실행계획을 알지 못한다.)
'Engineering > DB' 카테고리의 다른 글
MSSQL 2005 관리자 강좌_11일차 (0) | 2010.12.16 |
---|---|
MSSQL 2005 관리자 강좌_10일차 (0) | 2010.12.16 |
MSSQL 2005 관리자 강좌_8일차 (0) | 2010.12.09 |
MSSQL 2005 관리자 강좌_7일차 (0) | 2010.12.08 |
MSSQL 2005 관리자 강좌_6일차 (0) | 2010.12.03 |