2014-01-29 1 views
-1

끝에 rownum >=15이있는 쿼리가 있습니다.
이 쿼리를 실행하면 결과가 올바르게 표시됩니다. 이는 모든 15 개의 행을 하나씩 표시하고 표시된 행의 순서가 변경되지 않았 음을 의미합니다. 순서대로 표시된 결과의 예 : 1,2,3,
그러나 쿼리에서 rownum >=15을 제거하면 결과가 1,2,3 순서로 표시되지 않고 대신 resuls가 1,3,2 순서로 표시됩니다.
여러분의 의견을 통해이 문제를 해결하는 데 도움이 될 것입니다.Rownum 원인 결과가 undorder 방식으로 결과를 표시합니다.

+7

이 MySQL 또는 Oracle입니까? 이 질문에서 빠져 나가려는 모든 것은 "결과가 정렬되기를 원하면'ORDER BY'를 사용하십시오."그래서 이것이 어디로 향하고 있는지 알 수 있습니다. 그러나 쿼리를 게시하면 누군가가 정확히 지적 할 수 있습니다 - 당신이 필요로하는'ORDER BY' 절. – Avarkx

+1

샘플 데이터와 시도한 쿼리를 게시하면 도움이 될 것입니다. – Sai

+0

쿼리가 너무 커서 내가 게시 할 수 있는지 보겠습니다. – techy360

답변

1

많은 사람들로부터 오랫동안 지속 되어온 질문입니다.

이러한 동작의 원인은 다음과 같이 분석 할 수 있습니다.

데이터베이스가 시리얼 모드이어야합니다.

Oracle 설명서는 말한다 : 두 가지 방법 중 하나를 테이블에

오라클 데이터베이스 데이터를 삽입 :

  • 시리얼 모드 : 기존의 INSERT 작업하는 동안, 데이터베이스의 여유 공간을 재사용 새로 삽입 된 데이터를 기존 데이터와 인터리빙합니다.

  • 병렬 모드 : 직접 경로 INSERT 작업 중에 데이터베이스는 삽입 된 데이터를 테이블의 기존 데이터 뒤에 추가합니다. 기존 데이터의 여유 공간은 재사용되지 않으며 참조 무결성 제약 조건은 무시됩니다. 이러한 절차를 결합하면 성능을 향상시킬 수 있습니다. 통상 모드

다음 레코드

insert into users 
    values(1, 'Elvis'), (2, 'Jackson'), (3, 'Madonna'); 

수도 기억 순서는 다음 결과.
기본 선택 따라서 결과가 동일합니다.

2 Jackson 
1 Elvis 
3 Madonna 

직접 경로 INSERT에서 데이터는 대신 현재 테이블에 할당 된 기존의 공간을 사용하지 않고, 테이블의 끝에 추가된다.

직접 경로 INSERT을 강제로 사용하려면 /*+ APPEND */ 힌트를 사용하십시오.

insert /*+ APPEND */ into users 
    values(1, 'Elvis'), (2, 'Jackson'), (3, 'Madonna'); 

테이블의 끝에 행을 추가합니다.
기본 선택은 삽입 순서대로 의 레코드를 가져옵니다..

1 Elvis 
2 Jackson 
3 Madonna 

는하지만이 직접 경로 모드 말인가하기 전에 추가 된 레코드는 어떻게됩니까? 삽입되는 동안 동일한 위치에 존재합니다. 이러한 문제를 해결하기 위해 우리는 옵션에 순서를 다음 중 하나를 사용해야합니다 :

  • ROWID - 삽입 된 행의 주소 ID를. (제 관찰은 각 테이블마다 항상 순차적입니다.) order by rowid을 사용하십시오. 말하자면, order by user_id
  • INDEX hint - - 적절한 필드에 인덱스를 정의하고 인덱스에 대해 정의 된 순서대로 기록을 가져 오기 위해이 힌트를 사용
  • 필드를 인덱스. 데이터에

, 거기에있는 옵션 없지만 적절한 순서 솔루션을 선택하고 검색 할 수 있습니다.

+0

행이 삽입되는 순서는 쿼리에서 반환해야하는 순서와는 전혀 무관합니다. 이 답변의 유일한 부분은'order by' 절을 추가해야한다는 것입니다. –

+0

OP가 의심스러운 이유는 주문을 사용하지 않으면 삽입 순서대로 반환되지 않습니다. –

+0

그 아이디어를 어디에서 얻을 수 있을지 확실치 않은 OP는 두 가지 질문에 대해서만 물어 보는 중입니다. –

관련 문제