UNPIVOT이 UNION ALL로 변환되는 것을 어떻게 방지 할 수 있습니까?


13

다소 복잡한 Oracle 쿼리가 있는데 완료하는 데 약 30 분이 걸립니다. 쿼리의 느린 부분을 취하여 별도로 실행하면 몇 초 안에 완료됩니다. 다음은 격리 된 쿼리에 대한 SQL 모니터 보고서의 스크린 샷입니다.

확인 계획

전체 쿼리의 일부로 실행될 때 동일한 논리가 있습니다.

나쁜 계획

색상은 두 스크린 샷의 동일한 표에 해당합니다. 느린 쿼리의 경우 Oracle은 MERGE JOIN에서 동일한 조건을 갖지 않는 두 테이블 간을 수행합니다 JOIN. 그 결과, 약 1 억 5 천만개의 중간 행이 불필요하게 처리된다.

쿼리 힌트 또는 다시 쓰기 로이 문제를 해결할 수는 있지만 가능한 한 많은 근본 원인을 이해하여 나중에이 문제를 피하고 버그 보고서를 Oracle에 제출할 수 있기를 원합니다. 잘못된 계획을 얻을 때마다 UNPIVOT쿼리 텍스트가 UNION ALL계획에서 로 변환됩니다 . 추가 조사를 위해 해당 쿼리 변환이 발생하지 않도록하고 싶습니다. 이 변환의 이름을 찾을 수 없습니다. 또한 쿼리 힌트 또는 밑줄 매개 변수를 찾지 못했습니다. 개발 서버에서 테스트 중이므로 모든 것이 진행됩니다.

의 쿼리 변환을 막기 위해 할 수있는 일 UNPIVOTUNION ALL있습니까? Oracle 12.1.0.2에 있습니다.

IP 이유로 인해 쿼리, 테이블 이름 또는 데이터를 공유 할 수 없습니다. 나는 단순한 생식을 만들 수 없었다. 그렇게 말하면서 왜 질문에 대답하기 위해 정보가 필요한지 불분명합니다. 다음 은 UNION ALL로 구현 된 동일한 쿼리와 함께 UNPIVOT 쿼리의 예입니다.


1
귀하의 예에서는 노조가 모두 존재하므로 표시됩니다. 나는 노조가없는 내 자신의 쿼리를 실행했으며 Explain 계획에 노조가 모두 표시되지 않습니다. 그렇다면 문제를 일으키는 비 피벗 작업이 아닌 쿼리 일 것입니다.
Raj

@Raj 요점은 문제를 더 좁히기 위해 쿼리 텍스트를 변경하지 않고 해당 변환을 비활성화하는 것입니다.
Joe Obbish

3
나는 수년간 Oracle과 협력 해 왔지만 때로는 열 / 테이블을 대체하여 쿼리 또는 호환 가능한 의사 쿼리를 볼 필요가 있습니다. 그것 없이는 계속 추측 할 수 있지만 그것은 당신이나 나에게 유용하지 않습니다.
Raj

답변:


1

다음 Oracle 최적화 힌트를 시도하십시오.

NO_EXPAND

이 힌트는 OR 확장을 비활성화합니다. OR 확장은 where절의 결합 된 OR 조건 또는 IN 목록 을와 함께 복합 쿼리로 변환합니다 union all.

우리는 당신의 SQL을 가지고 있지 않기 때문에 이것은 추측이지만 가능한 옵션으로 보입니다.

두 번째 옵션은 개발 환경에 있으므로 Oracle 옵티 마이저 힌트를 사용해 볼 수 있습니다.

NO_QUERY_TRANSFORMATION

그러나이 힌트 는 최적화 프로그램이 항상 적용 할 수 있는 변환 이외 의 최적화 프로그램 수행 할 수 있는 모든 쿼리 변환을 비활성화 합니다 .


OR은 UNPIVOT과 동일하지 않습니다. UNPIVOT에서 작동하는 NO_EXPAND 힌트를 보여주는 간단한 예제를 만들 수 있습니까? 나는 이것을 시도했지만 그것은 효과가 없었다.
Joe Obbish

@JoeObbish-UNPiVOT과 함께 복잡한 SQL의 축소 버전을 제공 할 수 있습니까? 가능하다면 도와 드리고 싶습니다.
tale852150

1
@JoeObbish-다른 제안으로 답변을 업데이트했습니다. 도움이 되었기를 바랍니다.
tale852150
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.