Dapper & Oracle을 사용하는 이상한 SQL 성능 문제

ado.net c# dapper oracle11g

문제

나는 Dapper와 좋은 시간을 보내고 있으며,이 문제에 대한 실질적인 문제가 없으며, 그것은 나를 미치게합니다.

패키지 내부의 오라클 메소드 호출

begin
  package.method(in_table => :in_table,
                 in_clob_type => :in_clob_type,
                 out_error_table => :out_error_table);
end;
  • PL / SQL 개발자 또는 다른 오라클 툴을 사용하는 경우 대략적으로 소요됩니다. 2 초.
  • 표준 C # 콘솔 테스트 응용 프로그램 내에서 약 걸립니다. 2 ~ 3 초.
  • IIS가 호스팅하는 WebAPI 응용 프로그램 내에서 약 걸립니다. 10-12 초.

동일한 SQL, 동일한 매개 변수, 동일한 데이터베이스 및 동일한 사용자 애플리케이션 내의 모든 다른 SQL은 완벽하게 작동합니다.

var errorTable = string.Empty;
var parameters = new DynamicParameters();

parameters.Add("in_table", "table-name");
parameters.Add("in_clob_type", 0);
parameters.Add("out_error_table", dbType: DbType.String, size: 32, direction: ParameterDirection.Output);

db.Query("package.nethod", parameters, commandType: CommandType.StoredProcedure);

// Query or Execute makes no difference
// db.Execute"package.nethod", parameters, commandType: CommandType.StoredProcedure);

errorTable = parameters.Get<string>("out_error_table");

어떤 사람이 이것을 디버깅하는 가장 좋은 방법에 대한 아이디어가 있습니까?

업데이트 1 :

WebAPI와 콘솔 코드는 모두 패키지 함수 내의 삽입 및 업데이트 프로세스를위한 1708 개의 고유 한 SQL 문을 생성합니다. SQL 호출 간에는 시간이 오래 걸리지 만 아직 패턴을 볼 수는 없습니다.

업데이트 2 :

더 깊이 파고 내 코드가 아니기 때문에 좀 더 오래 걸리며 프로세스에 필요한 데이터를로드하는 임시 테이블을 만드는 호출을 발견했습니다. 이 주석을 달고 기존 테이블 이름을 2-3 초 제공하십시오.

테이블을 만드는 과정에서 나머지 프로세스가 차단되는 것 같습니다. PRAGMA AUTONOMOUS_TRANSACTION의 모든 메소드에 10-12 초를 표시하면됩니다. 특정 또는 공유 트랜잭션에서 테이블을 생성하는 경우 10-12 초입니다. 트랜잭션없이 10-12 초 만에 생성하면됩니다.

수락 된 답변

나는 왜 테이블 생성이 프로세스 내에서 어떤 지연을 일으키는 지 알아낼 수 없었습니다. 실제로 테이블의 아주 단순한 특성을 부여 할 수있는 가능한 방법을 보지 못했기 때문에 다른 방향으로갔습니다.

사용자 스키마에 임시 테이블을 만드는 대신 ON COMMIT DELETE ROWS로 표시된 글로벌 임시 테이블로 테이블을 만들었습니다.

이제 모든 것이 예상대로 2 초 이내에 실행됩니다 :-)

모든 도움에 감사 드리며 지연에 대한 아이디어가 있으면 언제든지 공유하십시오.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow