Q&A

  • 빠른 조회방법 없나요? Source 포함 -- Help Me
안녕하세요...



저도 언젠가는 답변을 올리는 날이 있기를 기대하며.. 또 올립니다.



데이타가 많아 조회하는데 세월입니다.(10만건),

조회기간을 주면 그 기간안에 있는 데이타의 정비시작일과 정비종료일의 시간차이를 구해서 조회기간의 Total 시간을 구해 시간차이/Total시간의 비율을 구하는 Query입니다. Source는 아래에 있습니다.



문제는 데이타가 많아 아래의 SQL문으로는 조회가 안되더군요..쩝

좀더 빠른방법의 Data조회가 없는지요...

참 Index사용방법을 아무리 찾아도 Create 및 Drop만 설명되어있고 사용하는 방법에 대한 언급이 없어서요.. 이방법을 써야 빨라지는 것인지도 알고 싶네요.. 한꺼번에 너무많은 질문을 한것인가요??



참고로 파라미터를 사용해서 SQL과 아래의 String을 이용해서 사용하는 SQL과 속도차이는 있는지요? 고수님의 많은 지도 바랍니다.

예) SQL := 'SELECT "MC_DEPT","MC_LOC","MC_TYPE","MC_MODEL","MC_CODE","ACT_DOWN_DATE",' + '"DOWN_MODE", "MAINT_END_DATE" - "ACT_DOWN_DATE", "DOWN_SEQ_NO", "SHIFT" FROM "TM_DOWN" ';



SQL := SQL + ' WHERE "MAINT_END_DATE" < (TO_DATE(' + '''' + formatDateTime('yyyy-mm-dd',EDATE.Date) + '''' + ', '

+ '''' + 'YYYY-MM-DD' + '''' + ')' + ' + 1.25)';

SQL := SQL + ' AND "MAINT_END_DATE" >= (TO_DATE(' + '''' + formatDateTime('yyyy-mm-dd',SDATE.date) + '''' + ', '

+ '''' + 'YYYY-MM-DD' + '''' + ')' + ' + 0.25)';





<>



with Query1 do begin

Close;

Sql.Clear;

Sql.Add('Select MC_Code, Maint_Start_Date, Maint_End_Date');

Sql.Add('From Tm_Down');

Sql.Add('Where Maint_Done = :pDone and Down_Mode = :pMode');

Sql.Add(' and Enter_Down_Date between :pFromDT and :pToDT');

Parambyname('pDone').Asstring := 'Y';

Parambyname('pMode').Asstring := 'E'; // 장비고장

Parambyname('pFromDT').AsDate := FromDT.Date;

Parambyname('pToDT').AsDate := ToDT.Date;



if Dept.Text <> 'All' then begin

Sql.Add('And Mc_Dept = :pDept');

Parambyname('pDept').Asstring := Copy(Dept.Text,1,4);

end;



if Loc.Text <> 'All' then begin

Sql.Add('And Mc_Loc = :pLoc');

Parambyname('pLoc').Asstring := Copy(Loc.Text,1,3);

end;

Open;

First;

end;

i := 0;

While not Query1.Eof do begin

DTCalc1.StartTime := Query1.FieldByName('Maint_Start_Date').AsDateTime;

DTCalc1.EndTime := Query1.FieldByName('Maint_End_Date').AsDateTime;

Down_Time := DTcalc1.Hours;

Temp := Round((Down_Time / Total_hour) * 100);



if Temp >= DTRate then begin

i:= i + 1;

DT_Grid.Cells[0,i] := Query1.FieldByName('MC_Code').AsString;

DT_Grid.Cells[1,i] := IntToStr(Total_Hour);

DT_Grid.Cells[2,i] := IntToStr(Down_Time);

DT_Grid.Cells[3,i] := IntToStr(Temp);

DT_Grid.Cells[4,i] := Emptystr;

end;

Query1.Next;

end;



