Q&A

  • ODAC사용시 속도 문제
현재 오라클을 ODAC으로 열결시켜 테스트를 하는데 한 프로그램에서 MS_SQL과 오라클을
동시에 연결하여 사용하고 있습니다.

그런데 오라클은 읽기만 하는데 속도가 무척 늦게 뜨네요.

처음 사용해서 그런지 Session쪽과 OraQuery에서 속도와 관련된 옵션 또는 파라메터들이
어떤것이 있는지 사용해 보신 분 있으시면 조언 부탁드립니다.

참고로 해당되는 부분을 첨부합니다.

    with ORAQuery1 do
        begin
          i_row := 0;
          sglist2.rowcount := 0;
          close;
          SQL.CLEAR;
          SQL.ADD(' select * from xxx ');
          SQL.ADD(' where (DT = '''+t_Key+''')' );
//          SQL.Add(' order by DT ');
          OPEN;
          while not EOF do
            begin
              sglist2.cells[0, i_row] := inttostr(i_row + 1);
              sglist2.cells[1, i_row] := fieldbyname('a').asstring + '-' + fieldbyname('SEQ').asstring;
              t_cust := fieldbyname('b').asstring;
              t_prod := fieldbyname('c').asstring;
              t_dept := fieldbyname('d').asstring;
              t_no := fieldbyname('e').AsString;
              t_kind := fieldbyname('f').AsString;
              with ORAQuery2 do
                  begin
                  close;
                  SQL.Clear;
                  SQL.ADD('select * from x1 where (a = '''+t_cust+''') and (b = '''+t_dept+''')');
                  OPEN;
                  sglist2.cells[2, i_row] := fieldbyname('a').asstring;
                  end;

              with ORAQuery2 do
                  begin
                  close;
                  SQL.Clear;
                  SQL.ADD('select * from x2 where (a = '''+t_cust+''') and (b ='''+t_dept+''') and (c = '''+t_prod+''')');
                  OPEN;
                  sglist2.cells[3, i_row] := fieldbyname('a').asstring;
                  end;

              with ORAQuery2 do
                  begin
                  close;
                  SQL.Clear;
                  SQL.ADD('select * from x3 where DT = ('''+t_key+''') and (a ='''+t_no+''') and (b = '''+t_kind+''')');
                  OPEN;
                  sglist2.cells[4, i_row] := fieldbyname('a').asstring;
                  end;

              with ORAQuery2 do
                  begin
                  close;
                  SQL.Clear;
                  SQL.ADD('select * from x4 where a = ('''+t_mst+''')');
                  OPEN;
                  sglist2.cells[8, i_row] := fieldbyname('a').asstring;
                  sglist2.cells[9, i_row] := fieldbyname('b').asstring;
                  end;

              inc(i_row);
              sglist2.rowcount := sglist2.rowcount + 1;
              next;
            end;
        sglist2.rowcount := sglist2.rowcount - 1;
        end;
2  COMMENTS
  • Profile
    착한천사 2007.02.16 05:56
    착한천사 김경록입니다.
    이런것은 SQL-Tunnig에 속하는 것으로 님께서 작성하신 중복 Query문은
    1개의 SQL문장으로 수정할 수 있습니다.
    왜냐하면, key를 가진 xxx 테이블의 자료와 x1,x2,x3,x4등등의 자료와 비교를 하기 때문이죠..
    즉, master와 detail구조와 같은 것으로..
    이것은 한개의 SQL구문으로 변환할 수 있다는 결론이 나옵니다..
    이렇게 했을 경우..
    님이 처리해 놓은 구문들의 결과값이 나오는 반응시간이 1/10 보다 더 줄어들 것이라 판단되네요..
    님께서는 SQL-Tunning을 연구하심이 좋을 것으로 보입니다..

    저도 실무에서 SQL-Tunning으로 개선을 봤던 것 중의하나가..
    집계부분이었는데..
    결론만 말씀드리면, 전임자가 결과값이 나오는데 약 20~25분정도 걸리던 것을..
    8~12초정도까지 줄여봤던 경험이 있습니다..
    물론, 결과값까지 나오는 시간이 분단위였던것을 초단위로 바꿨던적은 수도 없이 많지만..
    예를들어 그렇다는 것이니까.. 오해는 마십시오..

    사용자(Client)가 조회 후 결과값까지 나오는 시간이 짧으면 짧을수록 그 직원은
    업무적으로 빠른 대처가 생기므로 이는 회사의 경쟁력을 높이고
    보이지 않는 무한자산을 끌어올리는 업무적 특성을 가지고 있습니다.. ^^;
    그래서, 어플리케이션 개발자나 DB를 다루는 사람은 공부를 많이하는것이
    회사의 능력을 올리는 일인것이겠죠..
    이거 쓸데 없는 곳으로 말이 셌습니다.. 죄송합니다..  (--)(__)

    각설하구요..

    결과적으로
    님의 경우는 Connection과 Parsing,Execution이 빈번하게 발생하게 하여
    서버의 성능을 저하시키는 요인을 가지고 있는
    Application단위의 가장 큰 문제점이라고 할 수 있습니다.

    이와같이 여러개의 SQL문장을 1개의 문장으로 변환하는 것이 Tunning작업의 정석이 되겠죠..
    우쨌든, SQL-Tunning을 해 보심이 정답일것 같습니다.

    다시 한 번, 최용일님께 한표!!






  • Profile
    최용일 2007.02.15 02:15
    안녕하세요. 최용일입니다.

    ORAQuery1의 데이터 한건당 4번의 쿼리를 다시 날리는구조군요. 데이터가 많으면 많을수록 굉장히 느릴수밖에 없는구조네요...

    대강보니 sql한번에 다 처리가 가능한 것같네요...

    x1테이블 쿼리까지만 하나의 sql로 만들면... 아래와 같이 되겠네요...

    select xxx.*, x1.a as x1_a
    from xxx, x1
    where (DT = '''+t_Key+''')'
    and (x1.a = xxx.b) and (x1.b = xxx.d)

    나머지 쿼리도 합쳐서 한번의 쿼리로 다 가능하도록 고쳐보세요...

    ^^ 항상 즐코하세요...

    • 최용일
      2007.02.15 08:39
      안녕하세요. 최용일입니다. 첫번째 같은 경우는 한번도 발생한적이 없어서... Assign만 하면 별문제 없...
    • 이은주
      2007.02.15 22:47
      말씀하신대로 하니까 TImageList 에서의 이미지는 정상적으로 들어가고 뒤에 흰색은 없지만 검정색이 약간 ...
    • 이은주
      2008.12.10 10:35
      컴포넌트를 dev 로 바꾸었는데 이제는 그런 문제가 없군요. 최용일님께 다시 한번 감사 말씀 드립니다. ...
    • 박준철
    • 2007.02.14 10:19
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이희진
      2007.02.14 22:48
      프로젝트 소스 상에 uses 절에 들어간 순서대로입니다. uses절에서 순서를 정렬하시면 됩니다. ^^ 자...
    • 문혜윤
    • 2007.02.13 18:46
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 착한천사
      2007.02.16 05:56
      착한천사 김경록입니다. 이런것은 SQL-Tunnig에 속하는 것으로 님께서 작성하신 중복 Query문은 1개의 SQ...
    • 최용일
      2007.02.15 02:15
      안녕하세요. 최용일입니다. ORAQuery1의 데이터 한건당 4번의 쿼리를 다시 날리는구조군요. 데이터가 많...
    • 궁금이
    • 2007.02.13 08:47
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 착한천사
      2007.02.16 06:03
      어려운거네요.. 이런거는 흔히 무협지 볼때 많이 봤던건데.. T.T 경험상으론.. 한글 조합형을 완성형...
    • 박성준
      2007.02.13 09:49
      TEmbeddedWB를 사용했을때 Download Option에 이미지를 다운로드 하지 않는 프로퍼티가 있습니다. 이...
    • 이윤희
      2007.02.13 17:56
    • 진석
    • 2007.02.13 03:10
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2007.02.13 12:34
      안녕하세요. 최용일입니다. in구문은 Project나 Library소스파일에서만 쓸 수 있습니다. 프로젝트별...
    • 이희진
      2007.02.13 17:57
      ShellExcute를 사용하는 건 좋은 해결책이 아닌 것 같습니다. printer.Canvas.Draw(0,0,Image1.Picture....
    • 윤지현
      2007.02.13 18:49
      답변 감사합니다. 제가 쓰는 이미지 확장명이 bmp 가 아니라 jpg라서 그런 것 같습니다. 용량이 확 ...
    • 이희진
      2007.02.14 22:51
      간단하게 구현해봤으니 참고해보세요.
    • 윤지현
      2007.02.15 00:22
      친절하게 소스까지.. 정말 감사합니다. ^^* 주신  샘플코드로 실행해봤는데, 여전히 출력할 ...
    • 이희진
      2007.02.15 01:57
      프린터 드라이버 설정 문제로 보입니다. 최신 드라이버인지, 프린터 설정은 어떻게 되어 있는지 확인해보...
    • 이희진
      2007.02.12 21:26
      네, 별도의 처리를 해주어야 합니다. 윈도우 작업표시줄에 뜨는 건, 어플리케이션의 시스템 메뉴이고, ...
    • 박성준
      2007.02.12 23:53
      처음에 사실 질문이 이해가 되질 않았습니다. ^^;; 그런데, 답변을 보고 검색을 나름대로 해보니 이해했...
    • 이은주
      2007.02.13 08:57
      몇년 넘게 델파이를 쓰면서 이걸 모르고 계속 의문만 가지고 있었네요. 다른 분들도 모르시는 분들이 계실...
    • 박성준
      2007.02.13 09:51
      좀더 몇자 적어보면 저는 개인적으로 델파이사이트를 참고할때 국내 널리알려진 몇군데만 접속하거든요? ...
    • 박동호
    • 2007.02.10 16:54
    • 2 COMMENTS
    • /
    • 0 LIKES
    • Marek
      2007.02.10 21:37
      안녕하세요. 6.5와 2000의 특성보다는 키값의 중복때문입니다. 거래처의 테이블구조를 살펴보시고 키중복...
    • 박동호
      2007.02.15 17:26
      고맙습니다.
    • HEIM(델파리)
      2007.02.15 23:48
      결국 자답을 하게되었네요. 이 문제로 고민하시는 분이 꽤 있으셨더군요. 델파이 용 라이브러리 두개...
    • 모영철
      2007.02.10 02:47
      FreeAndNil(pTimer);
    • 이은주
      2007.02.10 15:20
      감사합니다. 그런데 이게 할당이 밴수에 인스턴스가 생성안된 경우에도 문제가 없는건지 모르겠군요. ass...
    • 모영철
      2007.02.12 20:02
    • 이은주
      2007.02.13 08:47
      ..!
    • Marek
      2007.02.10 21:55
      안녕하세요 델파이 팁&테크에서 GetCurrentUserAndDomain으로 검색하시면 최용일님께서 올린 팁을 찾으실...
    • 낙화
    • 2007.02.09 17:51
    • 0 COMMENTS
    • /
    • 0 LIKES
    • sulonge
    • 2007.02.08 22:16
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 착한천사
      2007.02.11 00:51
      음.. "저도 CTRL+마우스 클릭" 이 좋다고 생각합니다. 저는 델4는 기억이 잘 안나고, 델5,6에서는 되었던...
    • 박성준
      2007.02.11 01:22
      View Explorer에 대한 답변을 제가 달긴했어도... 저또한 CTRL+마우스 클릭이 좋다고 생각합니다... 저...
    • 깔쌈보이
      2007.02.09 20:40
      CTRL 키를 누른채로 해당 함수를 마우스로 클릭해보십시오. 델파이 버젼을 얼마를 가지고 계신지 모르겠지...
    • 박성준
      2007.02.08 23:10
      저도 왕초보지만 제가 아는 내용이라 답변 적어봅니다. 제가 사용하는 Delphi 7 Version에선 Shift + C...
    • 델파인
    • 2007.02.08 18:55
    • 2 COMMENTS
    • /
    • 0 LIKES
    • NeoSky
      2007.02.10 19:57
      이렇게 하니깐.. 되네요.  EmbededWB Event에 있습니다. procedure TForm1.EWB1NewWindow2(Se...
    • 박성준
      2007.02.08 20:32
      http://www.delmadang.com/cwb-bin/CrazyWWWBoard.exe?db=dmdqa&mode=read&num=128531&page=1&backdepth=1 ...
    • 이종운
    • 2007.02.08 07:15
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2007.02.08 21:46
      안녕하세요. 최용일입니다. 1번은 델파이 Bin폴더에 dcc32.exe라고 커맨드라인 컴파일러가 있습니다. 도...
    • 민스맘
    • 2007.02.07 02:45
    • 5 COMMENTS
    • /
    • 0 LIKES
    • 행복맨
      2007.02.09 02:33
      음... 지나가다... 폼의 속성중에 showing 이란 속성으론 해결이 안되나여 ?
    • 박성준
      2007.02.09 03:02
      그게 더 간단할수도 있겠는데요?
    • 석주현
      2007.02.07 07:47
      좀 질문이 애매하네요. 일단 Form 을 Show 하면 Visible 이 True 될 것이고 Close 하면 Visible 이...
    • 민스맘
      2007.02.07 18:44
      Form 을 Close 하면서 Free 하거든요...그래도 과연 그게 될까요?
    • 석주현
      2007.02.09 00:27
      Form을 Free 하면서 Form := nil 해주고 나중에 if Form = nil then 으로 하시면 될 것 같네요. ...