복붙노트

[SQL] SQL에서 정렬되지 않은 결과

SQL

SQL에서 정렬되지 않은 결과

나는 그것을 읽어하고 다시 SQL은 그 중심에서, 정렬되지 않은 모델이다. 포함 절에 "에 의해 순서"가 아니라면 동일한 SQL 쿼리를 여러 번 실행 수단, 다른 순서로 결과 집합을 반환 할 수있다. 쿼리를 실행의 다른 인스턴스에서 다른 순서로 SQL 쿼리 반환-결과를 설정할 수 있습니다 이유를 누군가가 설명 할 수 있습니까? 그것은 항상 경우가 있지만 확실히 가능하지 않을 수 있습니다.

알고리즘 말하기, 쿼리 계획이 절에는 "에 의해 순서가"이없는 경우 결과 집합의 순서를 결정하는데 아무런 역할을하지 않는다? 나는 쿼리 계획이 어떤 쿼리가있을 때, 어떻게 알고리즘이 항상 같은 순서로 데이터를 반환하지 않습니다 의미?

참고 : 어떤 보장 될 수 없습니다 때문에되는 문제를 이해하려고 노력하고 같이 노 보장은 없습니다 왜 암이 해달라고 부탁에 의해 질서의 사용에 의문을 제기하지.

