2013-09-26 2 views
1

오라클의 성능 튜닝에 대한 일반적인 질문이 있습니다. 내가 테스트중인 쿼리가 있습니다. 간단한 예제를 제공하기에는 너무 크고 복잡합니다. 죄송합니다. (나는 그것을 내려했지만 증상을 잃어 버렸습니다.)오라클 쿼리가 두 번째로 느립니다.

처음으로 쿼리를 실행하면 2 초가 걸립니다. 후속 시간은 3, 4 또는 5 초입니다. 일관되게 발생합니다. 간격을 변경하면 다시 2 초가 지나면 다시 올라갑니다.

이것은 내가 기대했던 것의 반대입니다. 처음으로 데이터베이스가 쿼리를 구문 분석 할 필요가 없으며 블록이 버퍼 캐시에 읽혀 있어야합니다. 내가 생각할 수있는 유일한 점은 어딘가에 임시 데이터를 쓰고 있다는 것인데, 단지 읽는 것보다 쓰고 읽는 것이 더 빠릅니다. 그러나 그것은 물론 이치에 맞지 않습니다.

왜 이런 일이 일어나는 지 알고 계십니까? 또는 실행 계획의 어떤 빨간색 깃발이 이와 같은 원인이 될 수 있습니까?

FYI, 이것은 여러 개의 조인, 집계 및 뷰가있는 SELECT입니다. 내부 PL/SQL이 없습니다.

+0

이것은 내가 기대하는 것과는 정반대입니다. Explain 계획 출력이 실행마다 변경됩니까? – Twelfth

+0

나는 당신이해야한다고 생각하지 않는다 [crossposting] (http://dba.stackexchange.com/questions/50594/oracle-query-is-slower-the-second-time) this ... – mustaccio

+0

@mustaccio - 죄송합니다 , 나는 그것이 DB 포럼에 대해 적절하다고 생각했지만 Stackoverflow의 더 많은 질문들이 내 태그와 일치 하는지를 보았고 여기에서 더 나은 행운이있을 것이라고 생각했습니다. 게다가, 당신은 당신이 그것에서 포인트를 얻을 수 있습니다 대답 유일한 사람이야! – orbfish

답변

1

쿼리 때문에 cardinality feedback의 첫 번째 실행 후 다른 실행 계획을 만들 수 있습니다 감사합니다. 12c에서는이 기능의 이름이 statistics feedback으로 바뀌 었습니다.

옵티마이 저는 첫 번째 실행에서 실제 및 예상 행 수에 대한 정보를 사용하고이 정보를 사용하여 두 번째 실행 계획을 향상시킵니다. 내 경험상 이것은 대개 좋은 기능입니다. 그러나 모든 옵티 마이저 기능은 때때로 역화 될 수 있습니다.

카디널리티 피드백을 사용하는 방법을 알려면 최소한 두 가지 방법이 있습니다.

Note 
----- 
    - cardinality feedback used for this statement 

는 또한 문이 쿼리에 표시됩니다 :

select * from v$sql_shared_cursor where use_feedback_stats = 'Y'; 

당신은 모두를 검사 할 수있는 설명 계획에 참고가 될 것입니다. 예제를 만들려고했을 때 쿼리에는 use_feedback_stats = 'Y'이 있었지만 설명 플랜에는 메모가 없었습니다.

+0

이것은 훌륭한 가능성처럼 보입니다. 내가 한번 볼게. – orbfish

+0

나는 결코 재현/테스트 할 수 없었지만 당신의 대답은 좋게 들린다 - 감사합니다! – orbfish