programing

에서 Oracle 쿼리가 느리거나 실패합니다.SQL Developer에서 제공하는 NET 앱은 빠름

stoneblock 2023. 8. 7. 22:18

에서 Oracle 쿼리가 느리거나 실패합니다.SQL Developer에서 제공하는 NET 앱은 빠름

우리는 ODP를 사용합니다.오라클 데이터베이스에 대한 쿼리를 수행하는 NET이며, 일반적으로 정상적으로 작동합니다.그러나 특정 데이터베이스와 해당 데이터베이스의 특정 보기는 에서 쿼리를 완료할 수 없습니다.NET. 예:

SELECT some_varchar_field FROM the_view WHERE ROWNUM < 5;

Oracle SQL 개발자 내에서 이 쿼리를 실행하면 1초 이내에 완료됩니다.만약 내가 우리에게 똑같은 질문을 한다면요.ODP를 사용하는 NET 애플리케이션.NET이 중단되면 "ORA-03135: 연결 끊김" 오류가 발생합니다.몇 행으로 제한하면 FetchSize 문제일 가능성이 없어진다고 생각합니다.

제가 성공적으로 실행할 수 있는 다른 쿼리가 있지만 SQL Developer보다 프로그램에서 더 느립니다.다시 말씀드리지만 SQL Developer는 처음에 50개 행에 대한 데이터만 가져오지만 ROWNUM 조건에서는 이를 제외합니다.

Oracle SQL Developer가 사용하는 연결 또는 명령과 우리 애플리케이션이 사용하는 연결 또는 명령의 속도가 다를 수 있는 차이점은 무엇입니까?

유감스럽게도 서버에 대한 Oracle 쿼리를 실행하는 것 외에는 서버에 액세스할 수 없습니다.

감사해요.

업데이트: Microsoft의 Oracle 공급자에게 동일한 쿼리를 시도해 보았는데 매우 빠르게 실행됩니다.안타깝게도 해당 공급업체는 더 이상 사용되지 않으므로 장기적인 솔루션은 아닙니다.

그것은 ODP와 아무 관련이 없습니다.NET 공급자.문제는 연결을 만드는 데 사용하는 라이브러리(물론 Oracle SQL Developer에서 사용하지 않으며 Microsoft 공급자를 사용할 때도 사용하지 않음)가 어떤 작업을 수행하기 전에 항상 다음 문을 실행한다는 것입니다.

ALTER SESSION SET NLS_COMP = LINGUISTIC
ALTER SESSION SET NLS_SORT = BINARY_CI

이로 인해 Oracle은 대소문자를 구분하지 않습니다.하지만, 그들은 또한 모든 전통적인 지수를 쓸모없게 만듭니다.View에서 쿼리했기 때문에 주문이 내장되어 있었습니다.데이터베이스를 소유하지 않기 때문에 성능 문제를 해결하기 위해 색인을 언어로 만들 수 없습니다.

이 (희귀한) 시나리오에서 이러한 문을 실행하지 않는 방법을 제공하여 문제를 해결했습니다.

즉각적인 생각은

  1. CLOB, BLOB 또는 LONG/LONG RAW는 몇 개의 행에만 많은 대역폭이 필요합니다.
  2. 잘못된 데이터(예: 일부 클라이언트가 혼동할 수 있는 잘못된 날짜를 날짜 필드로 가져오는 방법이 있음)
  3. "the_table"은 실제로는 테이블이 아니라 복잡한 파생이 있는 뷰 또는 뷰이거나 VPD/RLS/FGAC 보안 정책이 있는 뷰입니다.
  4. 이국적인 데이터 유형(공간 또는 사용자 정의).

제안들

  1. 열을 명시적으로 나열합니다(예: _table WHERE ROWNUM < 5에서 a, b, c 선택).작동이 중지될 때까지 열을 하나씩 추가합니다.이는 표에 하나 이상의 '단순' 열이 있다고 가정합니다.
  2. v$session의 세션을 확인하여 Wait EVENT가 무엇인지 확인합니다.DB 서버가 이 SQL에 대한 CPU를 굽거나 무언가(클라이언트일 수 있음)를 기다리고 있습니다.
  3. v$sql의 SQL을 확인합니다.하위 커서가 하나 이상 있습니까?하나 이상의 PLAN_HASH_VALUE가 있습니까? 다른 자식 커서는 다른 계획을 사용할 수 있습니다.ROWNUM 이외의 WHERE 조항이 없다면, 이것은 거의 불가능합니다.

보기는 복잡성의 크기를 다르게 만듭니다."SELECT column from table where rownum < 5"는 아마도 단일 로컬 객체에서 데이터를 선택하는 단일 설명 계획을 가지고 있을 것입니다.

는 보기 인 보의경보텍기스가져것는합시니다작야해으로오기를트우▁getting▁the▁by를 얻는 것으로 시작해야 합니다.SELECT TEXT FROM ALL_VIEWS WHERE VIEW_NAME = ...

ODP 사이에는 많은 차이점이 있습니다.NET 및 SQL 개발자 세션.NLS 매개 변수(예: 날짜 형식)와 문자 집합 설정에 대해 생각합니다.

v$sql에서 SQL을 찾을 수 있는 경우 DBMS_XPLAN을 수행할 수 있습니다.DISPLAY_CURSOR(sql_id): 여러 가지 계획을 살펴보고 문제를 식별할 수 있는지 확인합니다.

제가 전 고용주에서 작업하던 프로젝트에서, 저희는 odp.net 을 사용하여 대규모 소매 시스템 데이터베이스와 대화하다가 연결 끊김 오류가 발생했습니다.

증명하는 데는 많은 노력이 필요했지만, 결국 오라클 데이터베이스 내부의 손상된 인덱스가 되어 우리의 쿼리에 의해서만 타격을 받았습니다.DBA는 결국 쿼리가 실행될 때 Sun 박스에서 실행되는 프로세스의 코어 덤프를 추적했습니다.우리는 어떤 종류의 쿼리 암시 등을 사용하지 않았지만, 우리가 Toad에서 같은 쿼리를 실행했을 때, 그것은 이 특정 인덱스에 맞지 않았습니다. 이상하다고요?<

언급URL : https://stackoverflow.com/questions/3655399/oracle-query-is-slow-or-fails-from-net-app-but-is-fast-from-sql-developer