2011-09-08 3 views
0

1kkk 행을 포함하는 테이블의 Java 코드에서 SELECT 쿼리를 수행해야하므로 결과 집합이 1kk 행에 근접합니다. 그게 왜 내가 그것을 제한해야하고, 선택 쿼리를 여러 번 실행하고 매번 10 만 행을 검색 할 때마다. 내가 10k 행을 얻은 후에는 다음 SELECT에서 그것을 갱신 할 것이다. 문제는 - 각 선택 Oracle에서 테이블의 첫 번째 행을보고 있으므로 성능이 저하됩니다. 첫 번째 행에서 오라클을 보지 않고 이미 업데이트 된 행을 전달하는 데 OFFSET을 사용하려면 어떻게해야합니까?ORACLE에서 오프셋이있는 SELECT 쿼리

+0

무엇을하려고합니까? 이 정도의 검색 결과를 사용자가 탐색한다고 상상할 수는 없습니다. 일괄 처리 방식의 프로세스를 상상할 수 없습니다. – Rene

+0

업데이트 결과 집합을 제한해야하는 이유는 무엇입니까? 커밋하기 전에 한 번에 수백만 행에 영향을주는 update 문을 정기적으로 실행했습니다. – Wolf

+0

이미 업데이트 된 행을 식별하고 무시할 수 있습니까? 아마도 업데이트 된 레코드에 대한 배치 번호를 저장하십시오. –

답변

8

이러한 솔루션 중 실제로 성능을 향상시키는 것은 없습니다.

250,000 개의 행으로 구성된 데이터 세트를 가져 와서 10,000 개의 배치로 가져옵니다. 데이터베이스에 대한 상태 기반 연결이없고 해당 SELECT 문이 진행중인 경우 (Oracle 용어에서는 '커서를 열린 상태로 유지') 각 선택 항목이 마지막 항목과 독립적입니다.

따라서 배치를 180,001에서 190,000까지 가져 오려면 배치를 가져 와서 처음 190,000 개의 행을 처리해야합니다. OFFSET과 같은 구문 설탕은 수학과 논리의 기본 규칙을 변경하지 않습니다.

최상의 성능을 얻으려면 결과 집합을 열어두고 행을 계속 가져와야합니다. 그것을 닫지 말고 선택을 다시하지 마십시오.

+0

안녕하세요, Gary. 나는 Java 코드에서 결과 세트를 만들지도 않습니다. 왜냐하면 SELECT 쿼리를 여러 번 사용하여 일렬로 10,000 개의 행을 가져와야하기 때문에 1 백만 개 이상의 행이 포함될 것이기 때문입니다. SELECT의 마지막 시간은 첫 번째 행의 표를 전달합니다. – Demoniac18

+0

Connection.setFetchSize를 사용하면 JBDC 드라이버가 한 번에 가져올 행 수를 지정할 수 있습니다. 모든 것을 RowSet으로 가져 오는 것은 문제를 일으킬 것입니다. 그러나 오라클의 JDBC 드라이버는 필요하지 않은 행을 가져 오지 않을 정도로 똑똑하며 Statement에 대한 한 번의 호출로 4 천만 행의 쿼리 결과를 반복하는 데 문제가 없습니다. query()와 ResultSet.next()에 대한 4 천만 건의 호출 –