Q&A

  • 쿼리에 비해 저장프로시저의 장점은 무엇인가요?
대부분의 쿼리는 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
//

2  COMMENTS
  • Profile
    착한천사 2006.08.08 08:26
    착한천사입니다.

    혹시 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를 잘 다루는 것처럼요..



  • Profile
    이영주 2006.08.03 19:50
    컴파일 시점의 차이라고 할까요?
    쿼리 요구때마다 컴파일하느냐 아니면 미리 컴파일 해놓았느냐...
    어쩌다가 한번씩 쓰는 쿼리라면 별 속도차이가 없겠지만 사용 빈도가 높다면 저장 프러시져가 유리 하겠죠?
    서버의 부담도 줄겠고.

    • 정영은
    • 2006.08.08 01:27
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 최충일
    • 2006.08.08 00:47
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      2006.08.10 04:23
      현제 Fax관련 컴포넌트로는 제가 알고있는것은 AsyncPro 밖에 없습니다... 물론 다른 상용도 존재 할순 ...
    • 똘기콩쥬
      2006.08.10 18:59
      델파이가 처음이시라면, 권장하는 방식은 국내 업체를 검색해서 제품을 구매하시는 쪽을 권해 드리고 싶...
    • 구기
    • 2006.08.07 20:27
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 착한천사
      2006.08.08 08:04
      착한천사합니다. MS-SQL을 안한지 정말 오래됐네요.. 최근 몇년간 oracle만 사용하다보니.. (옛날에는 ...
    • 하수경
    • 2006.08.07 18:13
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김영구
      2006.08.07 20:05
      FormatFloat 함수 사용하세요 FormatFloat(FormatType, Value); FormatType : #,##0.00 (0은 해당자...
    • 정보근
    • 2006.08.05 22:40
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 구창민
      2006.08.06 00:38
      SetWindowPos 함수를 사용해 보세요.. 즐거운 프로그래밍 하세요~
    • 정보근
      2006.08.06 01:12
      SetWindowPos(FormQMAP.Handle,HWND_TOPMOST,Left,Top,Width,height,SWP_SHOWWINDOW); 요렇게 했는데 ...
    • 칠돌이
      2006.08.06 20:36
      http://www.bsalsa.com/ 에 가시면 받으실수 있습니다. >지금은 폐쇄되었지만 예전에 http://www.eur...
    • 송 시중
      2006.08.08 04:23
      감사합니다. 전혀 다른 주소로 이동되길래 흔히 볼 수 있는 사라진 사이트때문에 호스팅 업체가 이동시는...
    • 정영은
    • 2006.08.05 03:14
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 권석진
    • 2006.08.05 02:20
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2006.08.05 03:07
      안녕하세요. 최용일입니다. 아래와 같이 해보세요... <!--CodeS--> // Save var  &nbs...
    • 권석진
      2006.08.07 21:13
      우선 도움을 주셔서 감사 합니다. 제가 최초 저장 하려 했던 목적이 파일에 저장 하기 위합 이었는데요....
    • 최용일
      2006.08.07 22:59
      IntToStr==>StrToInt
    • 권석진
      2006.08.08 02:00
      생각 보다 간단한데 왜 몰랐는지 이해가 안되네요.. ^^;; 간단히 달아 주시면서 상당히 어의가 없으셨을듯...
    • 채창훈
    • 2006.08.04 22:32
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 박홍재
      2006.08.05 20:56
      .pas 파일의 interface 바로 아래 uese 절에 Printers 를 추가해 주시고 Printer.PrinterIndex := Printe...
    • 구창민
      2006.08.06 00:25
      안녕하세요.. 이렇게 하시면 되겠네요.. WinExec(PChar('explorer /select, /e, "C:\Windows\win.ini...
    • 이은주
      2006.08.06 08:29
      진심으로 감사드립니다. 늘 절실한 도움 사이트에서 받고 있습니다. 좋은 컨탠츠가 더 많이 쌓여 모두에...
    • 돌아왕
    • 2006.08.03 22:58
    • 5 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      2006.08.03 23:33
      핸들을 넘겨주거나, 소켓을 넘겨주거나 마찬가지 입니다. 성능이나 메모리 사용량에서 다를것이 없어요....
    • 돌아왕
      2006.08.04 00:40
      그래도 핸들을 어떻게 사용하는지 알고 싶으네요.. 핸들 어떻게 하면 사용할 수 있나요..뭘 넘겨주면 ...
    • 이정욱
      2006.08.04 08:23
      받으신 소켓.Handle 하면 핸들값 을 넘길 수 있고, 다른쪽에선 받은 핸들을 가지고 결국 소켓화 하여 처리...
    • KDDG_Apine
      2006.08.05 03:38
      저는 handle을 사용하는것보다는 포인터 값만 받아서 처리 하는쪽 편하지 않을까 싶습니다.. 예를 들어 TL...
    • 이정욱
      2006.08.10 04:24
      음냐.. 객체를 넘기는게..포인터를 넘기는것과 같습니다..  실제 객체로 왔다 갔다 하는게 아니...
    • 채창훈
    • 2006.08.03 19:52
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      2006.08.03 21:45
      AssignFile 이라는 함수가 다른 함수에 있는 것을 참조하려고 하는것 같습니다. 보통 System유닛에 있는 ...
    • 채창훈
      2006.08.03 22:18
      아..  참 신기하네요..  왜, 어쩌다가 이런 일이 발생했는지 모르겠습니다만.. 어...
    • 이정욱
      2006.08.03 21:51
      각 각의 레포트에는 TeeChart 컴포넌트를 위한 레포트 전용 차트 컴포넌트가 따로 있을것입니다. 아마 ...
    • 델델
    • 2006.08.02 23:56
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      2006.08.03 22:17
      델7에는 라인넘버가  에디터에서 나오게하는 기능은 내장되어있지 않습니다. IDE플러그인을 ...
    • 채경수
    • 2006.08.02 01:11
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 신철우
    • 2006.08.01 20:22
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 착한천사
      2006.08.08 08:26
      착한천사입니다. 혹시 C/S(2-Tier) 프로그램인지 3-Tier인지에 따라 조금 다르다고 할 수 있겠습니다만....
    • 이영주
      2006.08.03 19:50
      컴파일 시점의 차이라고 할까요? 쿼리 요구때마다 컴파일하느냐 아니면 미리 컴파일 해놓았느냐... 어쩌...
    • wasup
    • 2006.08.01 18:06
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김종명
      2006.08.01 18:13
        chart.BottomAxis.DateTimeFormat := 'hh:mm:ss';   chart.BottomAxis.LabelSt...
    • 착한천사
      2006.08.06 01:45
      착한천사입니다. Connection Interface는 별로 어렵지 않습니다. 먼저, Oracle Client가 필요합니다.. ...
    • 권태훈
      2006.07.31 22:04
      두가지 방법이 있는데 일단 odbc로 해보시고 그 다음에 bde에서 해보십시요. 제어판->관리->데이...