Q&A

  • ORDER BY 를 않쓰고 SORT 하는 방법이 있나요?
<!--CodeS-->
Select  jj.Chcode, gj.Gjcode, jj.Model, jj.REV, jj.SaejiNo+jj.LotNo JakNo,  ch.ChName,
       gj.GjNabDate, gj.IoGubun, gj.BalPermit,  gh.DNC, gj.outco,
       Round((gj.InsuRang-gj.IngeyRang-gj.WasteRang)/gh.Gaech,1) Maesu, co.GjName,
       (gj.InsuRang-gj.IngeyRang-gj.WasteRang) JaeSurang, gh.Layer,Gj.GjTime,
       (st.kum/st.Surang)*(gj.InsuRang-gj.IngeyRang-gj.WasteRang) JaeKum, Sa.BuName,GJ.Outco,
       gh.PS, gh.EP, gh.Ek, co.CAPAdanwi, gj.JanRang, JJ.JunabDate,
       gh.pnlsize1, gh.pnlsize2
From jakji jj, Gjctrl gj, Saeji sj, sujut st, SujuH Sh, Goodhis gh, Good gd, Chco ch, SaBun Sa, gjcode co  
Where jj.Chcode = gh.Chcode  
  And jj.Model = gh.Model    
  And jj.REV = gh.REV        
  And gh.Chcode = gd.Chcode  
  And gh.Model = gd.Model    
  And gh.REV = gd.REV        
  And gj.Gjcode = co.Gjcode  
  And jj.SaejiNo = gj.SaejiNo
  And jj.LOTNo = gj.LOTNo    
  And jj.SaejiNo = sj.SaejiNo
  And jj.SuNo = st.SuNo  
  And jj.Sujuil = sh.Sujuil  
  And jj.SujuNo = sh.SujuNo  
  And jj.Chcode = ch.Chcode  
  And Sh.Saler *= Sa.SaBun
  And (gj.Insurang-gj.IngeyRang-gj.WasteRang) <> 0
Order By jj.Chcode, gj.Gjcode, jj.Model, jj.REV, JakNo
<!--CodeE-->

위 내용이 실제로 쓰는 쿼리입니다. 실시간으로 현제 작업대기중인 데이터를 불러 오는 쿼리인데..
실행시키면 500개 정도의 데이터나 늘 유지 됩니다.

500개 만들어 뿌려주는데 무려 2분이상이 쿼리에서만 소요되는 군요..

혹시나 하고 Order By 를 지웠더니.. 딸랑 10초...
뭐 10초도 길다고 하면 길겠지만 2분보다야 무척빠른 시간이라.. 줄여 보려는 마음에 이것 저것 작업해 봤지만..
맘같이 않되네요..

Order By 않쓰고 원하는 방식대로 정렬하는 방법 있을까요?
그리고 쿼리좀 보시고 고칠 부분있으면 알려 주세요.. 속도 개선에 도움이 되는 방향으로..
부탁드립니다.. ^^

그럼.. 감사합니다.. ^^
1  COMMENTS
  • Profile
    착한천사 2007.06.08 23:15
    님께서 써주신 Query의 결과건수가 500~1000건이 항상 유지된다고 볼때
    Parsing-->fetch-->execution-->DataSet return으로 이어지는 과정(결과가 보이는 과정)의
    시간이 10초인데.. order by를 했을때 2분이라...
    이건 Query의 문제가 아니라..
    Client에서 어떤 작업을 다시 하는게 아닐까요?
    Query상에서 500~1000건의 정렬은 실제로 오래 걸리지 않습니다.
    혹시 Database를 어떤것을 사용하시는진 몰라도
    정렬을 사용하기 위한 Sort Area Size가 작아 서버측 메모리에서 정렬이 되지 않고
    Disk에서 정렬이 되어 그러한 현상이 나타날 수 있습니다.
    즉, 메모리가 부족하여 Disk를 메모리처럼 사용하기 때문에 그러한 문제가 발생할 수 있습니다..
    그러나, Order by에 의해서 10초와 120초(2분)의 차이는 좀 너무하는군요..
    oder by를 사용해서 질의분석기(오라클의 SQL plus같은 것)에서 결과를 볼때
    몇초가 소요되는지 보시기 바랍니다..
    델파이에서 보시지 말고.. DB전용툴 혹은 Database에서 제공하는 자체 SQL툴을 이용해서
    결과값을 보여줄때까지 소요시간을 대충 Test해 보십시오..

    정렬하지 않고 결과까지 보이는 시간이 10초면 정렬을 하더라도 11초도 되지 않아서
    정렬이 완료되어야만 합니다.
    (Oracle이라면 Sort Area Size의 공간부족으로 PGA할당이 되지 않아 이루어질 수 있는 문제입니다.
    parameter 튜닝일 필요하수도 있겠습니다..
    이러한 것은 반드시 물리적인 메모리가 여유가 있어야지만 되겠습니다)

    Query에 의해서 정렬을 하는 방법외에 정렬은
    TQuery 컴포넌트 혹은 TQuery를 상속하여 만든 컴포넌트들에서 Sort 프로퍼티를 이용하시면 되겠습니다.