안녕하세요...
저도 언젠가는 답변을 올리는 날이 있기를 기대하며.. 또 올립니다.
데이타가 많아 조회하는데 세월입니다.(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;
혹시 그렇다면 그 부분에서 많은 속도저하를 가져옵니다.
우선은 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;
>