2009-05-05 2 views

답변

41

아니요, "주문자"를 사용하지 않으면 주문이 보장되지 않습니다. 사실, 한 쿼리에서 다음 쿼리 순서가 동일하다는 보장은 없습니다. SQL은 집합 기반 방식으로 데이터를 처리한다는 점을 기억하십시오. 이제는 하나의 데이터베이스 구현 또는 다른 방식으로 특정 순서로 정렬을 제공 할 수 있지만 결코 의존해서는 안됩니다.

+1

클러스터 된 인덱스 순서로 레코드가 반환 될 가능성이 있습니까? –

+1

아주 좋은 기회 일 수는 있지만 보장 할 수는 없습니다. 조인, 뷰, 하위 쿼리 등의 복잡한 쿼리는 결과 집합을 매우 다르게 정렬 할 수 있습니다. –

+0

그리고 때로는 클러스터 된 인덱스 순서로 반환 될 수 있으며 때로는 반환되지 않을 수도 있습니다. 특정 주문을 원하면 항상 주문을 사용하십시오. – HLGEM

6

내가 선택을 수행 할 때 내 결과가 기본 키에 의해 정렬되는지 또는 '주문'으로 지정해야합니까?

아니, 그것은 멀리 보장하지 않음으로써입니다.

SELECT * 
FROM table 

대부분 기본 키를 사용하지 않는 TABLE SCAN을 사용합니다.

당신은 힌트를 사용할 수 있습니다

SELECT /*+ INDEX(pk_index_name) */ 
     * 
FROM table 

하지만 순서가 보장되지 않으므로이 경우에도 : 당신이 Enterprise Edition 사용하는 경우, 쿼리를 병렬화 할 수있다.

SELECT (
     SELECT column 
     FROM table 
     WHERE rownum = 1 
     ORDER BY 
       other_column 
     ) 
FROM other_table 
+0

문제 없음 : SELECT DISTINCT FIRST_VALUE (열) OVER (ORDER BY other_column) FROM 테이블; –

+0

@Jeffrey : 가능하지만 하위 쿼리는 모든 FIRST_VALUE 및 HASH 고유 항목을 선택합니다. 이것은 하위 쿼리가 많은 행을 반환하는 모든 성능을 저하시킵니다. – Quassnoi

0

그것은 당신의 DB에 의존하고 또한 인덱스 필드에 따라 달라집니다 ORDER BYSELECT 절 하위 쿼리에 사용할 수 없습니다 당신은 다음처럼 작성할 수 없기 때문에

는 문제입니다.

예를 들어, 내 테이블 사용자 모든 사용자는 고유 한 varchar (20) 필드 로그인 및 기본 키 - ID 있습니다.

"사용자 * 선택"은 로그인으로 정렬 된 행 집합을 반환합니다.

0

특정 주문을 원하면 ORDER BY를 사용하여 구체적으로 선언하십시오.

테이블에 기본 키가 없으면 어떻게됩니까?

+0

테이블에 기본 키가 없으면 데이터가 반환되는 순서와 다른 문제가 발생합니다. –

+0

완전히 그렇지만 사람들이 테이블을 잘못 설계하는 것을 막지는 못합니다! – pmcilreavy

0

는 특정 순서로 결과가 항상

2

아니, 주문은 당신이 BY 주문을 사용하지 않는 한 보장되지 않습니다하여 순서를 지정합니다.

행 페치되는 순서는 접속 방식 (예를 들어, 전체 테이블 스캔 인덱스 스캔)에 의존하는, 테이블, 테이블 내의 각 행의 논리적 위치 및 기타 요소의 물리적 특성. 쿼리를 변경하지 않더라도이 값은 모두 변경 될 수 있으므로 결과 집합에서 일관된 순서를 보장하려면 ORDER BY가 필요합니다.

관련 문제