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.