[관계형 DB] 질의 구문 실행 + 저장 프로시저(SP, Stored Procedure)

Jin Hur·2022년 7월 17일
0

Server Programming

목록 보기
12/14

질의문 예시

select

(1) 플레이어 ID와 비밀번호 얻기

select ID, Password from UserAccount where ID='Hong Gil Dong'

(2) 플레이어가 가진 캐릭터들의 이름 얻기

select Name from Character where OwnerUserAccoutID='Hong Gil Dong'

(3) 플레이어가 가진 캐릭터 하나에 대한 모든 정보(필드)를 얻기

select * from Character where ID='Little_Elf'

update

캐릭터가 몹 사냥 후 경험치를 획득하여 경험치 관련 레코드의 필드를 업데이트

update Character set Exp=2943 where Name="Little_Elf"

캐릭터가 아이템 3개 중 1개를 소모하여 2개가 남음

update Item set Amount=2 where ID=37485

insert

캐릭터가 타입 34인 아이템을 3개 획득하여 Item 테이블에 새 레코드를 추가

insert into Item (ID, OwnerCharacterName, Type, Amount) values (37485, 'Little_Elf', 34, 3)

delete

캐릭터가 아이템을 버리게 되어 아이템 레코드 삭제

delete from Item where ID=37485

저장 프로시저(Stored Procedure)

게임 서버가 데이터베이스에 질의 구문을 자주 던지는 것은 비효율적이다.

  • 질의 구문 던지기 후 결과 받기 과정이 수행되는 동안 디바이스 타임(device time) 발생
  • 게임 서버와 데이터베이스 간 네트워크 레이턴시를 다 모으면 꽤 긴 시간이다.

극단적인 예를 들어보면,

for(i=0 to 100) {
    select xxx from yyy whrer zzz=i
}

위의 경우 게임 서버는 DB에 select 구문을 100번 던져야 한다. 그러면 게임 서버와 데이터베이스 사이의 대화는 100회 오가게 된다. 단 한 번만 오가면 좋을 텐데 말이다.

DB는 질의 구문을 받으면 이를 처리할 수 있는 준비 작업 연산을 한다. 심지어 질의 구문을 받을 때마다 이러한 준비 작업 연산이 발생한다. DB 엔진은 받은 질의 구문을 분석하고 무슨 일을 해야 할지 계획한다. 이 과정이 매번 발생되는 것이 아니라 처음 한 번만 이 일을 하고 이후부터 생략하는 방법이 있다. 바로 저장 프로시저(SP)라는 기능이다.

데이터베이스 측에 미리 질의 구문 집합을 저장해 둘 수 있다. 이를 저장 프로시저라고 한다. 저장 프로시저는 데이터베이스 안에서 직접 실행되는 "스크립트 프로그램"이라고 할 수 있다.

데이터베이스에 저장한 저장 프로시저는 사용되기 전에 실행 계획 준비 작업이 완료된 상태로 보관된다.
이제 게임 서버는 질의 구문을 일일이 다 실행할 필요가 없다. 그저 저장 프로시저 자체를 실행하는 질의 구문만 실행하면 된다.

create procedure LoadCharacterAndItem
    @Name nvarchar(50) -- 저장 프로시저의 입력 매개변수
as
begin   -- 여기서부터 저장 프로시저 루틴의 시작
    select * from Character where Name=@Name
    select * from Item where OwnerCharacterName=@Name
end     -- 루틴의 끝

저장 프로시저가 데이터베이스에 추가된 후 게임 서버에서는 저장 프로시저를 호출하는 질의 구문을 실행한다. 실행할 때는 다음과 같이 EXEC 다음에 저장 프로세저 이름과 매개변수를 나열하면 된다.

EXEC LoadCharacterAndItem @Name='xxx'

그러면 데이터베이스는 저장 프로시저 안에 있는 많은 구문을 알아서 다 실행한다.

0개의 댓글