2010-02-09 3 views
3

MS SQL Server와 비교하여 OracleDataReader 개체에서 데이터를 읽는 중 일부 성능이 저하되었습니다. 그것은 거의 10 배 더 느리며 용인 할 수 없습니다.OracleDataReader의 성능이 좋지 않음

다음은 두 테스트에서 사용되는 일부 샘플 테스트 코드입니다. OracleDataReader에서 데이터를 읽는 가장 최적의 방법은 무엇입니까? 아래에 표시된 것보다 더 좋은 방법이 있습니까?

저는 ODP.Net이 SqlClient와 비교할 수 없다고 믿는 데 어려움을 겪고 있습니다.

업데이트 : 텍스트 필드 가져 오기 문제를 좁혔습니다. 어떤 이유로 ODP.Net은 끔찍한 일입니다. 어떤 아이디어로 그것을 고치는 법?

void ReadData(System.Data.IDataReader dr, int maxRows) 
{ 
    ArrayList rows = new ArrayList(maxRows > 0 ? maxRows : 1000); 

    object[] row; 

    int rowsRead = 0; 
    while (dr.Read() && ((maxRows == -1) || (rowsRead++ < maxRows))) 
    { 
     row = new object[dr.FieldCount]; 
     dr.GetValues(row); 

     rows.Add(row); 
    } 
    rows.Clear(); 
} 

주 (들) :

  • FetchSize 실험을 시도,

  • 쿼리 실행 시간이, 여기에 데이터 만 검색 문제없는 큰 차이가 발생하지 않았다 .

  • 두 데이터베이스의 데이터 구조는 동일합니다.

  • 유사한 결과를 얻은 DataAdapter/DataSet 콤보를 시도했습니다.

+1

명백한 질문은 드려 죄송합니다. 그러나 색인이 생성 된 테이블입니까? –

+0

ODP.Net과 SQL을 비교할 수는 없습니다. 하나는 데이터 제공 업체이고, 다른 하나는 DB 서버/엔진입니다. ODP.NET의 최신 버전을 사용하고 있습니까? –

+0

@Brian 두 데이터베이스의 데이터 구조는 동일합니다. 그리고 쿼리 실행 성능은 문제가 아닙니다. 오직 데이터 검색. @ o.k.w 나는 SQL이 아니라 SqlClient라고 말하고자한다. –

답변

3

실제로이 문제는 CLOB 열을 사용하여 nvarchar (MAX) 유형의 문자열 데이터를 저장하는 것으로 추적되었습니다.

오라클은 OCI 소프트웨어가 CLOB를 처리하는 데 문제가 있음을 인정했습니다. 기본적으로 그들은 매우 큰 BLOB를 검색하는 것과 같은 방법으로 CLOB를 검색하려고합니다. 그들은 포인터를 설정하고 페이징을 시도합니다. 물론이 기본 동작은 일반 ~ 200 자의 텍스트 필드에서 성능을 떨어 뜨립니다. 실제로 LOBFetchSize를 -1로 설정하면이 동작을 끌 수 있습니다. 이렇게하면 CLOB의 내용을 한 번의 왕복으로 가져올 수 있습니다. 그렇다면 일들이 시작되고 당신은 아주 좋은 성적을 얻습니다.

비록 우리가 계속해서 문제를 가지고 있지만. 11.2 이전 버전의 OCI 소프트웨어에서 메모리 누수와 메모리 참조 오류를 확인했습니다. 그러나 11.2는 32 비트 및 64 비트 시나리오 모두에서 정상적으로 작동하는 것으로 보입니다.

그래서 LOBFetchSize를 -1로 설정하면 성능 해결사가됩니다.

관련 문제