최대 절전 모드의 기준 이해#setMaxResults
문서에는 다음과 같은 내용이 있습니다.
Criteria setMaxResults(int maxResults)
>Set a limit upon the number of objects to be retrieved.
예를 들어 다음과 같은 것들이 있습니다.Criteria
:
Criteria criteria = createCriteria(); // creates criteria for MY_TABLE entity
criteria.list().length; // let's say there's a million records in this table
유언추를 추가할 입니다.criteria.setMaxResults(1)
한 행만 반환하시겠습니까?아니면 여전히 100만 줄을 돌려주지만 그 중 하나를 선택할 것인가요?
Oracle DB에 대해 위의 코드 예제와 유사한 쿼리를 실행할 때 다음과 같이 확인되었습니다.... ROWNUM < 2
SQL이 생성되고 있습니다.
하지만 로넘 FAQ를 봤을 때 이해가 안 됐어요.ROWNUM
레코드를 검색하기 전 또는 이후에 적용됩니다.저는 "이전"이 효율적일 것으로 예상하지만 "이후"는 큰 결과 집합이 아닐 것입니다.
Rownum은 데이터베이스에서 레코드를 선택한 후 ORDER BY 절을 실행하기 전에 평가됩니다.
기준을 추가합니다.setMaxResults(1)는 단일 행만 반환합니까?아니면 여전히 100만 줄을 돌려주지만 그 중 하나를 선택할 것인가요?
합니다. 절전 에서는 DB 합니다. 최대 절전 모드에서는 DB 관련 기능을 사용하여 결과를 제한합니다.첫 번째 행을 합니다. (이된 쿼리에 이며, " " " "db"라는 단어가 아닙니다.ROWNUM
).
이름이 붙은 테이블이 있다고 가정해 보겠습니다.user
8개의 행이 있습니다.
+----+-----------+-------+
| id | name | score |
+----+-----------+-------+
| 1 | Xyz | 500 |
| 2 | Name3 | 200 |
| 3 | Name2 | 300 |
| 4 | Name4 | 100 |
| 5 | SomeName | 600 |
| 6 | BSomeName | 150 |
| 7 | Asomename | 80 |
| 8 | Csomename | 700 |
+----+-----------+-------+
이제 다음 기준을 실행합니다.
criteria.add(Restriction.le("score", 500));
criteria.addOrder(Order.asc("name"));
criteria.setMaxResults(2);
최대 절전 모드에서 생성된 다음 쿼리입니다.
select * from(select * from user where score <= 500 order by name) where ROWNUM < 3;
DB는 다음과 같은 순서로 실행합니다.
- 점수가 500보다 작거나 같은 모든 행을 찾습니다.여기서 그것은 6개의 행을 찾을 것입니다.
- 모든 행을 이름별로 오름차순으로 정렬합니다.
- 할당
ROWNUM
행에. - 모찾행다로 모든 행을 .
ROWNUM
3개 미만으로 반품합니다.
결과는 그럴 것입니다.
+----+-----------+-------+
| id | name | score |
+----+-----------+-------+
| 7 | ASomeName | 80 |
| 6 | Bsomename | 150 |
+----+-----------+-------+
DB는 레코드 수에 관계없이 위의 단계를 실행하므로, 사용자가 주문을 받고 조건을 충족하는 행이 많을 때 쿼리 속도가 매우 느려집니다.
저는 Rownum이 레코드를 검색하기 전에 적용되는지, 아니면 그 이후에 적용되는지 이해하지 못했습니다.저는 "이전"이 효율적일 것으로 예상하지만 "이후"는 큰 결과 집합이 아닐 것입니다.
ROWNUMS
주어진 모든 조건을 만족하는 행에 주어진 인덱스입니다.DB는 각 행을 계속 확인하여 WHERE 절에 제공된 모든 조건을 적용하고 모든 조건이 정상이면 해당 행에 번호를 할당한 후 다음 행으로 이동합니다.의 ROWNUM is evaluated AFTER records are selected from the database
모든 조건이 충족됨을 의미합니다.
주문 기준 조항을 실행하기 전에.
ROWNUM
다른 데이터베이스(MySQL, Postgrage 등)의 LIMIT와는 다릅니다.즉, LIMIT는 모든 행을 찾아서 정렬한 다음 제한된 결과를 반환합니다.ROWNUM은 모든 조건을 만족하는 즉시 행에 할당됩니다.따라서 일관된 정렬 결과를 얻기 위해 최대 절전 모드에서 내부 쿼리를 생성합니다.
위의 표에 제시된 것과 동일한 데이터로 다음과 같은 쿼리를 실행하면 됩니다.
select * from user where score <= 500 where row_num < 3 order by name;
당신은 다음과 같은 결과를 얻을 것입니다.
+----+-----------+-------+
| id | name | score |
+----+-----------+-------+
| 3 | Name2 | 300 |
| 2 | Name3 | 200 |
+----+-----------+-------+
이는 DB가 조건(점수 <= 500)을 만족하는 행을 찾기 시작하고 각 행에 ROWNUM < 3까지 ROWNUM 인덱스를 부여한 다음 이름으로 행을 정렬하기 때문입니다.Oracle은 나머지 쿼리를 기반으로 결과 집합의 일부로 행이 식별되는 즉시 로넘 술어를 적용합니다.
이것과 이 기사들을 읽어보세요. 그것들은 정말 상세합니다.
언급URL : https://stackoverflow.com/questions/25252662/understanding-hibernates-criteriasetmaxresults
'source' 카테고리의 다른 글
두 문자열을 연결하기 위해 '+'를 사용하지 않을 이유가 있습니까? (0) | 2023.07.21 |
---|---|
서비스 내에서 여러 서비스 또는 여러 리포지토리를 사용하고 있습니까? (0) | 2023.07.21 |
Oracle 복합 기본 키/외부 키 질문 (0) | 2023.07.21 |
numpy 배열에서 n번째 항목마다 하위 샘플링 (0) | 2023.07.21 |
Oracle에서 마지막으로 실행된 SQL 문을 가져오고 변수 값을 바인딩하는 방법 (0) | 2023.07.21 |