Uploaded image for project: 'CUBRID APIs'
  1. CUBRID APIs
  2. APIS-390

수행하지 않는(필요없는) schema_info 요청

    Details

    • Type: Bug
    • Status: Resolved
    • Priority: Critical
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: OLEDB-9.1.0.p1
    • Component/s: OLEDB
    • Labels:
      None
    • Environment:

      Windows XP 32bit

      Description

      • 해당 버그 확인은 현재 상수도연구원에서 핫픽스된 OLEDB Provider에서 발생합니다.
        핫픽스 버전 : oledb-hotfix-for-8.3.1.0173
        CUBRID Engine 버전 : CUBRID 2008 R3.1.0173

      1. unload.zip 파일의 압축을 풀어 water라는 test라는 DB에 Load
      2. 아래 첨부한 nurisystem.zip 파일의 압축을 풀어 Visual Studio 2008을 이용하여 프로젝트 수행
      참고로 수행되는 SQL은 Static 형식이며 다음과 같습니다.

      • select count CNT from wb_data_minute_WW0006 where anal_point_code='111' and anal_instru_code='lt ' and item_code=upper('lt04') and anal_date='20121122142000'
      • select max(anal_date) mdate from wb_currdata where ww_code = 'WW0006' and anal_point_code = '111' and Upper(anal_item_code)=Upper('lt04');
        3. Broker Log를 확인하면 다음과 같은 내용을 확인할 수 있음
        쿼리 수행 후, 해당 테이블에 대하여 schema_info.... 내용을 확인할 수 있음

      11/22 15:25:17.079 (0) check_cas 0
      11/22 15:25:17.080 (0) set_db_parameter isolation_level 2
      11/22 15:25:17.081 (202334) prepare 0
      insert into wb_data_minute_WW0009 (anal_point_code, anal_instru_code, item_code, item_val, item_status, anal_date) values('181', 'rc ', upper('rc01'), 0.420000, 'OK', '20121122152500');
      11/22 15:25:17.083 (202334) prepare srv_h_id 47
      11/22 15:25:17.084 (202334) execute_all srv_h_id 47 insert into wb_data_minute_WW0009 (anal_point_code, anal_instru_code, item_code, item_val, item_status, anal_date) values('181', 'rc ', upper('rc01'), 0.420000, 'OK', '20121122152500');
      11/22 15:25:17.085 (202334) execute_all 0 tuple 1 time 0.001
      11/22 15:25:17.086 (0) end_tran COMMIT
      11/22 15:25:17.110 (0) end_tran 0 time 0.024
      11/22 15:25:17.110 (0) *** elapsed time 0.031

      11/22 15:25:17.111 (202335) prepare 0
      select max(anal_date) mdate from wb_currdata where ww_code = 'WW0009' and anal_point_code = '181' and Upper(anal_item_code)=Upper('rc01');
      11/22 15:25:17.114 (202335) prepare srv_h_id 48 (PC)
      11/22 15:25:17.115 (202335) execute_all srv_h_id 48 select max(anal_date) mdate from wb_currdata where ww_code = 'WW0009' and anal_point_code = '181' and Upper(anal_item_code)=Upper('rc01');
      11/22 15:25:17.116 (202335) execute_all 0 tuple 1 time 0.001
      11/22 15:25:17.132 (202336) schema_info ATTRIBUTE wb_currdata NULL 3
      11/22 15:25:17.176 (202336) schema_info srv_h_id 49
      11/22 15:25:17.192 (202336) fetch srv_h_id 49 cursor_pos 1 fetch_count 100
      11/22 15:25:17.194 (202336) close_req_handle srv_h_id 49
      11/22 15:25:17.195 (0) end_tran COMMIT
      11/22 15:25:17.196 (0) end_tran 0 time 0.001
      11/22 15:25:17.196 (0) *** elapsed time 0.085

      11/22 15:25:17.197 (0) check_cas 0
      11/22 15:25:17.198 (0) set_db_parameter isolation_level 2
      11/22 15:25:17.199 (202337) prepare 0
      update wb_currdata set anal_item_val=0.420000, anal_item_status='OK', anal_date='20121122152500' where ww_code = 'WW0009' and anal_point_code = '181' and Upper(anal_item_code)=Upper('rc01');
      11/22 15:25:17.203 (202337) prepare srv_h_id 49
      11/22 15:25:17.206 (202337) execute_all srv_h_id 49 update wb_currdata set anal_item_val=0.420000, anal_item_status='OK', anal_date='20121122152500' where ww_code = 'WW0009' and anal_point_code = '181' and Upper(anal_item_code)=Upper('rc01');
      11/22 15:25:17.207 (202337) execute_all 0 tuple 1 time 0.001
      11/22 15:25:17.208 (0) end_tran COMMIT
      11/22 15:25:17.230 (0) end_tran 0 time 0.022
      11/22 15:25:17.230 (0) *** elapsed time 0.033

      11/22 15:25:17.242 (202338) prepare 0
      select count CNT from wb_data_minute_WW0009 where anal_point_code='181' and anal_instru_code='cd ' and item_code=upper('cd01') and anal_date='20121122152500'
      11/22 15:25:17.246 (202338) prepare srv_h_id 50 (PC)
      11/22 15:25:17.247 (202338) execute_all srv_h_id 50 select count CNT from wb_data_minute_WW0009 where anal_point_code='181' and anal_instru_code='cd ' and item_code=upper('cd01') and anal_date='20121122152500'
      11/22 15:25:17.247 (202338) execute_all 0 tuple 1 time 0.000
      11/22 15:25:17.250 (202339) schema_info ATTRIBUTE wb_data_minute_ww0009 NULL 3
      11/22 15:25:17.259 (202339) schema_info srv_h_id 51
      11/22 15:25:17.263 (202339) fetch srv_h_id 51 cursor_pos 1 fetch_count 100
      11/22 15:25:17.265 (202339) close_req_handle srv_h_id 51
      11/22 15:25:17.266 (0) end_tran COMMIT
      11/22 15:25:17.266 (0) end_tran 0 time 0.000
      11/22 15:25:17.266 (0) *** elapsed time 0.024

      • schema_info로 인하여 서비스가 불가능한 정도는 아니지만 빈번하게 수행됨으로 인하여 서비스 성능이 저하되고 있습니다.

        Activity

        Hide
        jinhu 李金虎 added a comment -

        Please assign oledb component issues to the person in charge.
        I guess they are cubrid-guy or Ovidiu Guta.
        Thanks!

        Show
        jinhu 李金虎 added a comment - Please assign oledb component issues to the person in charge. I guess they are cubrid-guy or Ovidiu Guta. Thanks!
        Hide
        jinhu 李金虎 added a comment -

        To Yong-mi,Lee:
        Please assign the issuse of OLEDB to the developer of OLEDB directly. Thanks!

        To cubrid-guy:
        I guess you are the developer of OLEDB. So i assign this issue to you. Thanks!

        Show
        jinhu 李金虎 added a comment - To Yong-mi,Lee: Please assign the issuse of OLEDB to the developer of OLEDB directly. Thanks! To cubrid-guy: I guess you are the developer of OLEDB. So i assign this issue to you. Thanks!
        Hide
        xiaoshan78 李成龙[이성룡] added a comment -

        두가지 문제가 엉켜있는데요, 첫번째 문제는 ADO사용법에 대한 문제이고, 두번째 문제는 OLEDB드라이버의 구현방식의 문제입니다.

        1. ADO사용문제
        첨부된 파일을 보면 3rd party library 인 ado2.cpp를 통하여 ADO를 사용하는 경우에 Client-Side cursor 방식을 사용한 것을 알 수 있습니다.
        ado2.cpp:216 행
        m_pRecordset->CursorLocation = adUseClient;

        이 방식으로 사용할 경우에 서버에 테이블 구조, FK, 인덱스정보, 테이블에 있는 row count등 많은 부가적인 정보를 요구하게 됩니다.
        따라서 드라이버에서는 CUBRID서버에 더 많은 네트워크 request를 보내게 되고 성능도 낮아지기 마련입니다.

        ADO의 cursor-location은 default값이 adUseServer 방식이고 이 경우에는 별도로 스키마 정보를 요구하지 않습니다. ado2.cpp 에 있는 adUseClient로 설정하는 부분을 주석처리하여 사용하시면 더 좋은 성능을 확보할 수 있으리라 생각됩니다.
        두가지 방식의 차이점은 아래 문서를 참고하시면 됩니다.
        http://msdn.microsoft.com/en-us/library/aa266531(v=vs.60).aspx

        2. 드라이버 구현문제
        스키마 정보를 가져올 때 테이블의 통계정보의 일부분인 row count를 가져오는데, select count 방식으로 가져오는데는 문제가 있어보입니다. 이 부분은 제거하는 방향으로 수정합니다.

        Show
        xiaoshan78 李成龙[이성룡] added a comment - 두가지 문제가 엉켜있는데요, 첫번째 문제는 ADO사용법에 대한 문제이고, 두번째 문제는 OLEDB드라이버의 구현방식의 문제입니다. 1. ADO사용문제 첨부된 파일을 보면 3rd party library 인 ado2.cpp를 통하여 ADO를 사용하는 경우에 Client-Side cursor 방식을 사용한 것을 알 수 있습니다. ado2.cpp:216 행 m_pRecordset->CursorLocation = adUseClient; 이 방식으로 사용할 경우에 서버에 테이블 구조, FK, 인덱스정보, 테이블에 있는 row count등 많은 부가적인 정보를 요구하게 됩니다. 따라서 드라이버에서는 CUBRID서버에 더 많은 네트워크 request를 보내게 되고 성능도 낮아지기 마련입니다. ADO의 cursor-location은 default값이 adUseServer 방식이고 이 경우에는 별도로 스키마 정보를 요구하지 않습니다. ado2.cpp 에 있는 adUseClient로 설정하는 부분을 주석처리하여 사용하시면 더 좋은 성능을 확보할 수 있으리라 생각됩니다. 두가지 방식의 차이점은 아래 문서를 참고하시면 됩니다. http://msdn.microsoft.com/en-us/library/aa266531(v=vs.60).aspx 2. 드라이버 구현문제 스키마 정보를 가져올 때 테이블의 통계정보의 일부분인 row count를 가져오는데, select count 방식으로 가져오는데는 문제가 있어보입니다. 이 부분은 제거하는 방향으로 수정합니다.
        Hide
        cn15800 谢韦华[Bert] added a comment -

        The issue has been fixed.

        Show
        cn15800 谢韦华[Bert] added a comment - The issue has been fixed.

          People

          • Assignee:
            cn15800 谢韦华[Bert]
            Reporter:
            lym Yong-mi, Lee
          • Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

            • Due:
              Created:
              Updated:
              Resolved: