ORDER BY 절이없는 행은 어떤 순서로 페치됩니까?


11

한 프로그래머는 동일한 데이터베이스 구조를 사용하는 동일한 애플리케이션과 동일한 데이터를 두 개의 개별 데이터베이스 (Oracle 8 및 Oracle 9)에서만 테스트하고 비교합니다.

앱은 절 없이 쿼리를 실행합니다 ORDER BY.

그는 ORDER-BY-less 쿼리는 두 데이터베이스에서 동일한 순서로 행을 반환해야한다고 주장합니다.

ORDER BY 절을 명시 적으로 제공하지 않으면 동일한 행 순서에 대해 보증하지 않습니다 .

데이터베이스는 동일한 인덱스와 키를 가지고 있습니다. 그러나 Explain Plan은 데이터베이스 중 하나에서 엔진이 결합 된 테이블 중 하나의 키를 사용하고 다른 데이터베이스에서는 다른 테이블을 사용하고 있음을 보여줍니다.

그는 두 DB 환경이 동일하지 않다고 주장한다. 이는 서로 다른 통계, rdbms 엔진 등이 있지만 원래 데이터베이스에있는 모든 인덱스를 복제하지 못했기 때문이 아니다.

나는 그 ORDER BY명령이 정말로 그렇게 중요하다면 명시 적으로 조항을 제공해야한다고 그에게 말했다 .

질문

그래서 나는 그를 더 잘 설명 할 수 있습니다.

명시 적으로 ORDER BY 절을 제공하지 않을 때 쿼리는 어떤 순서로 행을 가져 오며, 해당 쿼리는 왜 같은 순서로 행을 반환하지 않습니까?


3
정의되지 않았습니다. SQL 사양에 레코드가 반환되는 특정 순서가 있다고 믿지 않으므로 구현에 따라 다릅니다.
— Robert Harvey

1
@RobertHarvey 그것이 바로 내가 말하는 이유입니다. 실제로 : 정의에 따라 관계형 테이블에는 특정 순서가 없어야합니다.
— Tulains Córdova

1
데이터베이스의 정확한 데이터에 대해 수집 한 인덱스 통계를 기반으로 선택성이 더 높기 때문에 동일한 버전의 소프트웨어에서도 다른 인덱스를 사용하는 것이 좋습니다. 당신이 그래서 정말 순서에 의존 할 수 없습니다 당신이 그것을 지정하지 않은 경우.
— psr

인덱싱되지 않은 열의 첫 번째 쿼리가 "삽입 시간"순서를 따르는 것이 현실적으로 가능합니다. 색인화 된 "업데이트 시간" 연속 된 요청은 캐시 된 결과에 의해 "오염 될"수 있으며 따라서 매우 무작위적일 수 있습니다. 그럼에도 불구하고 결코 그것에 의존하지 않습니다-버전, 버전, 매개 변수, 업데이트 작업 및 보름달의 악천후에 따라 버전이 변경 될 수 있습니다. "정의되지 않음"은 정답이며, 그 밖의 다른 것들은 가장 잘 알고있는 추측입니다.
— SF.

1
RDMBS-es가 리턴 한 결과 세트는 다음과 같습니다. sets . 정의에 따라 특정 순서가 없습니다. 따라서 RDBMS는 원하는 순서로이를 리턴하고 다음 쿼리 실행시 순서를 다시 변경할 수 있습니다. ORDER BY 절이없는 특정 주문에 의존하는 것은 실수입니다. 나는 항상 이것을 동료들에게 설명하려고 노력하지만, 절반의 시간 만 남았습니다. : D.
— Radu Murzea

답변:


25

에서 위키 백과 :

ORDER BY 절은 결과 데이터를 정렬하는 데 사용되는 열과 정렬 방향 (옵션이 오름차순 또는 내림차순)을 식별합니다. ORDER BY 절이 없으면 SQL 쿼리에서 반환 된 행 순서가 정의되지 않습니다.

정의되지 않았습니다.

SQL 사양에는 레코드가 반환되는 특정 순서가 명시되어 있지 않으므로 구현에 따라 다릅니다.

테이블에 인덱스가 없으면 적절한 순서는 레코드가 삽입 된 순서입니다. 기본 키가 정의 된 경우 적절한 순서는 기본 키의 순서입니다. 그러나 ANSI 사양에는 특정 주문이 필요하지 않으므로 공급 업체에 따라 다르며 감도는 사용자 또는 사용자와 다를 수 있습니다.

주문서가 사양서에 명시되어 있지 않기 때문에, 벤더마다 다를 수 있으며 벤더는 경고없이 주문을 언제든지 변경할 수 있기 때문에 특정 벤더 구현의 동작에 의존하는 것은 현명하지 않습니다.

말했듯이 ORDER BY순서가 중요한 경우 조항을 포함하십시오 .


쿼리에 여러 개의 조인 된 테이블이 있습니다. 따라서 한 DB 엔진은 결과 집합을 하나의 기준으로 정렬하고 다른 DB는 다른 기준을 사용했습니다. 명백하게, ORDER BY 절이 제공되면 두 쿼리 모두 지정된 순서로 행을 리턴합니다.
— Tulains Córdova

+1 AFAICR 특정 데이터베이스 인스턴스에서 주어진 쿼리를 실행할 때마다 순서가 달라질 수 있습니다.
— MarkJ

2
ORDER BY 절이 없으면 합리적인 결과 순서는 가장 적은 오버 헤드를 만드는 것입니다. 간단한 DB 스토리지 엔진 및 쿼리의 경우 일반적으로 삽입 순서 (및 기본 키 순서와 동일한 생성 된 기본 키)입니다. 그러나 거기에 해시 조인이 생기면 순서가 본질적으로 무작위가 될 것으로 기대합니다.
— Michael Borgwardt

2

사양이 데이터의 순서를 말하지 않았 음을 분명히 지적했지만 작동하지 않았습니다. 아마도 데이터가 디스크 또는 메모리에 있다는 것을 알고 있기 때문에 아마도 순서대로 가지고 있습니다. 여러 테이블에서 계산 된 데이터의 순서는 무엇인지 물어보십시오. 즉, 테이블 4 개를 조인하여 그 중 2 개를 계산하고 계산 된 값만 반환하는 예를 만듭니다.

엔진은 순서대로 데이터를 찾은 순서대로 데이터를 반환하지만이를 찾는 방법은 색인, 통계, 캐시 등 변경 가능한 요소에 따라 다릅니다. 일반적으로 데이터는 일관된 순서로 표시되지만 주문에 의존하는 경우 요청해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.