문제

Oracle은 1000개의 요소로 제한된다는 것을 알고 있습니다. where a in (..) 절.Oracle과 함께 Hibernate를 사용할 때도 이러한 제한이 존재합니까?

도움이 되었습니까?

해결책

이 데이터베이스 제한은 최대 절전 모드에도 여전히 존재합니다.in 절에 실제로 1000개 이상의 항목이 필요한 경우 코드에서 목록을 직접 분할하고 1000개 키의 각 블록에 대해 쿼리를 실행한 다음 결과 집합을 함께 추가해야 합니다.

전체 결과 집합은 코드에서만 알 수 있기 때문에 쿼리가 쿼리 결과를 정렬하거나 집계해야 하는 경우 이 해킹이 중단됩니다.이 경우에는 쿼리를 필요로 하지 않는 쿼리를 작성하는 다른 방법을 찾는 것이 좋습니다. IN 절.

다른 팁

우리는 같은 문제를 겪었고 그것을 100er의 in clause 패키지로 나누어 해결했습니다.

select * from mytable where id in (...) or id in (...).

비고 :

  • 바인드 변수를 사용해야합니다
  • 쿼리가 항상 동일하게 보이도록하십시오. 이것은 100 개의 요소가있을 때까지 절을 -1로 채우는 것으로 이루어집니다.
  • 쿼리가 항상 동일하게 보이도록 항상 같은 수의 Ored (...)를 사용하려고합니다.

위의 포인트를 원하는 이유는 무엇입니까? 쿼리 옵티마이저가 쿼리 계획을 재사용 할 수 있습니다.

추가 최적화 :

  • -1을 사용하는 대신 마지막 진정한 값을 다시 사용할 수 있습니다. 그것은 조금 더 낫습니다.

예 : (1, 2, 3, 4, 4, ..., 4)

참고 : 우리는 IN 절에서 다양한 고정 된 수의 요소로 테스트했으며 100 개 이상의 요소에 대한 성능 감소를 관찰했습니다.

예, 최대 절전 모드가 어떤 단계에서 Oracle을 호출하므로 한도는 최대 절전 모드와 Oracle의 한계 중 가장 낮습니다.

Hibernate는 IN에 대한 데이터에 특별한 것이 없습니다 - 그냥 데이터베이스에 전달합니다.

최대 절전 모드의 버그 인 것 같습니다.

http://opensource.atlassian.com/projects/hibernate/browse/hhh-1123

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top