Oracle에서 선택 쿼리에 대한 기본 행 순서 지정
Oracle에서 "order by" 절이 지정되지 않은 경우 선택 쿼리의 기본 행 순서는 무엇입니까?
그런가요?
- 행이 삽입된 순서
- 기본 순서는 전혀 없습니다.
- 위의 항목 중 아무 것도 아니다.
Tom Kyte에 따르면 "질문에 "주문 기준"을 추가하지 않는 한 반환되는 행의 순서에 대해 아무 말도 할 수 없습니다.'반환되는 행의 순서에 의존할 수 없습니다'를 제외하면요."
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
'it-source' 카테고리의 다른 글
React-Router : IndexRoute의 목적은 무엇입니까? (0) | 2023.03.02 |
---|---|
Angular에서 체크박스가 켜져 있는지 확인하는 방법 (0) | 2023.03.02 |
AngularJS가 Access-Control-Allow-Origin 헤더를 검출하지 않음 (0) | 2023.02.25 |
Angularjs가 객체를 지시로 전달 (0) | 2023.02.25 |
SQL Plus에서 실행되는 SQL 스크립트에서 앰퍼샌드를 무시하려면 어떻게 해야 합니까? (0) | 2023.02.25 |