여러분 모두에게 기본적인 간단한 질문입니다. '선택'은 항상 기본 키순으로 주문합니까?
나는 선택을 할
, 그것은 항상 내 결과는 기본 키에 의해 정렬됩니다 보장, 또는 나는 '로 순서'로 지정해야?나는 내 DB로 Oracle을 사용하고 있습니다.
여러분 모두에게 기본적인 간단한 질문입니다. '선택'은 항상 기본 키순으로 주문합니까?
나는 선택을 할
, 그것은 항상 내 결과는 기본 키에 의해 정렬됩니다 보장, 또는 나는 '로 순서'로 지정해야?나는 내 DB로 Oracle을 사용하고 있습니다.
아니요, "주문자"를 사용하지 않으면 주문이 보장되지 않습니다. 사실, 한 쿼리에서 다음 쿼리 순서가 동일하다는 보장은 없습니다. SQL은 집합 기반 방식으로 데이터를 처리한다는 점을 기억하십시오. 이제는 하나의 데이터베이스 구현 또는 다른 방식으로 특정 순서로 정렬을 제공 할 수 있지만 결코 의존해서는 안됩니다.
내가 선택을 수행 할 때 내 결과가 기본 키에 의해 정렬되는지 또는 '주문'으로 지정해야합니까?
아니, 그것은 멀리 보장하지 않음으로써입니다.
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
문제 없음 : SELECT DISTINCT FIRST_VALUE (열) OVER (ORDER BY other_column) FROM 테이블; –
@Jeffrey : 가능하지만 하위 쿼리는 모든 FIRST_VALUE 및 HASH 고유 항목을 선택합니다. 이것은 하위 쿼리가 많은 행을 반환하는 모든 성능을 저하시킵니다. – Quassnoi
그것은 당신의 DB에 의존하고 또한 인덱스 필드에 따라 달라집니다 ORDER BY
가 SELECT
절 하위 쿼리에 사용할 수 없습니다 당신은 다음처럼 작성할 수 없기 때문에
이
는 문제입니다.예를 들어, 내 테이블 사용자 모든 사용자는 고유 한 varchar (20) 필드 로그인 및 기본 키 - ID 있습니다.
"사용자 * 선택"은 로그인으로 정렬 된 행 집합을 반환합니다.
특정 주문을 원하면 ORDER BY를 사용하여 구체적으로 선언하십시오.
테이블에 기본 키가 없으면 어떻게됩니까?
테이블에 기본 키가 없으면 데이터가 반환되는 순서와 다른 문제가 발생합니다. –
완전히 그렇지만 사람들이 테이블을 잘못 설계하는 것을 막지는 못합니다! – pmcilreavy
는 특정 순서로 결과가 항상
아니, 주문은 당신이 BY 주문을 사용하지 않는 한 보장되지 않습니다하여 순서를 지정합니다.
행 페치되는 순서는 접속 방식 (예를 들어, 전체 테이블 스캔 인덱스 스캔)에 의존하는, 테이블, 테이블 내의 각 행의 논리적 위치 및 기타 요소의 물리적 특성. 쿼리를 변경하지 않더라도이 값은 모두 변경 될 수 있으므로 결과 집합에서 일관된 순서를 보장하려면 ORDER BY가 필요합니다.
클러스터 된 인덱스 순서로 레코드가 반환 될 가능성이 있습니까? –
아주 좋은 기회 일 수는 있지만 보장 할 수는 없습니다. 조인, 뷰, 하위 쿼리 등의 복잡한 쿼리는 결과 집합을 매우 다르게 정렬 할 수 있습니다. –
그리고 때로는 클러스터 된 인덱스 순서로 반환 될 수 있으며 때로는 반환되지 않을 수도 있습니다. 특정 주문을 원하면 항상 주문을 사용하십시오. – HLGEM