david's daily developer note

Oracle .NET DataTableReader vs IDataReader 본문

Develop (kids)

Oracle .NET DataTableReader vs IDataReader

mouse-david 2010. 8. 7. 16:33
728x90
공간질의를 통해서 , 선택된 레코드들의 값을 특정 응용프로그램에서 사용되는 데이터 타입으로 바꾸는 과정에서 , 
선택된 레코드의 필드값을 가져오기 위해, ADO.NET과 ODP.NET에서 
IDataReader와 DataTableReader 두개의 dataRader를 사용할 수 있다.

실험에서 10000,10000,10000(x,y,z)의 공간에 4~20개의 면으로 구성된1000개의 다면체가 있는 데이터 집합을 준비했다.
또한 수행된 질의에서 전체 공간의 20%의 크기에 4~20면체 50개를 질의하였다.

이 실험에서, dataRader는 DB와의 연결상태를 유지하기 때문에, ExecuteReader() 함수 리턴 시간보다.
dataRader.read()를 통한 데이터 접근에서 더 많은 시간을 소요 하였다
그 결과 앞에 설명한 데이터 셋에 대한 질의 수행결과는  122.0625(s)였다.

반면에 하나의 행과 열로 구성된 다수의 레코드들을 메모리 캐쉬형태로 들고 있다는 DataTableReader는
현재 개발중인 프로젝트의 전체 계층관계에 정확히 흡수되지는 못했지만, 수행 결과는  5.53125(s)으로 엄청난 차이를 보였다.

private void FetchDataTableReader() 

  string sql = "SELECT SDO_UTIL.TO_WKTGEOMETRY(boundedBy) as "boundedBy"  FROM RoomType WHERE SDO_ANYINTERACT  (boundary_footprint,sdo_util.from_wktgeometry( 'MULTIPOLYGON (((3364.2 10131.7, 535.8 11303.3, -2292.6 10131.7, -3464.2  7303.3, -2292.6 4474.9, 535.8 3303.3, 3364.2 4474.9, 4535.8 7303.3, 3364.2 10131.7)))'))='TRUE'"; 

  string connectionString ="Data Source=(DESCRIPTION="
            + "(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))"
            + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME= ORCL)));"
            + "User Id=" + user + ";Password=" + passwd + ";"


  OracleDataAdapter data
Adapter = new OracleDataAdapter(sql, connectionString); 
  DataTable dt = new DataTable(); 
  dataAdapter .Fill(dt); 

  DataTableReader reader= dt.CreateDataReader()
  if (reader.HasRows
  { 
    while (reader.Read()
    { 
Console.WriteLine( reader[“boundedBy”].ToString() );

    } 
  } 
  else 
Console.WriteLine("No Data");
}  

MSDN
DataTableReaders는 하나 이상의 DataTable 개체 내용을 앞으로만 이동 가능한 하나 이상의 읽기 전용 결과 집합형식으로 가져옵니다.
IDataReader 는 데이터 소스에서 명령을 실행하여 얻은 결과 집합의 앞으로만 이동 가능한 스트림을 하나 이상 읽을 수 있는 수단을 제공하며, 
관계형 데이터베이스에 액세스하는 .NET Framework 데이터 공급자에 의해 구현됩니다
 

728x90