대부분의 쿼리는 select문인데 저장프로시저로 바꾸면 장점이 무엇인지......
아래처럼 반별 금액을 조회할 때 쿼리와 저장프로시저의 속도차는 존재하는지요?
//쿼리
with qryTemp do
begin
active := false;
select sum(rcv_amt) as mamt from account where class_id=:cid and regdate > :curdate
ParamByName('cid').AsInteger := class_id;
ParamByName('curdate').AsString := formatdatetime(('yyyy-mm-dd', now);
active := true;
end;
with qryTemp do
begin
active := false;
ParamByName('cid').AsInteger := class_id;
active := true;
end;
//저장프로시저
create procedure SelectAcc
(
@v_cid integer,
@v_curdate varchar(10)
)
as
select sum(rcv_amt) as mamt from account where class_id=@v_cid and regdate > @v_curdate
//
혹시 C/S(2-Tier) 프로그램인지 3-Tier인지에 따라 조금 다르다고 할 수 있겠습니다만..
일반적인 개념을 들어서 설명드리죠..
SQL문이 실행되는 단계는 아시죠?
흠흠.. 혹시나 해서.. 서술 약간 하겠습니다.
client --> Server로 SQL문장이, Server --> Client로 Data가 전송됩니다.
여기서 문제는
SQL문장이 처리되기 위해서는 Parsing과 Execute, Fetch가 내부적 순서에 의해 처리된다는 것입니다.
혹시, Oracle이나 MS-SQL을 써 보셨으면, 실행계획이라는 것을 보셨을 겁니다..
(설마 안보신건 아니겠죠? ^^;)
SQL문장이 Server로 보내기 위해서, Client에서는
1. Database에 접속한다.
2. SQL문장을 보낸다.
3. SQL문장에 대한 서버의 응답을 기다린다.
4. 만약, 에러를 보내면 에러를 받고, 예외처리한다.
5. 에러가 없고, Data를 받는다면, 받을 수 있는 크기의 메모리용량을 확보한다.
6. data를 가져온다.
이 과정을 거칩니다.
Server측에서는
1. 받은 SQL문장을 Parsing(Library 혹은 Cache에 있는지 조사하여 없으면, 구문해석)을 한다.
즉, SQL문장의 Syntax를 확인한다.
2. SQL문장에 대한 실행을 한다. (이때 Database는 내부적으로 많은 작업을 하게 됩니다..)
3. 실행하여 얻은 결과를 메모리에 Load한다. (이때에도 내부적으로 많은 작업을 하게 됩니다.)
4. Client로 내보내기 위하여 Client의 요구를 확인 후 Data를 내보냅니다. (전체 Data 혹은 일부 Data)
Server측에서 1번을 수행할때 Library 혹은 Cache에 SQL과 같은 문장이 있고,관련Data도 있다면,
1,2를 수행하지 않고, 곧바로 4번을 수행합니다.
그렇지 않을 경우 2,3,4를 거칩니다.
만약, SQL문장이 이미 Server단에 저장되어져 있다면, 1번의 Parsing은 건너뛰게 됩니다.
왜냐하면, Procedure,Function이 생성될 시점에 이미 Compile이 이루어져 Parsing이 이루어지기 때문입니다.
이때 Procedure나 Function은 자주 수행될경우가 많으므로, Database는 메모리상에 그 루틴을 항상 배치시켜 놓는 것이 일반적입니다.
따라서, 1번이 자주 수행되지 않고,실행도 메모리에서 수행되므로 수행속도가 빠르며, 그 결과값이 메모리상에 존재할 가능성도 많습니다.
즉, 1,2,3이 수행되지 않을 가능성이 SQL문장을 계속적으로 보내 1,2,3,4를 반드시 수행하는 것보다는 빠르다는 것입니다.
헉헉..
헉.
더 설명드리려 해도 잠이 오네요..
Database의 내부적인 움직임은 Database Architecture를 공부하셔야지만 아실 수 있겠죠?
하지만, 너무 깊이 알게 되면, 그 한가지를 위해 더 많은 지식이 요구됨을 아실 겁니다..
마치, Database를 만지는 사람은 Linux나 Unix를 잘 다루는 것처럼요..