본문 바로가기

TroubleShooting/DB

MSSQL 2005 관리자 강좌_9일차

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가 실행계획을 알지 못한다.)