5  COMMENTS
  • Profile
    김희중 2000.07.01 20:57
    제가 보기에는 DB그리드가 아니라 스트링그리드를 사용하신 것 같은데 맞는지요?

    혹시 그렇다면 그 부분에서 많은 속도저하를 가져옵니다.

    우선은 SqlPlus에서 위의 쿼리를 테스트 해 보시기 바랍니다.

    아래에 많은 답변으로 봐서 이 경우는 아니시겠지만 혹시나 해서 올려봅니다.

    그리고, 인덱스의 사용법은 일단 Create만 되어 있으면 Where문에 오는 필드에

    맞춰 오라클에서 자동으로 사용하는 것으로 알고 있습니다. 물론 여러개의 검색조건

    을 사용하셨으니 그중 하나의 인덱스를 우선시하겠지만..

    오라클에서 자동배정되는 인덱스때문에 속도가 떨어진다면 사용자가 사용할 인덱스

    를 지정할수 있는 방법은 있다고 하던데 그것까지는 잘 모르겠네요..

    별로 도움은 안되시겠지만 지나가다 그냥 한번 적어봤습니다.

    그럼 이만..

    준희 wrote:

    > 안녕하세요...

    >

    > 저도 언젠가는 답변을 올리는 날이 있기를 기대하며.. 또 올립니다.

    >

    > 데이타가 많아 조회하는데 세월입니다.(10만건),

    > 조회기간을 주면 그 기간안에 있는 데이타의 정비시작일과 정비종료일의 시간차이를 구해서 조회기간의 Total 시간을 구해 시간차이/Total시간의 비율을 구하는 Query입니다. Source는 아래에 있습니다.

    >

    > 문제는 데이타가 많아 아래의 SQL문으로는 조회가 안되더군요..쩝

    > 좀더 빠른방법의 Data조회가 없는지요...

    > 참 Index사용방법을 아무리 찾아도 Create 및 Drop만 설명되어있고 사용하는 방법에 대한 언급이 없어서요.. 이방법을 써야 빨라지는 것인지도 알고 싶네요.. 한꺼번에 너무많은 질문을 한것인가요??

    >

    > 참고로 파라미터를 사용해서 SQL과 아래의 String을 이용해서 사용하는 SQL과 속도차이는 있는지요? 고수님의 많은 지도 바랍니다.

    > 예) SQL := 'SELECT "MC_DEPT","MC_LOC","MC_TYPE","MC_MODEL","MC_CODE","ACT_DOWN_DATE",' + '"DOWN_MODE", "MAINT_END_DATE" - "ACT_DOWN_DATE", "DOWN_SEQ_NO", "SHIFT" FROM "TM_DOWN" ';

    >

    > SQL := SQL + ' WHERE "MAINT_END_DATE" < (TO_DATE(' + '''' + formatDateTime('yyyy-mm-dd',EDATE.Date) + '''' + ', '

    > + '''' + 'YYYY-MM-DD' + '''' + ')' + ' + 1.25)';

    > SQL := SQL + ' AND "MAINT_END_DATE" >= (TO_DATE(' + '''' + formatDateTime('yyyy-mm-dd',SDATE.date) + '''' + ', '

    > + '''' + 'YYYY-MM-DD' + '''' + ')' + ' + 0.25)';

    >

    >

    > <>

    >

    > with Query1 do begin

    > Close;

    > Sql.Clear;

    > Sql.Add('Select MC_Code, Maint_Start_Date, Maint_End_Date');

    > Sql.Add('From Tm_Down');

    > Sql.Add('Where Maint_Done = :pDone and Down_Mode = :pMode');

    > Sql.Add(' and Enter_Down_Date between :pFromDT and :pToDT');

    > Parambyname('pDone').Asstring := 'Y';

    > Parambyname('pMode').Asstring := 'E'; // 장비고장

    > Parambyname('pFromDT').AsDate := FromDT.Date;

    > Parambyname('pToDT').AsDate := ToDT.Date;

    >

    > if Dept.Text <> 'All' then begin

    > Sql.Add('And Mc_Dept = :pDept');

    > Parambyname('pDept').Asstring := Copy(Dept.Text,1,4);

    > end;

    >

    > if Loc.Text <> 'All' then begin

    > Sql.Add('And Mc_Loc = :pLoc');

    > Parambyname('pLoc').Asstring := Copy(Loc.Text,1,3);

    > end;

    > Open;

    > First;

    > end;

    > i := 0;

    > While not Query1.Eof do begin

    > DTCalc1.StartTime := Query1.FieldByName('Maint_Start_Date').AsDateTime;

    > DTCalc1.EndTime := Query1.FieldByName('Maint_End_Date').AsDateTime;

    > Down_Time := DTcalc1.Hours;

    > Temp := Round((Down_Time / Total_hour) * 100);

    >

    > if Temp >= DTRate then begin

    > i:= i + 1;

    > DT_Grid.Cells[0,i] := Query1.FieldByName('MC_Code').AsString;

    > DT_Grid.Cells[1,i] := IntToStr(Total_Hour);

    > DT_Grid.Cells[2,i] := IntToStr(Down_Time);

    > DT_Grid.Cells[3,i] := IntToStr(Temp);

    > DT_Grid.Cells[4,i] := Emptystr;

    > end;

    > Query1.Next;

    > end;

    >

  • Profile
    성호종 2000.06.30 23:12
    준희 wrote:

    source에 있는 select 문장은 join 이 없고 between을 적절히 쓰셨기
  • Profile
    준희 2000.06.30 23:25
    아래의 Source대로 하면 조회하는데 프로그램을 실행시키면 무지무지무지 오래 걸리는 것 같거던요? 다운된것 같기도 하고..쩝

    그래서 혹시 Stored Procedure를 사용하면 안되나요? DB 는 오라클7을 사용하는데 이방법으로 하면 조회가 혹시 빨라지는 지요..



    너무나 답답한 델초가... 참 Index는 생성하는 방법은 아는데 어떻게 사용해야 하는지 모르겠네요.. 쩝.. 혹시 예제소스가 있으면 부탁드립니다.





    성호종 wrote:

    > 준희 wrote:

    > source에 있는 select 문장은 join 이 없고 between을 적절히 쓰셨기
  • Profile
    갱수 2000.07.01 00:13
    준희 wrote:

    > 아래의 Source대로 하면 조회하는데 프로그램을 실행시키면 무지무지무지 오래 걸리는 것 같거던요? 다운된것 같기도 하고..쩝

    > 그래서 혹시 Stored Procedure를 사용하면 안되나요? DB 는 오라클7을 사용하는데 이방법으로 하면 조회가 혹시 빨라지는 지요..

    >

    > 너무나 답답한 델초가... 참 Index는 생성하는 방법은 아는데 어떻게 사용해야 하는지 모르겠네요.. 쩝.. 혹시 예제소스가 있으면 부탁드립니다.

    >

    >

    > 성호종 wrote:

    > > 준희 wrote:

    > > source에 있는 select 문장은 join 이 없고 between을 적절히 쓰셨기
  • Profile
    성호종 2000.07.01 01:14
    갱수 wrote:

    stored procedure 는 좀더 복잡하고 연산된 결과를 얻기위하여 DB 가 제공하는 language 입니다. 때문에 속도향상과는 전혀 상관이 없지요....

    DB tuning 을 하실때에는 우선 data scan 의 수치를 확인 하시고요...

    index를 create 하셔서 다시 scan 수치 확인...

    최적화 될때 까지 index를 생성, 삭제 해보세요...

    index 생성예제)

    create index 인덱스명 on 테이블명(필드명);

    ----------------------------------------------

    하시면 됩니다.

    create index ix0_tm_Down on tm_Down(pFromDT, pToDT);



    로 해보시고 별로 진전없으면 다시 drop index 하신다음

    다른 필드를 create index 해보시고 어느정도 진전을 보이는 index만 남겨두세요...

    누구는 Access Time 계산 알고리즘을 이용해서 최적화하는 사람도 있지만

    제 생각에는 경험이 캡빵인거 같더라구요....

    저는 금융기관 프로젝트 하고 있는 사람입니다...

    데이타가 수천만건 씩 되는 데이타도 튜닝 많이 해봤습니다.....

    하지만 너무 어려울
    • 꾸리
    • 2000.06.30 23:29
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 조규춘
      2000.07.01 01:02
      꾸리 wrote: > 델파이에서 엑셀화일로 받는 것처럼.. 이거는 무신 이야기인지 전혀 모르것군요... 헤...
    • 성호종
      2000.06.30 23:13
      타락천사 wrote: values 입니다... ^^ > 안녕하세여.. 타락임다...ㅠㅠ > > 음냐뤼.. 물어볼 사람...
    • 타락천사
      2000.06.30 23:21
      안녕하세여.. 타락임다..^^ 히궁.. 쪽팔려라... 쩌비.. 자기 실수는 발견하기 힘들져...ㅠㅠ 답변...
    • 영호
    • 2000.06.30 23:11
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김경식
      2000.06.30 23:59
      제가 모아놓은 팁에 있어서 올립니다. 이 글을 적어주신 분의 성함을 몰라서 죄송시럽네요. ^^; 마음으로...
    • 성더기
    • 2000.06.30 22:53
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 심동훈
      2000.06.30 23:38
      안녕하세요? 심동훈입니다. Application.MessageBox 를 사용해보세요. 도움말에 보시면 자세히 나와있...
    • 성더기
      2000.07.01 01:43
      심동훈 wrote: > 안녕하세요? > 심동훈입니다. > > Application.MessageBox 를 사용해보세요. > 도움...
    • somoon
    • 2000.06.30 22:57
    • 5 COMMENTS
    • /
    • 0 LIKES
    • somoon
      2000.07.01 00:07
      감사합니다. 박철우님, 그런데요. 역시 똑 같은 에러가 나는군요. 전체 코드를 올리오니, 이 불쌍한 ...
    • 성호종
      2000.06.30 22:59
      somoon wrote: procedure TForm1.Button1Click(Sender: TObject); begin with Query1 do begin c...
    • 조상
      2000.06.30 23:58
      안녕하세요. Query 컴포넌트를 Form에 추가 안하셨군요.. Query 컴포넌트는 'Data Acess' 컴포넌트파레트...
    • 박철우
      2000.06.30 23:50
      성호종 wrote: > somoon wrote: > procedure TForm1.Button1Click(Sender: TObject); > begin > wit...
    • somoon
      2000.06.30 23:30
      감사합니다. 님의 코드를 실행하니 다음과 같은 에러가 납니다. 한번더 살펴 봐 주십시오. 저의 코드는 ...
    • pomi
    • 2000.06.30 22:28
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 박철우
      2000.07.01 00:00
      강인모 wrote: > 수고하십니다. > 물어볼 질문을 요약하면, > Query(Query1) --> Datasource(SellDBS)...
    • 델초
    • 2000.06.30 21:16
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 조규춘
      2000.06.30 21:40
      델초 wrote: > 안녕하세요!!! > 저는 델파이로 윈도우 바탕화면용 캐릭터 프로그램을 만들려고 하는 초...
    • 준희
    • 2000.06.30 21:11
    • 5 COMMENTS
    • /
    • 0 LIKES
    • 김희중
      2000.07.01 20:57
      제가 보기에는 DB그리드가 아니라 스트링그리드를 사용하신 것 같은데 맞는지요? 혹시 그렇다면 그 부분에...
    • 성호종
      2000.06.30 23:12
      준희 wrote: source에 있는 select 문장은 join 이 없고 between을 적절히 쓰셨기
    • 준희
      2000.06.30 23:25
      아래의 Source대로 하면 조회하는데 프로그램을 실행시키면 무지무지무지 오래 걸리는 것 같거던요? 다운된...
    • 갱수
      2000.07.01 00:13
      준희 wrote: > 아래의 Source대로 하면 조회하는데 프로그램을 실행시키면 무지무지무지 오래 걸리는 것 ...
    • 성호종
      2000.07.01 01:14
      갱수 wrote: stored procedure 는 좀더 복잡하고 연산된 결과를 얻기위하여 DB 가 제공하는 language 입니...
    • 김주현
    • 2000.06.30 21:09
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 성호종
      2000.06.30 23:15
      김주현 wrote: field의 type속성이 빠졌네요.. table[8].asdate 가 아닐까 싶네요... ^^ > procedure ...
    • queen
    • 2000.06.30 21:02
    • 1 COMMENTS
    • /
    • 0 LIKES
    • cell
      2000.06.30 21:27
      queen wrote: > ora-00933:sql명렴어가 올바르게 종료되지 않았습니다. > sql을 제대로 입력하지 않...
    • 2000.06.30 23:33
      홍기원 wrote: > > > 1. 오라클 테이블 필드 정의 내역 : 시간필드을 단독으로 콘트롤 해야 되...
    • 최용일
      2000.06.30 20:49
      안녕하세요. 최용일입니다. Exit함수가 있습니다. ^^ 항상 즐코하세요. 이병웅 wrote: > 고수님 ...
    • 초보
    • 2000.06.30 20:15
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2000.06.30 20:23
      안녕하세요. 최용일입니다. 델파이뿐만아니라 다른 모든 컴파일러에도 그러한 옵션은 없습니다. 컴파일...
    • 김만성
    • 2000.06.30 19:44
    • 1 COMMENTS
    • /
    • 0 LIKES
    • cell
      2000.06.30 19:50
      김만성 wrote: > Project Project2.exe raised exception class EDBEnginError with message 'General SQL...
    • 성호종
      2000.06.30 23:04
      초초보 wrote: edit에 OnChange Event 에서 Grid에 Open되어있는 table 또는 Query를 first; repeat ...
    • 최용일
      2000.06.30 20:29
      안녕하세요. 최용일입니다. 간단하게 만드실려면 TMemo나 TRichEdit를 이용하시면 됩니다. 델파이 소스...
    • 이미나
      2000.06.30 21:20
      질문 1에 대한 답을 다른 델피언께서 올리셨더군요. 좀더 간단하고 속도빠른 방법이 있어서 갈켜드립니다....
    • 임형호
      2000.06.30 19:50
      사발우성 wrote: > > 하요 절정고수님들... 어제 질문을 잘못한듯 하네엽.. > > 다시 질문함당.....
    • ddd
      2000.07.07 05:44
      임형호 wrote: > 사발우성 wrote: > > > > 하요 절정고수님들... 어제 질문을 잘못한듯 하네엽.. > ...