해결법

  1. ==============================

    1.동일한 실행 계획 반환 다르게 주문 결과가 수있는 몇 가지 SQL 서버 예

    동일한 실행 계획 반환 다르게 주문 결과가 수있는 몇 가지 SQL 서버 예

  2. ==============================

    2.마틴 스미스는 훌륭한 예제를 가지고 있지만, SQL Server를 사용하는 계획을 변경할 때 절대 죽은 간단한 방법은 입증하기 위해 (때문에 ORDER BY없이 쿼리가 다른 계획에 따라 사용됩니다 순서)는 커버 인덱스를 추가하는 것입니다 . 이 간단한 예제를 보자

    마틴 스미스는 훌륭한 예제를 가지고 있지만, SQL Server를 사용하는 계획을 변경할 때 절대 죽은 간단한 방법은 입증하기 위해 (때문에 ORDER BY없이 쿼리가 다른 계획에 따라 사용됩니다 순서)는 커버 인덱스를 추가하는 것입니다 . 이 간단한 예제를 보자

    CREATE TABLE dbo.floob
    (
      blat INT PRIMARY KEY, 
      x VARCHAR(32)
    );
    
    INSERT dbo.floob VALUES(1,'zzz'),(2,'aaa'),(3,'mmm');
    

    이 클러스터 PK로 주문합니다 :

    SELECT x FROM dbo.floob;
    

    결과 :

    x
    ----
    zzz
    aaa
    mmm
    

    자, 위의 쿼리를 충당하기 위해 어떻게 인덱스를 추가 할 수 있습니다.

    CREATE INDEX x ON dbo.floob(x);
    

    인덱스는 우리가 다시 실행 위의 쿼리의 재 컴파일의 원인; 새로운 인덱스에 의해 지금은 주문, 그 인덱스는 SQL Server가 쿼리를 만족하는 결과를 반환 할 수있는보다 효율적인 방법을 제공하기 때문에 :

    SELECT x FROM dbo.floob;
    

    결과 :

    x
    ----
    aaa
    mmm
    zzz
    

    계획을 살펴보십시오 없다 - 둘 다 일종의 연산자를 가지고, 그들은 단지입니다 - 다른 주문 입력없이 - 인덱스의 고유 한 순서에 의존, 그들이 (에 있고 SQL의 저렴한 방법 때문에 전체 인덱스를 스캔 인덱스를 스캔 서버) 순서입니다. (심지어이 간단한 경우에는 물론, 마틴의 대답 요인 중 일부는 다른 순서에 영향을 미칠 수 있지만이 그 요인 중의 부재에서 진정한 보유하고 있습니다.)

    다른 사람이 언급했듯이, ON ORDER를 의지 할 수있는 유일한 방법은 ORDER BY를 지정하는 것입니다. 그 다운 곳을 보냅니다. 이러한 믿음이 휴식 할 수있는 존재 얼마나 많은 시나리오는 중요하지 않습니다; 당신이 게으른 할 수있는 경우에 대한 몇 가지 지침을 찾으려고 및 ORDER BY 절을 사용하지 않는 쓸데없는 단 한 차종이 있다는 사실. 그냥이 항상 또는 항상 같은 순서로 돌아 오지에 데이터를 준비 사용합니다.

    이 일부 관련 생각 :

  3. ==============================

    3.위키 백과에서 인용 :

    위키 백과에서 인용 :

    "로서 SQL은 선언적 프로그래밍 언어, SELECT 쿼리 결과 세트를 지정할 수 있지만, 그것을 계산하는 방법을 지정하지 않습니다. 데이터베이스는에 쿼리를 변환"실행, 데이터베이스 버전 및 데이터베이스 소프트웨어에 따라 다를 수 있습니다 쿼리 계획 ".이 기능을 가 적용되는 제약 조건 내에서 쿼리에 대해 최적의 실행 계획을 찾기위한 책임으로 "쿼리 최적화"라고합니다. "

    테이블 스캔, 인덱스 스캔, 인덱스 추구 등 -이 모든 것은 무엇을 계획으로 쿼리 최적화 픽에 따라 달라집니다

    계획을 따기에 영향을 미칠 수있는 다른 요인은 몇 가지 이름을 스니핑 테이블 / 인덱스 통계 및 매개 변수입니다.

    즉, 순서는 ORDER BY 절없이 보장되지 않습니다.

  4. ==============================

    4.그것의 간단한 : 당신이 필요로하는 경우 데이터가 다음 주문 BY를 사용하여 명령했다. 그것은 어렵지 않다!

    그것의 간단한 : 당신이 필요로하는 경우 데이터가 다음 주문 BY를 사용하여 명령했다. 그것은 어렵지 않다!

    그것은 오늘이나 다음 주 또는 다음 달 당신에게 문제가 발생하지 않을 수도 있지만 언젠가는 것입니다.

    나는 우리가 오라클 10g로 업그레이드 한 후 쿼리 (또는 어쩌면 수백) 수십를 다시 작성하는 데 필요한 프로젝트에 있었어은 쿼리가되지 않았 음을 의미 GROUP BY는 오라클 9i에 미친보다 다른 방식으로 평가되는 원인 반드시 더 이상 그룹화 열을 기준으로 정렬. 아니 재미와 간단 방지 할 수 있습니다.

    당신은 당신이 원하는 어떤 DBMS를 이야기하고 DBMS는 다음을 얻는 방법 작동되도록 SQL은 선언적 언어는 것을 기억하십시오. 그것은 매번 같은 결과를 돌려 보내야하지만 다른 방법으로 각각의 시간을 평가할 수 : 보장이 없다.

    이것은 당신 문제가 발생할 수 있습니다 어디에 그냥 하나의 간단한 예는 테이블에서 선택하면 일부 행을 삭제했기 때문에 그렇지 않은과 DBMS를 채우기로 결정 때까지 새 행이 .... 테이블의 끝에 표시이다 빈 공간이다.

    당신이 ORDER BY를 사용하지 않는 잘못을 갈 수있는 방법의 알 수없는 여러 가지가 있습니다.

    왜 100도 C에서 물을 끓여합니까? 그 방법이기 때문에 그것은 정의입니다.

    왜 결과 순서에 대한 보장은 ORDER BY없이 없다? 그 방법이기 때문에 그것은 정의입니다.

    DBMS에 아마 같은 쿼리 계획을 다음 번 사용하고 쿼리 계획은 아마 같은 순서로 데이터를 반환합니다하지만, 심지어 가까운 보장을 보장하는 것은 아닙니다.

  5. ==============================

    5.당신이 그때까지 주문을 지정하지 않으면 쿼리가 테이블 스캔을했고, 그 결과는 "자연 질서"또는 PK의 순서가 될 것 인덱스를 사용하지 않는 경우 순서는 예를 들어, 사용 계획에 따라 달라집니다. 계획이 COLUMNA을 기반으로 인덱스 A를 사용하는 결정 그러나 경우 다음 순서는 순서에있을 것입니다. 이해가?

    당신이 그때까지 주문을 지정하지 않으면 쿼리가 테이블 스캔을했고, 그 결과는 "자연 질서"또는 PK의 순서가 될 것 인덱스를 사용하지 않는 경우 순서는 예를 들어, 사용 계획에 따라 달라집니다. 계획이 COLUMNA을 기반으로 인덱스 A를 사용하는 결정 그러나 경우 다음 순서는 순서에있을 것입니다. 이해가?

  6. from https://stackoverflow.com/questions/21371176/unordered-results-in-sql by cc-by-sa and MIT license