it-source

Oracle에서 선택 쿼리에 대한 기본 행 순서 지정

criticalcode 2023. 2. 25. 21:22
반응형

Oracle에서 선택 쿼리에 대한 기본 행 순서 지정

Oracle에서 "order by" 절이 지정되지 않은 경우 선택 쿼리의 기본 행 순서는 무엇입니까?

그런가요?

  1. 행이 삽입된 순서
  2. 기본 순서는 전혀 없습니다.
  3. 위의 항목 중 아무 것도 아니다.

Tom Kyte에 따르면 "질문에 "주문 기준"을 추가하지 않는 한 반환되는 행의 순서에 대해 아무 말도 할 수 없습니다.'반환되는 행의 순서에 의존할 수 없습니다'를 제외하면요."

질문은 asktom.com 에서 참조해 주세요.

ROWNUM은 물리적으로 존재하지 않기 때문에 자유로울 수 없습니다.테이블에서 레코드를 가져온 후 ROWNUM이 할당되므로 "WHERE ROWNUM = 5"는 항상 레코드를 선택하지 못합니다.

@ammoQ: GROUP BY 오더에 관한 이 AskTom 기사를 읽어보시기 바랍니다.요컨대:

Query Gaurantee의 Group By 절은 Order By 절이 없는 경우에도 출력 데이터가 Group By 열에 순서대로 정렬되는 것입니까?

그리고 우리는 말했다...

절대로 그렇지 않아요.

결코, 결코, 결코, 결코 그럴 수 없다.

명시적인 디폴트 순서는 없습니다.분명한 이유로 새 테이블을 만들고 몇 개의 행을 삽입한 후 "where" 절 없이 "select *"를 실행하면 삽입된 순서대로 행이 반환됩니다.

단, 디폴트 오더 발생에 의존해서는 안 됩니다.특정 순서가 필요한 경우 "order by" 절을 사용합니다.예를 들어 Oracle 버전 9i보다 이전 버전에서는 "group by"를 수행하면 그룹 식(*)에 따라 행이 정렬됩니다.10g에서는 이 동작이 더 이상 존재하지 않습니다!이 때문에 Oracle 설치를 업그레이드하여 작업을 수행하게 되었습니다.

(*) 면책사항: 이것이 제가 관찰한 동작이지만 보증은 되지 않았습니다.

ORDER BY 절을 지정하지 않으면 Oracle에서 원하는 순서대로 행을 제공할 수 있다고 이미 알려져 있습니다.ORDER BY 절을 지정하지 않은 상태에서 순서를 추측하는 것은 무의미합니다.그리고 당신의 코드로 그것을 믿는 것은 "경력 제한 조치"입니다.

간단한 예:

SQL> create table t as select level id from dual connect by level <= 10
  2  /

Tabel is aangemaakt.

SQL> select id from t
  2  /

        ID
----------
         1
         2
         3
         4
         5
         6
         7
         8
         9
        10

10 rijen zijn geselecteerd.

SQL> delete t where id = 6
  2  /

1 rij is verwijderd.

SQL> insert into t values (6)
  2  /

1 rij is aangemaakt.

SQL> select id from t
  2  /

        ID
----------
         1
         2
         3
         4
         5
         7
         8
         9
        10
         6

10 rijen zijn geselecteerd.

이것은 단순한 삭제+삽입 후에만 가능합니다.그리고 생각할 수 있는 다른 많은 상황들이 있다.병렬 실행, 파티션, 인덱스 구성 표 몇 개를 예로 들 수 있습니다.

결론은 ammoQ에서 이미 잘 설명한 바와 같이 행을 정렬하려면 ORDER BY 절을 사용하십시오.

할 수 .이러한 주문에 대해서는, 「이러다」를 하지 않는 한.order by특히 Oracle에서는 (조인을 하지 않고) 동일한 쿼리를 몇 초 안에 서로 두 번 실행하여 중간에 변경되지 않은 테이블에서 완전히 다른 순서를 반환하는 것을 실제로 보았습니다.이는 결과 집합이 클 때 발생할 가능성이 더 높은 것으로 보입니다.

Rob van Wijk가 언급한 병렬 실행이 이를 설명할 수 있을 것입니다.Oracle의 병렬 실행 사용 문서를 참조하십시오.

인덱스의 영향을 받습니다.인덱스가 있으면 오름차순을 반환하고 인덱스가 없으면 삽입된 순서를 반환합니다.

CREATE TABLE 문의 Organization 절을 사용하여 INSERT를 통해 테이블에 데이터가 저장되는 순서를 수정할 수 있습니다.

그러나 이것은 Rownum(당신의 #2)이 되어야 하지만, 이것은 정말로 보장되지 않으며 100% 신뢰해서는 안 됩니다.

Oracle의 숨겨진 Rownum 속성을 사용하는 것 같습니다.

따라서 나중에 사용할 수 있도록 로넘을 해제한 삭제가 이루어지지 않았다고 가정할 때 1번이 맞을 수 있습니다.

편집: 다른 사람들이 말했듯이, 절대 이것에 의존해서는 안 됩니다.또한 기본 정렬 동작에 영향을 줄 수 있는 여러 가지 조건을 삭제합니다.

언급URL : https://stackoverflow.com/questions/899514/default-row-ordering-for-select-query-in-oracle

반응형