현재 ADO 쪽 조건은 이렇습니다.
client의 mdac버전은 2.8 최신버전 입니다.
TAdoConnection <- TAdoQuery <- TDataSource <- TDbgride
이렇게 연결했구요.
Connection String 값은
'Provider=SQLOLEDB.1;Password=BEST;Persist Security Info=True;User ID=BEST;Initial Catalog=BESTLRM;Data Source=210.91.xx.xx'
TAdoConnection과 TAdo쿼리의 커서로케이션 값은: 클라이언트 로 맞춰놨고
TAdoConnection과 TAdo쿼리의 커서타입 값은: ctStatic 로 맞춰놨고
TADOQuery의 cash size는 200으로 했습니다.
BDE 쪽은
MS-SQL 클라이언트 드라이버를 통해 다이렉트로 BDE에 연결했습니다.
-------------------------------------------------------------------
서버쪽 시스템 사양은
NT서버 4.0 서비스팩 6a
SQL서버 버전은 MS-SQL서버 7.0 서비스팩4
펜3 500 듀얼 메모리 1GB
HDD ULTRA 160 wide scsi 18기가에 NTFS 파일 시스템으로 동작되고 있습니다.
클라이언트쪽 시스템 사양은
펜4 1.4G 256RDRAM Win98se
델파이 7
인데요..
아래의 SQL문을 실행시
ADO로 하면 22초 BDE로 하면 거의 1초 입니다.
이 속도 문제의 해결방법은 어떻게 하면 BDE 속도에 근접시킬수 있을까요?
ADO 는 SQL서버OLEDB 로 연결했습니다.
참그리고 더 재밌는 현상은 아래의 쿼리를
디자인 타임시에 TADOQuery의 sql스트링 프로퍼티에 넣어주고
TADOQuery의 ConnectionString 프로퍼티의 값을 직접 TAdoConnection의
TAdoConnection의 ConnectionString 프로퍼티 값과 동일한 값을 준후에
TADOQuery의 Active 프로퍼티를 True로 셋 하여 직접 dbgrid와 연결된
상태를 디자인 타임시에 볼때는 BDE와 동일한 속도처럼 읽어 온다는
사실 입니다.
LAN은 100BaseT 환경이고 현재 BLRM_TAXM 테이블에 저장된 ROW는 TEST 중이어서
단 1~2개 정도 저장되어 있습니다.
그런데 더 희안한것은 쿼리문의 라인수가 많아질수록 더 느려지내요.
BDE 쪽은 거의 변화가 없는데..,
MS에서 제공하는 쿼리분석기로 실행해도 단 1초 안에 결과가 리턴되는데
왜 델파이에 ADO를 연결하여 "컴파일한 실행화일"에서는 이모양으로 느린지..
디자인타임시에도 1초내로 읽어오는데..,
혹시 주제 넘는 생각인지 모르겠지만 델파이가 ADO를 제어함에 있어서
어떤 문제가 있는 없는것은 아닌지 도저히 감을 못잡겠네요.
--------------------------------------------------------------------------
SELECT case AA.MM
when '035' then '1/4분기'
when '065' then '2/4분기'
when '095' then '3/4분기'
when '125' then '4/4분기'
when '999' then '합 계'
else substring(AA.MM, 1, 2)+'월'
end MM,
sum(AA.TAX_AMT11) AMT11,
sum(AA.TAX_TAX11) TAX11,
sum(AA.TAX_TOT11) TOT11,
sum(AA.TAX_AMT12) AMT12,
sum(AA.TAX_TAX12) TAX12,
sum(AA.TAX_TOT12) TOT12,
sum(AA.TAX_AMT21) AMT21,
sum(AA.TAX_TAX21) TAX21,
sum(AA.TAX_TOT21) TOT21,
sum(AA.TAX_AMT22) AMT22,
sum(AA.TAX_TAX22) TAX22,
sum(AA.TAX_TOT22) TOT22
FROM ( SELECT substring(TAXM_CDATE, 5, 2)+'0' MM,
/*------- 과세 매출 ----------*/
sum(case TAXM_DUTYFREE
when 0 then
case TAXM_GBN
when '0' then TAXM_TAMOUNT
else 0
end
else 0
end) TAX_AMT11,
sum(case TAXM_DUTYFREE
when 0 then
case TAXM_GBN
when '0' then TAXM_TTAX
else 0
end
else 0
end) TAX_TAX11,
sum(case TAXM_DUTYFREE
when 0 then
case TAXM_GBN
when '0' then TAXM_TOTAL
else 0
end
else 0
end) TAX_TOT11,
/*------- 과세 매입 ----------*/
sum(case TAXM_DUTYFREE
when 0 then
case TAXM_GBN
when '1' then TAXM_TAMOUNT
else 0
end
else 0
end) TAX_AMT12,
sum(case TAXM_DUTYFREE
when 0 then
case TAXM_GBN
when '1' then TAXM_TTAX
else 0
end
else 0
end) TAX_TAX12,
sum(case TAXM_DUTYFREE
when 0 then
case TAXM_GBN
when '1' then TAXM_TOTAL
else 0
end
else 0
end) TAX_TOT12,
/*------- 비과세 매출 ----------*/
sum(case TAXM_DUTYFREE
when 1 then
case TAXM_GBN
when '0' then TAXM_TAMOUNT
else 0
end
else 0
end) TAX_AMT21,
sum(case TAXM_DUTYFREE
when 1 then
case TAXM_GBN
when '0' then TAXM_TTAX
else 0
end
else 0
end) TAX_TAX21,
sum(case TAXM_DUTYFREE
when 1 then
case TAXM_GBN
when '0' then TAXM_TOTAL
else 0
end
else 0
end) TAX_TOT21,
/*------- 비과세 매입 ----------*/
sum(case TAXM_DUTYFREE
when 1 then
case TAXM_GBN
when '1' then TAXM_TAMOUNT
else 0
end
else 0
end) TAX_AMT22,
sum(case TAXM_DUTYFREE
when 1 then
case TAXM_GBN
when '1' then TAXM_TTAX
else 0
end
else 0
end) TAX_TAX22,
sum(case TAXM_DUTYFREE
when 1 then
case TAXM_GBN
when '1' then TAXM_TOTAL
else 0
end
else 0
end) TAX_TOT22
FROM BLRM_TAXM
WHERE TAXM_CDATE LIKE '2003%'
GROUP BY substring(TAXM_CDATE, 5, 2)+'0'
UNION ALL
SELECT '035' MM,
/*------- 과세 매출 ----------*/
sum(case TAXM_DUTYFREE
when 0 then
case TAXM_GBN
when '0' then TAXM_TAMOUNT
else 0
end
else 0
end) TAX_AMT11,
sum(case TAXM_DUTYFREE
when 0 then
case TAXM_GBN
when '0' then TAXM_TTAX
else 0
end
else 0
end) TAX_TAX11,
sum(case TAXM_DUTYFREE
when 0 then
case TAXM_GBN
when '0' then TAXM_TOTAL
else 0
end
else 0
end) TAX_TOT11,
/*------- 과세 매입 ----------*/
sum(case TAXM_DUTYFREE
when 0 then
case TAXM_GBN
when '1' then TAXM_TAMOUNT
else 0
end
else 0
end) TAX_AMT12,
sum(case TAXM_DUTYFREE
when 0 then
case TAXM_GBN
when '1' then TAXM_TTAX
else 0
end
else 0
end) TAX_TAX12,
sum(case TAXM_DUTYFREE
when 0 then
case TAXM_GBN
when '1' then TAXM_TOTAL
else 0
end
else 0
end) TAX_TOT12,
/*------- 비과세 매출 ----------*/
sum(case TAXM_DUTYFREE
when 1 then
case TAXM_GBN
when '0' then TAXM_TAMOUNT
else 0
end
else 0
end) TAX_AMT21,
sum(case TAXM_DUTYFREE
바로 TADOQuery.SQL.Add 메소드에 그 원인이 있었습니다..
혹시나 하는 의구심이 들어서 Open 메소드를 사용하기 직전에
showmessage('오픈실행');을 두고 컴파일후 실행한 결과
shoemessage 창이 나올때 까지 무려 22초가 흘러버리더군요..
또 TAdoQuery를 TQuery로 대체한 결과 (동일 메소드 수행) 약 1~2초
그래서 쿼리부분의에 사용했던 SQL.Add 메소드를 제거하구
각각의 문자열 끝에는 cr값을 더해서 1개의 문자열로 만든후에
SQL.Text에 넣고 Open을 실행하니 거의 1초 안에 읽어 오더군요..
아무래도 잘은 모르겠으나, TAdoQuery 의 SQL.Add() 메소드가 문제가 있는거
같습니다. TQuery 의 SQL.Add() 메소드와 처리속도 차이가 너무 나니..
물론 TAdoQuery의 SQL.Append() 도 무척 느리기는 마찬가지 입니다..
TADOQuery사용시 SQL.Add() 메소드의 사용은 피하는것이 좋을둣 합니다.
대신 SQL.Text 프로퍼티에 직접 sql 스트링을 넣는것이 좋을듯 하네요.
일단 TADOQuery.SQL.Add() 메소드가 왜 이렇게 느린지는 저도 원인을 찾고 있는 중 입니다.