복붙노트

[SQL] SELECT 쿼리의 기본 행 순서 - SQL 2012 대 SQL 서버 2008

SQL

SELECT 쿼리의 기본 행 순서 - SQL 2012 대 SQL 서버 2008

우리 팀은 최근에 우리가 절 BY 명시 적 ORDER를 지정하지 않은 경우 SELECT 문에 의해 반환 된 행의 기본 순서, 즉이었다주의 SQL 서버 2012 하나 깨는 변화에 SQL 서버 2008에서 우리의 데이터베이스를 업그레이드했습니다.

MSDN에 따라, SQL 서버 2012 ORDER BY 절을 지정하지 않으면 반환되는 행의 순서를 보장하지 않습니다.

우리는 ORDER BY 절없이 SELECT 문이 5 데이터베이스에서 2500 저장 프로 시저를 가지고 있고 꽤 큰 ORDER BY 절을 추가하는 노력을 수동으로 설정이되어 SQL Server 2008의 동작을 일치하거나 일을 더 빠른 방법이 될 것입니다 이?

탐험되지 않은 다른 옵션은,이 얼마나 어려운 것 SQL 서버 2008로 다운 그레이드하는 것입니다?

해결법

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

    1.당신은 돌아가서 그들없이 순서가 보장되지 않습니다 때문에 코드에 ORDER BY 절을 추가해야합니다. 당신은 당신이 항상 같은 순서를 가지고 있지만, SQL 서버 2008 어쨌든 그것을 보장 때문이 아니라는 것을 과거에 "운"이었다. 그것은 가장 가능성이 인덱스 나 어떻게 데이터가 디스크에 저장되고 있던 함께 할 수 있었다.

    당신은 돌아가서 그들없이 순서가 보장되지 않습니다 때문에 코드에 ORDER BY 절을 추가해야합니다. 당신은 당신이 항상 같은 순서를 가지고 있지만, SQL 서버 2008 어쨌든 그것을 보장 때문이 아니라는 것을 과거에 "운"이었다. 그것은 가장 가능성이 인덱스 나 어떻게 데이터가 디스크에 저장되고 있던 함께 할 수 있었다.

    만약 당신이 하드웨어 구성의 차이를 업그레이드 새로운 호스트로 이동 한 경우 만 쿼리 실행 방법을 변경 할 수 있습니다. 새 서버가 테이블과 SQL 서버 2012 쿼리 최적화 프로그램은 아마 SQL Server 2008의 하나보다 다르게 조금을 수행에 대한 통계를 다시 계산 한 것이라는 사실을 언급 할 필요가 없을 것입니다.

    당신이 명시 적으로 당신이 원하는 순서를 명시하지 않고 SQL의 결과 세트의 순서에 의존 할 수있다. SQL 결과는 ORDER BY 절을 사용하지 않고 의지 할 수있는 순서가 결코 잘못된 생각이다. SQL은 집합 이론을 중심으로 구축되어있다. 쿼리 결과는 기본적으로 세트 (또는 다중 집합)이다.

    Itzik 벤 웨이 코 뮤니시는 그의 책 마이크로 소프트 SQL 서버 2012 T-SQL 기본에 SQL 관련 설정 이론의 좋은 설명을 제공합니다

    정의의 조건에 대한 철저한 설명 후 Itzik는 말에 간다 :

    그러나 관계없이 집합의 학문적 정의의 SQL 서버에서조차 구현은 결과의 순서를 보장하지 않았다. 모든에서 중간 작업의 순서에 의존하지 않도록 쿼리 최적화 팀 상태의 멤버로 2005 년부터이 MSDN 블로그 게시물.

    코너 커닝햄 (건축가, SQL 서버 코어 엔진)의이 블로그 게시물 "아니 안전 벨트 - ORDER BY없이 주문을 기대는"SQL 서버에 관한 2008 년 그는이 단일 인덱스와 그것에 20K 행이있는 테이블이 항상 행을 반환에 나타납니다 같은 순서. 이 최적화가 필요하지 않습니다 실현 경우 차종 쿼리가 더 비싼 하나를 추가처럼되지 않도록 쿼리에 의해 주문을 추가하면 심지어 실행 계획을 변경하지 않습니다. 그는 갑자기 쿼리 계획 변경 테이블에 다른 20K 행을 추가하고 그러나 일단 지금은 병렬 처리를 사용하지 않고 그 결과는 더 이상 주문합니다!

    당신은 더 많은이 글을 읽을 단지 설득해야하는 경우 :

  2. from https://stackoverflow.com/questions/26236352/default-row-order-in-select-query-sql-server-2008-vs-sql-2012 by cc-by-sa and MIT license